From 1add8207420e1cfae2d109a72960a791ba12f11d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Jun 2022 08:26:59 +0000 Subject: [PATCH 001/154] Bump firebase-crashlytics-gradle from 2.9.0 to 2.9.1 Bumps firebase-crashlytics-gradle from 2.9.0 to 2.9.1. --- updated-dependencies: - dependency-name: com.google.firebase:firebase-crashlytics-gradle dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2c78775b78..f4ac0a131f 100644 --- a/build.gradle +++ b/build.gradle @@ -50,7 +50,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:7.2.1' classpath 'com.google.gms:google-services:4.3.10' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.0' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 0f92e5409d22324f739c4b68e46e8043ff3f7b7a Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 24 Jun 2022 13:34:11 +0200 Subject: [PATCH 002/154] fix strings %% --- app/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 269dd9a883..cb0b891cfe 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -520,8 +520,8 @@ OpenAPS SMB Dynamic ISF DynISFAdjust - DynamicISF Adjustment Factor %% - Adjustment factor for DynamicISF. Set more than 100%% for more aggressive correction doses, and less than 100%% for less aggressive corrections. + DynamicISF Adjustment Factor % + Adjustment factor for DynamicISF. Set more than 100% for more aggressive correction doses, and less than 100% for less aggressive corrections. use_smb use_uam smb_enable_carbs_suggestions_threshold From 2b610e16e4dfb55be4421ca5b14d732f4e636ab8 Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Fri, 24 Jun 2022 21:47:54 +0100 Subject: [PATCH 003/154] - started changes for rewind/stop --- .../plugins/pump/medtronic/data/MedtronicHistoryData.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt index 752d7e187b..941aee3bb4 100644 --- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt +++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt @@ -796,6 +796,9 @@ class MedtronicHistoryData @Inject constructor( } } + val suspendList = getFilteredItems(newHistory, // + setOf(PumpHistoryEntryType.SuspendPump)) + // see if rewind items, need to fix any of current tempBasalProcessDTO items (bug 1724) if (rewindList.isNotEmpty()) { for (rewindEntry in rewindList) { From 17ca068d36a1c4f15056f83fb7b5242575ae2849 Mon Sep 17 00:00:00 2001 From: Philoul Date: Sat, 25 Jun 2022 00:21:59 +0200 Subject: [PATCH 004/154] AutotuneIob open class for unit test --- .../androidaps/plugins/general/autotune/AutotuneIob.kt | 8 ++++---- .../androidaps/plugins/general/autotune/AutotunePrep.kt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneIob.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneIob.kt index 13079e418c..c12909848c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneIob.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneIob.kt @@ -29,7 +29,7 @@ import kotlin.math.ceil import kotlin.math.roundToInt @Singleton -class AutotuneIob @Inject constructor( +open class AutotuneIob @Inject constructor( private val aapsLogger: AAPSLogger, private val repository: AppRepository, private val profileFunction: ProfileFunction, @@ -41,10 +41,10 @@ class AutotuneIob @Inject constructor( private val nsTreatments = ArrayList() private var dia: Double = Constants.defaultDIA - var boluses: MutableList = ArrayList() + var boluses: ArrayList = ArrayList() var meals = ArrayList() lateinit var glucose: List // newest at index 0 - private lateinit var tempBasals: MutableList + private lateinit var tempBasals: ArrayList var startBG: Long = 0 var endBG: Long = 0 private fun range(): Long = (60 * 60 * 1000L * dia + T.hours(2).msecs()).toLong() @@ -225,7 +225,7 @@ class AutotuneIob @Inject constructor( } } - fun getIOB(time: Long, localInsulin: LocalInsulin): IobTotal { + open fun getIOB(time: Long, localInsulin: LocalInsulin): IobTotal { val bolusIob = getCalculationToTimeTreatments(time, localInsulin).round() return bolusIob } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrep.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrep.kt index 9e0b5d704f..edba396893 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrep.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrep.kt @@ -302,7 +302,7 @@ class AutotunePrep @Inject constructor( // Then, calculate carb absorption for that 5m interval using the deviation. if (mealCOB > 0) { - val ci = Math.max(deviation, sp.getDouble("openapsama_min_5m_carbimpact", 3.0)) + val ci = Math.max(deviation, sp.getDouble(R.string.key_openapsama_min_5m_carbimpact, 3.0)) val absorbed = ci * tunedprofile.ic / sens // Store the COB, and use it as the starting point for the next data point. mealCOB = Math.max(0.0, mealCOB - absorbed) From 8be35e60817f5ad460bd34d714ca6ee5bc63bcca Mon Sep 17 00:00:00 2001 From: Philoul Date: Sat, 25 Jun 2022 00:27:44 +0200 Subject: [PATCH 005/154] Prepare for other unit tests for autotuneCore --- .../plugins/general/autotune/AutotuneCoreTest.kt | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneCoreTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneCoreTest.kt index 81209340e9..fccbc12121 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneCoreTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneCoreTest.kt @@ -30,9 +30,6 @@ class AutotuneCoreTest : TestBaseWithProfile() { @Mock lateinit var injector: HasAndroidInjector @Mock lateinit var activePlugin: ActivePlugin lateinit var autotuneCore: AutotuneCore - lateinit var prep: PreppedGlucose - lateinit var prepjson: String - lateinit var inputProfile: ATProfile var min5mCarbImpact = 0.0 var autotuneMin = 0.0 var autotuneMax = 0.0 @@ -41,14 +38,15 @@ class AutotuneCoreTest : TestBaseWithProfile() { fun initData() { autotuneCore = AutotuneCore(sp,autotuneFS) TimeZone.setDefault(TimeZone.getTimeZone("GMT+2")) - prepjson = File("src/test/res/autotune/test1/autotune.2022-05-21.json").readText() - val inputProfileJson = File("src/test/res/autotune/test1/profile.pump.json").readText() - inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! - prep = PreppedGlucose(JSONObject(prepjson), dateUtil) } @Test fun autotuneCoreTest() { // Test if load from file of OpenAPS categorisation is Ok + val prepjson = File("src/test/res/autotune/test1/autotune.2022-05-21.json").readText() + val inputProfileJson = File("src/test/res/autotune/test1/profile.pump.json").readText() + val inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! + val prep = PreppedGlucose(JSONObject(prepjson), dateUtil) + `when`(sp.getDouble(R.string.key_openapsama_autosens_max, 1.2)).thenReturn(autotuneMax) `when`(sp.getDouble(R.string.key_openapsama_autosens_min, 0.7)).thenReturn(autotuneMin) `when`(sp.getDouble(R.string.key_openapsama_min_5m_carbimpact, 3.0)).thenReturn(min5mCarbImpact) From 25c976ee58311812ced8a35e72d2377df9498630 Mon Sep 17 00:00:00 2001 From: Philoul Date: Sat, 25 Jun 2022 00:37:46 +0200 Subject: [PATCH 006/154] Add Unit Test for AutotunePrep --- .../general/autotune/AutotunePrepTest.kt | 250 +++++++++++++++ .../res/autotune/test1/Convert_Log2JSON.xlsx | Bin 0 -> 65522 bytes .../test1/oaps-iobCalc.2022-05-21.json | 286 ++++++++++++++++++ 3 files changed, 536 insertions(+) create mode 100644 app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt create mode 100644 app/src/test/res/autotune/test1/Convert_Log2JSON.xlsx create mode 100644 app/src/test/res/autotune/test1/oaps-iobCalc.2022-05-21.json diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt new file mode 100644 index 0000000000..74c6ff6e15 --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt @@ -0,0 +1,250 @@ +package info.nightscout.androidaps.plugins.general.autotune + +import dagger.android.HasAndroidInjector +import info.nightscout.androidaps.R +import info.nightscout.androidaps.TestBaseWithProfile +import info.nightscout.androidaps.data.IobTotal +import info.nightscout.androidaps.data.LocalInsulin +import info.nightscout.androidaps.data.ProfileSealed +import info.nightscout.androidaps.data.PureProfile +import info.nightscout.androidaps.database.AppRepository +import info.nightscout.androidaps.database.data.Block +import info.nightscout.androidaps.database.data.TargetBlock +import info.nightscout.androidaps.database.entities.Bolus +import info.nightscout.androidaps.database.entities.Carbs +import info.nightscout.androidaps.database.entities.GlucoseValue +import info.nightscout.androidaps.interfaces.* +import info.nightscout.androidaps.plugins.general.autotune.data.* +import info.nightscout.androidaps.utils.DateUtil +import info.nightscout.androidaps.utils.JsonHelper +import info.nightscout.androidaps.utils.T +import info.nightscout.shared.logging.AAPSLogger +import info.nightscout.shared.sharedPreferences.SP +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert +import org.junit.Before +import org.junit.Test +import org.mockito.Mock +import org.mockito.Mockito.`when` +import java.io.File +import java.util.* +import kotlin.collections.ArrayList + +class AutotunePrepTest : TestBaseWithProfile() { + @Mock lateinit var sp: SP + @Mock lateinit var autotuneFS: AutotuneFS + @Mock lateinit var injector: HasAndroidInjector + @Mock lateinit var activePlugin: ActivePlugin + @Mock lateinit var repository: AppRepository + lateinit var autotunePrep: AutotunePrep + lateinit var autotuneIob: TestAutotuneIob + lateinit var inputProfile: ATProfile + var min5mCarbImpact = 0.0 + var autotuneMin = 0.0 + var autotuneMax = 0.0 + var startDayTime = 0L + + + @Before + fun initData() { + TimeZone.setDefault(TimeZone.getTimeZone("GMT+2")) + val inputProfileJson = File("src/test/res/autotune/test1/profile.pump.json").readText() + inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! + val inputIobJson = File("src/test/res/autotune/test1/oaps-iobCalc.2022-05-21.json").readText() //json files build with iob/activity calculated by OAPS + val iobOapsCalcul = buildIobOaps(JSONArray(inputIobJson)) + autotuneIob = TestAutotuneIob(aapsLogger, repository, profileFunction, sp, dateUtil, activePlugin, autotuneFS, iobOapsCalcul) + autotunePrep = AutotunePrep(sp, dateUtil, autotuneFS, autotuneIob) + } + + @Test + fun autotunePrepTest() { // Test if load from file of OpenAPS categorisation is Ok + val prepjson = File("src/test/res/autotune/test1/autotune.2022-05-21.json").readText() + val oapsPreppedGlucose = PreppedGlucose(JSONObject(prepjson), dateUtil) //prep data calculated by OpenAPS autotune + val oapsEntriesJson = File("src/test/res/autotune/test1/aaps-entries.2022-05-21.json").readText() + autotuneIob.glucose = buildGlucose(JSONArray(oapsEntriesJson)) + val oapsTreatmentsJson = File("src/test/res/autotune/test1/aaps-treatments.2022-05-21.json").readText() + autotuneIob.meals = buildMeals(JSONArray(oapsTreatmentsJson)) //Only meals is used in unit test, Insulin only used for iob calculation + autotuneIob.boluses = buildBoluses(oapsPreppedGlucose) //Values from oapsPrepData because linked to iob calculation method for TBR + `when`(sp.getDouble(R.string.key_openapsama_min_5m_carbimpact, 3.0)).thenReturn(min5mCarbImpact) + + val aapsPreppedGlucose = autotunePrep.categorizeBGDatums(inputProfile, inputProfile.localInsulin, false) + try { + aapsPreppedGlucose?.let { // compare all categorization calculated by aaps plugin (aapsPreppedGlucose) with categorization calculated by OpenAPS (oapsPreppedGlucose) + for (i in aapsPreppedGlucose.crData.indices) + Assert.assertTrue(oapsPreppedGlucose.crData[i].equals(aapsPreppedGlucose.crData[i])) + for (i in aapsPreppedGlucose.csfGlucoseData.indices) + Assert.assertTrue(oapsPreppedGlucose.csfGlucoseData[i].equals(aapsPreppedGlucose.csfGlucoseData[i])) + for (i in aapsPreppedGlucose.isfGlucoseData.indices) + Assert.assertTrue(oapsPreppedGlucose.isfGlucoseData[i].equals(aapsPreppedGlucose.isfGlucoseData[i])) + for (i in aapsPreppedGlucose.basalGlucoseData.indices) + Assert.assertTrue(oapsPreppedGlucose.basalGlucoseData[i].equals(aapsPreppedGlucose.basalGlucoseData[i])) + } + ?: Assert.fail() + } catch (e: Exception) { + Assert.fail() + } + } + + + + /** + * OpenAPS profile for Autotune only have one ISF value and one IC value + */ + fun atProfileFromOapsJson(jsonObject: JSONObject, dateUtil: DateUtil, defaultUnits: String? = null): ATProfile? { + try { + min5mCarbImpact = JsonHelper.safeGetDoubleAllowNull(jsonObject, "min_5m_carbimpact") ?: return null + autotuneMin = JsonHelper.safeGetDoubleAllowNull(jsonObject, "autosens_min") ?: return null + autotuneMax = JsonHelper.safeGetDoubleAllowNull(jsonObject, "autosens_max") ?: return null + val txtUnits = JsonHelper.safeGetStringAllowNull(jsonObject, "units", defaultUnits) ?: return null + val units = GlucoseUnit.fromText(txtUnits) + val dia = JsonHelper.safeGetDoubleAllowNull(jsonObject, "dia") ?: return null + val peak = JsonHelper.safeGetIntAllowNull(jsonObject, "insulinPeakTime") ?: return null + val localInsulin = LocalInsulin("insulin", peak, dia) + val timezone = TimeZone.getTimeZone(JsonHelper.safeGetString(jsonObject, "timezone", "UTC")) + val isfJson = jsonObject.getJSONObject("isfProfile") + val isfBlocks = ArrayList(1).also { + val isfJsonArray = isfJson.getJSONArray("sensitivities") + val value = isfJsonArray.getJSONObject(0).getDouble("sensitivity") + it.add(0,Block((T.hours(24).secs()) * 1000L, value)) + } + val icBlocks = ArrayList(1).also { + val value = jsonObject.getDouble("carb_ratio") + it.add(0,Block((T.hours(24).secs()) * 1000L, value)) + } + val basalBlocks = blockFromJsonArray(jsonObject.getJSONArray("basalprofile"), dateUtil) + ?: return null + val targetBlocks = ArrayList(1).also { + it.add(0, TargetBlock((T.hours(24).secs()) * 1000L, 100.0, 100.0)) + } + + val pure = PureProfile( + jsonObject = jsonObject, + basalBlocks = basalBlocks, + isfBlocks = isfBlocks, + icBlocks = icBlocks, + targetBlocks = targetBlocks, + glucoseUnit = units, + timeZone = timezone, + dia = dia + ) + return ATProfile(ProfileSealed.Pure(pure), localInsulin, profileInjector).also { it.dateUtil = dateUtil} + } catch (ignored: Exception) { + return null + } + } + + + fun blockFromJsonArray(jsonArray: JSONArray?, dateUtil: DateUtil): List? { + val size = jsonArray?.length() ?: return null + val ret = ArrayList(size) + try { + for (index in 0 until jsonArray.length() - 1) { + val o = jsonArray.getJSONObject(index) + val tas = o.getInt("minutes") * 60 + val next = jsonArray.getJSONObject(index + 1) + val nextTas = next.getInt("minutes") * 60 + val value = o.getDouble("rate") + if (tas % 3600 != 0) return null + if (nextTas % 3600 != 0) return null + ret.add(index, Block((nextTas - tas) * 1000L, value)) + } + val last: JSONObject = jsonArray.getJSONObject(jsonArray.length() - 1) + val lastTas = last.getInt("minutes") * 60 + val value = last.getDouble("rate") + ret.add(jsonArray.length() - 1, Block((T.hours(24).secs() - lastTas) * 1000L, value)) + } catch (e: Exception) { + return null + } + return ret + } + + fun buildBoluses(preppedGlucose: PreppedGlucose): ArrayList { //if categorization is correct then I return for dose function the crInsulin calculated in Oaps + val boluses: ArrayList = ArrayList() + try { + for (i in preppedGlucose.crData.indices) { + boluses.add( + Bolus( + timestamp = preppedGlucose.crData[i].crEndTime, + amount = preppedGlucose.crData[i].crInsulin, + type = Bolus.Type.NORMAL + ) + ) + } + } catch (e: Exception) { } + return boluses + } + + fun buildMeals(jsonArray: JSONArray): ArrayList { + val list: ArrayList = ArrayList() + try { + for (index in 0 until jsonArray.length()) { + val json = jsonArray.getJSONObject(index) + val value = JsonHelper.safeGetDouble(json, "carbs", 0.0) + val timestamp = JsonHelper.safeGetLong(json, "date") + if (value > 0.0 && timestamp > startDayTime) { + list.add(Carbs(timestamp=timestamp, amount = value, duration = 0)) + } + } + } catch (e: Exception) { } + return list + } + + fun buildGlucose(jsonArray: JSONArray): List { + val list: ArrayList = ArrayList() + try { + for (index in 0 until jsonArray.length()) { + val json = jsonArray.getJSONObject(index) + val value = JsonHelper.safeGetDouble(json, "sgv") + val timestamp = JsonHelper.safeGetLong(json, "date") + list.add(GlucoseValue(raw = value, noise = 0.0, value = value, timestamp = timestamp, sourceSensor = GlucoseValue.SourceSensor.UNKNOWN, trendArrow = GlucoseValue.TrendArrow.FLAT)) + } + } catch (e: Exception) { } + if (list.size > 0) + startDayTime = list[list.size-1].timestamp + return list + } + + fun buildIobOaps(jsonArray: JSONArray): ArrayList { //if categorization is correct then I return for dose function the crInsulin calculated in Oaps + val list: ArrayList = ArrayList() + for (index in 0 until jsonArray.length()) { + val json = jsonArray.getJSONObject(index) + val time = JsonHelper.safeGetLong(json,"date") + val iob = JsonHelper.safeGetDouble(json, "iob") + val activity = JsonHelper.safeGetDouble(json, "activity") + val iobTotal = IobTotal(time) + iobTotal.iob = iob + iobTotal.activity = activity + list.add(iobTotal) + } + return list + } + + class TestAutotuneIob( + val aapsLogger: AAPSLogger, + repository: AppRepository, + val profileFunction: ProfileFunction, + val sp: SP, + val dateUtil: DateUtil, + val activePlugin: ActivePlugin, + autotuneFS: AutotuneFS, + val iobOapsCalcul: ArrayList + ) : AutotuneIob( + aapsLogger, + repository, + profileFunction, + sp, + dateUtil, + activePlugin, + autotuneFS + ) { + override fun getIOB(time: Long, localInsulin: LocalInsulin): IobTotal { + var bolusIob = IobTotal(time) + iobOapsCalcul.forEach { + if (it.time == time) + return it + } + return bolusIob + } + } +} diff --git a/app/src/test/res/autotune/test1/Convert_Log2JSON.xlsx b/app/src/test/res/autotune/test1/Convert_Log2JSON.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5f4d84fff9958b0ed283cd4c4661e1641aa9d54d GIT binary patch literal 65522 zcmeFXRa9JUmoAFCyM_dJilD*W3xX8x2?Tfd;2Oi-t?;11o#5`lf?Ejga2Cne-G7h$ zpPPNLZ@Rf)3_@kreCK2HUDRtucmx6%Bp4JJ7?>9@p$lj3;jl0;aY!&Q_%JANdXn~b zE@pNvMjDLG%>6Km>loci40l6XvPUsrP+; zpA-e&z?(YFgyzeCf0eq}c3Cs|;wyU3`_`J8{%dxIG>-Lsv-Pitv^5=xrrH=%NQTI7 zd?AsuiMMxZZ{-HaHv_}eN@04=H_qPPeT@tt)$(SQ1`|}|Nf}7yR-)hvRVYbX5gfmR zzSZz5VE&Zbu`02*iYl}@Wg6apMO0w*i?K=X-P91ZlQL*mc*Wb(1P$@2G?p+`bW(*kC7M=yq#C6Wkl#c%2gtX0Pu_uE{K){b~{4-C6#&@Jy> z+l5`DA0j@SicW|NIX`dOKKhs!^vVH7js@A{ZN2rF**-@1*L$usc5*1$`Atf4O)oT_wbTBhs*TB|6}!9$h7VMDvp9aSJu0fV{A%oh3mZ*#`;}t)*ofBagheRMXkpqOVa=WQ}omG^X5? zDg@}q2Tu8)L8=2L7UQv`MP@(ZHibjmp1o!hn(nYdLH0(5irffYf34>R+k0?q`I;sw zM~h|P3l6$%N}8h=k1iIaNDRsc5uT<^;`ZNCzk$!7U(i=Md#vMkq*ja=lUqF%T8VTP z+uwiBo@r5h)iNUVvoLrK{PxPEqX%2V=-;a3>>OE;9Edp`1Q-}H7!+6!8;-w1akqD} zHnq36ehRw(5DhGlcED@@XMZ)vjVg45aC(mdk8rl^Cf!^K=UuQPE42)$p65*#*rdiO z-A&f>5y-Q#o~vEpC6S)^wkf@wKWuAC@Xg8XC4<%Z0wLep>=8qjV=AWZP~c_ zs{)CD3+%>-*dX~0){Ww3^{%b13@Wo$4WXhW^Y0Dx*Kwzg*$FCg;qijyl=dmL`67mK zCp2`Q0#c~klOOC=0&&(Ne6B#n{U|ElJ!LO@LYH*V37W?nas!i0Oqg768IT~RG;%3& zbo?koTMy$^GW4nC?p3^~w_dmfjq-o{_=0NIgUaXP1%c?lrIx-F>`)#+mvg{?v4K|r z)cRLaMXPn#tv|px}{YP6`CO^(S#yTLfn=5MgLC?~~zzTm`rEkR@)&o^z)h)9O^pFiNUmC|-(E z)Il{+t@VD9gVv;eibVyS_?GFaL_zYoh0+D6b8P)1kX)&_>2$Att3zR47CI~0B0o|z z_Kk(G#krOhqn=kq)Y4^}vE_2|ApayyF}@DizV zt&hn6-vSDYr8$-atiwg*Pb={sKwT`%Y|S|SeCK>}iUS=Ldva-lHkxBf8E<=AhB|Ut zSLj?7xy7VRmEP34hwyT`m)koYF6BLPtB-PW;eid$9pO=7<8>nxUmdH$Nx#nXLtGv@ zD0lzKBd>q}w)fh;LhAKX<0zf=KMbG1;wtp=idy=l#RY zm!UG{!byw#ui80CZ>jbbuVSpKTU)kPF~9#LSG@9i*R*IW-~s>jY74K`KYzNk$papZ zG^S9|;&9AQG(SUo_O`_SAABX&$nL%Ewkdgx(Gsq&1&*dJ0wi zJTEqS-cdc=oUh|u)wSnR`^eEykFz-iV|gGnl6EzGiT%vK5@`}%Tn!f{))efb5`y)6 zhNAkVepo|q6HAsy9BjqtFTt-^5}fKa!KX1GrvUG?YAoV>q=sxyLRO))9`RSsoGd@F zKq9Q`OFdQV3(KtUp~;B(Z*J}6C^#=kKM-QcDG^LK`zXjoxLq>39yH4OcF<)qx_r#R zD#)iNo%oC|7bV@q4c9g_=z^prSU2AkC6E?x*&>N$Kue1N@BHu`)tGbM&FOaG{j5<=?UY_5wAF? z-LGoMe=;(4VOdZRRULh23TBkK)sOGEY)E}^LwOgl9{;OVF=GAKBzgxW89y}}oYd%$ zR0Kx_{;%#M;}QC#BxZQJrQ#{vn8#8ZE;QFgClB?y#bsU_Q?veR?;P!l&U5-v*((|rN1{gATAL?5vzyXPq0D9Ec#GDlBZ9i~9x9A);CbF{6mYlH2V+|N z2orA^NfVIw!%>v*m`cXLpwNF_sS|{tb)-s&C6Ok!VtC5^S*#!rJ_3(@t=S?}(b8Jz z>|r2-m;8pplqIa&>f^`5-;K{kK9Ij6rGXfa)R5-7f>%q2W`OI8c>S!2=A=Y=vfgmG zd1Ou(o0d-MT-spA#y2Zak{-SQIl?`T_BYgRzhSZw!KBYsbxr50TSV(2Q7)e`j+634 zCcHRqi_FvFdIr8w>td5*+#GmBPNV(MO*t@Hbt7URoS)XJ9BjVSYL1is-Ki*c_*UR+ zLsA;6jI3?Nw6?X!_dfZ>)OJ2O?3OZmpwmdi#iU& zYHz=EDpSe@YY1wG@^TMpkioIeq?O)TV}kajnO>{KjL`SoAR%;#(j(4|yRs!Kg;zw5 zut!@g&d=7wog`D6;(Yix7Czh!i*&jF8qv2`qcbL~807}Be7mN0I8HBZGLOYDk~EF7 zj}_HX*UmN4JlSTg;Q8jur20UQEWP3bnQx~hrfLs?8cdopDbujH^l(&dojRE{O=o@uPT4GRzP` zEH;Q`+=oW$!OnKIb*5~V%`@MF;W^l?F@iiLLKbiJt`wjls5!neM zkiLX}ko545oe9B^ROh2^fNaB?-Yg(3CVsjkxc9E6Fl*o3bQs;_O}!N=CO60W%sSNw z7qan&*rM{c_X1m+coqNN4+2y+p-(20?5!#A%E}56eV?=m(W^pKY41t8{JQ6>KA;wV z64{!UkMIQbUq_LTl|rp-PmGXjIFxITST}sNf&_%sbRG^q_)-bk<+hE;os0&{zxre> zk|X!(yY%5nfT{St`$dMeFBU?9?a<)q1?s=M97hpj)*1q*w+D7JlK*1@f6o5$DbJ(7 zfK`ASQs|M~T^Qpf4<*Q0eG!!td=Lc8)454)=w_++&j;=+iSw?56U6<|bH0o?`oI%qpawDRkeDN$g zZ_eMsl~^VPlDJxWwrIeoYS9$VSUY|uDE6w_s>+hWODBc@(!`5l`unqP(q*enPGhiq zcf_0AZLZNCeJQoi5CP?}igeE+=Lhc1obREVK9+M~{+#>n2Gn-9-30@l3yG1{3+I*l ze4`4atE9vAp6heiv-JLindrm zt?u_um%8ku8bYEfoa>ISj@P?xZ%g_v{U3cE7uA1!pS@LaSIK)^tiU#E-7NF<6Mg5L zdDQxFcw}VQ>VJ0^!h1Z}RTx(29}>epBGT5@aKCT=(dfwUTI%+Gw6V!Mv!3!n*7o7F z>$c+K$}>?BHcRJ+$&fr>*aC`FuH1#qu46*A55v z<>M9a&F#VNuSC%$|3?2um&f;5Q$M4z+c`dd^j~k+yD7@C^+Shk9&Wl+!CpDyI1=^s zYVnXAUwJV4e)8+nCPe;pYrAXZ)ut=I-Q)KDJcs+rFAgfv`;{qOgbl#%a!Z!WBEZ29gl%x?~@ZVnI67SGQXABFGT`0f+FQ4}x4 z*&B_I#0gWAjXgW=GjSgzf=-AWIIoN?`}v#}-Y<$8VvQ2j`|og!5N+G1ZgW@=i#W-a z24@UfM%DYEsR}oslo`$xPwSqI5;B=!su)SOuB;dedoQM44quy{eznio)*mdu-@V{m zGCR!~SzHcZZpmO4X!4G1`o!Cq@3s!_37>zEdb+>0*(z6@0BOQ!3rpJJu=l^*zOSx9 zpB;|+)$I9j*XL#cdB-ubk(l~>v(f8CTM^3xy=AG^qMcy8C;3MMa*NX0lDdUM#v*7p zt`FZ*dQaOZQB+u;5m8iBb#>1?wtHsVor~Lao+#1wnQf7m%XfZS*&j;OB0q$eKDM>6 ztvqb|e5O@@rYxzW=`&@~W!6OeuIh59x-vhiI^y9mEm1ffq!f?AIYgyGN)(pAEpkKh z`{w-D{(YD<1~Xtt5mZqP9J%*4F~%vQnAGb=7-UMi*LS2V}2APF!>kI zmWBaxh9NkEL(i2AqdJaTUS|n|7Hfs05H638J--&Ce3zd|>(`B32h}?)8R~Ddxr8l& z3$;GyDRcOX+Al<uqcPa4pJ;cy|8y^@!%2|_DJ38CvBBt zcz0#$LkNhtOw&!f7oNIS)A2YJ!CS)-wsrlHC%sjJ)~;eVh)P8Go|}6c zOspV#wbwj=oT5U4R?vMDd?|Qk;C;;gZiRh$)obio8FDNN1bd)fMtF_~`fThtZ6@fe zx2EupgYfFd!gH}S+!g`WDul5ERE&3^hOOe6OFk=t+#gpITNq%QDK_`7OV8*n-!zkr z7&{OL)#u!-G(>hrpWc#-q+*?hzUDzndP^BQwXclTRbMr0QUbOk{FGlnrlYmVTPKRa zn2pRMM&6?`WOgh$smGo1yHDM(TdAV3kz2S-*w47K2YWN4W7LbrT*W)7`zJEeJHPHZ z&vj<9<7&dwudwD!Ft!>!(Muxm&#j=aPG)ccMd&pxZ#0S{Wg#{o|@6^)-lk^3W^Gp z3k1rE3-W~Kza;fkp;TE7SILyfQ+us@ZoiQeYmjawSBZ%jc_w32#V-XZRC)uszMf zsUAEAK9X?WEHT}+uMU0WuhRk!Ct8-~bYSuY;}c`nEQlYTmcPM~Fa~BJJk};a2Te>6 z@%6z4DU7N*<|h_>7%77y)P+()an59EoW*&R?BCaMFF3m|37jNwJI9Hn)BKQRrWHO_ z^;xohaHv82!eJ#fp^#<=KN73D!2IScL4BObCoMm8!79NgABKKU4s%k$ATHmAUg_;S z$)u}OCZ(T|x!B70-P@<-gAO&Q>Q3{yqLd8^hCg=(T6OH|I<4o{x#^XBs>KfjQDa%G z5Y$-)@iZaEy2XuBnC6{Qwy;X&YKZDPa+vBR%)bkcqCYAMD3Knav9wf;)V`!pWvz5m6P$)sy3LP!BgrIWDVmswRVkAlJWh|YW zBCg`Nbb2N22R)-M*rifMkU%vpb1$Lot%m_Lu}Kr0Y@C7-8{XR6^vMK|VKj!r3Sm-V zh#fhtuzhM*mHk5WM{-2elA0b&?4mDP!PsZ3IBTr|Nric(lsN%uZfQkViCB^dFI^X> z0Y>CpaEiVYdd7jgenOs{VnT-H00?19O)ePIJb~WA(%ISj3yek1 zhbit_{R;XFw|(ygp2ec@0*eY|3%v8(!n(pSgr{mjbz@Uy-HwZIRO!L5)UQ!W+b2W}FI|`f^?>Dg2KZDFT~1Ke>s({0lk#!~huh zQ&{{e1;ut#(-eg%kYvp%&B+axzvC0&?O~_|#%Gzc7i6X0m5H7rHGRa?n=N1I9+Arh zc8XiSfFw%=2aeX;_E zSJ)O#@o*_cG(6zi6C^d>SbAQ)j^^SBdK-zfqU`NA-P}2aN$M7XvO&jNzVy?+|LZt(}J*bMkY>+!6TY_N%R1`>%K=0L{_Q_6iSmT5}fsE0^U(>^Y4gA@nVAsboXsyB?(cMc{HZ zY4sNUSua9`7RcrHQ;%+XxZv@S^fB5kUSZ*99tyU9`it?-vZTpc`mf_E#X`X#m2Au0 zZE)4&i-TBi<{Db^@eO8aZrd{+14^Z!epVp>4bytUaRP%mRB%qz4U+D6^M9)8SuA`H zley52lgB48o7jjXo1`6zdpc{aR}3Fdl2)pR@1N$LaCo*`XQiq>U_R09#*)LdP>G+? zZDzkBWvfxMa zS~`{eP)jEBJgn)_lrSiJr5Aq7o_*Yly7;WF-waX{nh~_^z~B5t$rGLn*uu z3cqI@I=i;jkJOgC4w$xr7yhWAZHY3Zz>Ds~;@8_lcT4+{Jtd$ql`t((&wmAPu2Uq$4j&Q;~X%bIeDL}>z(3LsfL!~=@{1=i^ zle$G@e;Py2xOu#is}Hg6`1Z~B`bkjlp21iltRPzB1=O9>>BrU10TX zDRRB;zm6GR5T9ghNT5n+c!G)vVba$ztgn&;daJhdg;7_C$%Yc5f}yN26_l})fbykMtW+2V^bKVXu}e?oz!eyk>e>mRNrbAQW` z;pWLHK`LdQteM&G=yFUx_TXsgMlziIrZCOgtg8mZ0-5J1-@B(!0LoePJeBi6w|!g9 z`=>D%cJ8tb3^RbT+~PpaJPoZj2X%{y+ma>C?Tw}_l*J;%`84(qFN$Zldu-^z2c9%3 zSI(U1#Kg?L=rM0&=}BxSHd4NY6lk`U;1+QH9UM?6o^01RLt;{Q=`_DJT^_#{(GSSy zDPTtdtJBFgHby>i!WoEB4mY*b?jDa737Yx8dNjAomiJ!!Ph|^?X%r`Jm_FGK^WRaS z0i&9x-w2ts!!cR6Zfrc!3ULo5ekMX(EC0i158%Bg{?jVbe@3`n-?T0ktL+{U`!=Eb zq|}-sUHgkYR?{(Ej5gjq_bNAOehhEtt4Ru)=7Pmf`f2F1wj@7Xm5iRo9|%b#cYuKfm;wKyN^hIaV$IkKZfV8!{@CQk9xDZ0LGe68)4FMIQC%x(WM$K&W? z{Pou>;^^}!oNIr)n~l3T*6ZVB5_g9I2#A6hi!azOF|{EDmL&!bR-g*rab2g?KxgNs z8h9XGTy6KJ-pKiiIcWDR&e63Ji@?77IKIbN zJv3hN(?qgR)lsBJq~Ad>gCpv6MOL!SaJOSkf2{RR!8iQr9U0-Tfu~7A9ljt>CrFG3 zv|Gp-h<23)oI)fn&%jWAzWPzwZv6ASXNPABf$>M-6?2}_LejEsov|dJy{z`97#t}* zfK5^*aGGVt?6U7Y!z=LoIyWgp6*{mxuhIIep7s*QJEj;?VDL-7kWXDpGcz;`G;iR* z`DP!IyrFJp>0zTePOI{kajDvYOY+-*6eiU>g$q zHCafU1z2jfX*T44Xh-lDznWaQ?9>8MBIC;0QJSH}!OB~~_o$jQ6Xn&?&Uja zLy#1v0dU~yphGbgRv2-u1wj#LuK~#QPtgcmx_paK821!jXPrTo1h%+X2yV;6i+1{y znd6FH-J_*6n}-1TtXiHeNNq(&GXDlbulhP(KCZ+{DK2doQ(NM?g}Lh2*m3@V70!pvkE-rCnYZB2wjFpdQfT zp;ut%q;SYl(kL--9N{UEIi7G5jyTDe0A8kQ|6D=%Sg+7WGe%dPP=bfqhdumD>yugt zqIn|}rpJBN(GE{^m*9G#N;z4~v5Z>N!HnZN@ClIciCzx@xUv4E()}f|H^9&eX{jR{ z@uIyaP4&i? zX%}VaIa(`6NNT2B9CxNf44UYLAl-ofn}HOtHs~W-ri%5H?vT27%w; z;*Ms|DI&6sA9pomwWx`%x#S+%GP{MjY9g_WT`!ER!+hAve*?Yc%K#x$^bPA01|}kND7WtS64Q@6?wo~q4^M^X%+0E1FZc3&=v8e7bI1q} z7vy8`W_Rz&1Xj&s{!nAZyGS*r`L^+2Ykp(5ZvXmHmBls*Sl)OdwbFyEg|(Q;&Wl*a ziwc)LKc6H^RdGgzM}{5-GdiX(SHz>=oj<;yXi)g$|gjL&n<3)#*Ck6#{qGk8Y|D}4G-mp>_I8XaJh7bwCm z%%S_48ICa>5gL-GW{+}|W2a_c8~u7;-BdVLW*O_W*)#mvpzw&p4lA|bYm$3ug96|dG(Z?zSt?BtFuKRO(pO$jN zor=B4Hbudu@-tiHW&4fxV0b^p1v~78qMGIgg9;-dnqiJ&7@^0{%Oc%h>?*EvpPp?> zWoGahd?ITVs&G2-YO&h)Lbf-g*u8V7U0)JMN>`8a&txOQ{@BJ!MEveuR5kD?6aVYo z=-*2IY&*?Has8-08#n^d>z_cC(X9pd!$yz5b7HR;HAi{{g3m}i(nhKI_uSTzjPN@N#0GEI?btLBwZd5RdhD%dB7*~r$8k!h{@YbVJ{jC3dhUr5?Riv9ca|a7B&PK z%VU0Xm)rK(9BqYHa>RTMk`smSZm$PpfX4@AZl6PQ0|VoM!fSl+6bTH_7?~s zymdy?{6TnQ^YV87`cir3U@W(aS>O`Cyt{HjT`!Df4M+dyPG|hw6(M?RU;Ir!h(>)& zf#hOV#$!ui=-TcBilD=ET@E@Djry9xirCs)u5W?vuRnx`=w}-d+E2$njYai@KSgNlB#cFlFS0zhk2OnL1ex!f-OuzCG?qD4c9;*JTC}TctF!ozaAyCiEd(AbMA=C$^)#8nJ~I8 z+35%=P65KPTllts(B-4+d^{TZpi)HHio@tov4#sKlYk8<*bK^hlYqvMDoZF@4kIIG zR9e7%R+ty*F8v{ZDO0Cp?wc%E$<9vU>6feP2XmT{1wZ&DoodYvi&U1&jP~#nUBiXL zD)v+s)}f67Voez_uiGM$6l6(l03YpaB4+>}&4w0dyyxXbqC8q_Y$WR};$F4tt8*KX zM_JFyubfpYx+!v3+MDp`wLpyybd*R74YM@!CPfJ>j%OFznjH%IPKM-bq%4jvmngi1DmkhM&VAE-Z)&Q` zbH@!&0_R(W1|3T$gUSq-stHu9kzQ)?jwfflrV}~`Se1`Uxe7E zod71BF;m;zcPj2oMuXfuhzX#1gg?{E2E&*6+8w3A1u*Z8=xFq~&_hDITF0@Pn$>|J7~^j^;L0UxavA+BcTq}u(@GXB2RKZ=dS+P~UBE7@b2jb`67yH;$+a^U<8Z)0PuXMB?H)1x^EXrW-Bz7ic$+dQ%GM#sGDWhWTwV?YDlur>xn zovk2RD8{y>hDfEcdNERrT9or^N+aa5QppNJ4rm6K?-TQbk8Vlbgx-pT`oamJLk$=L zw{ST#I|yN8r@oM(28h|hIMbL^yEHb_0uL#Ix>=1EJPmQ!RhhS1Q{4GJTw5BlqbyH& z6hQ&2w_>pJ)i=rtQsb<OmY$kSYJMSA57+izY)1MIhH=9eOpaR;D}Ntl+V)4Pk*S`p)vmg4{LOl@8qcg7s!0m zeIiamwk1^c9RFLkG|7~BpmsrbRclVns43K%P=o)oPO*bWr~(843l@4PGbDlh!^ri$ z!s7&sd#6&-s!GeVT`3qs*C)WFRG*xKwDm^wcFze@54bXGFq7D-^9*VoB?w+yj654; z&Q~D#WKHwq4}qYn8f(uOH7wr~+Efp7AaYI_GTg{Lurdp+cPAFMtXaf5`9^!C8e;6(`&Ag(sLN?-c zrT?1FoECV<_7VeBj-&_=-xfM0Wy|k~JlD%m@ zO9T0$>MAw+9vbgd60P)2b3D+|@s&3q6V)E;<#QAdsnVRk0+gD8#*O4fw&;Q2e&rMj zIudn@0P6cI621_0NV+asq**de7OoxOD!|lcg|TG{B;ws>ihJ~-S=9iT>iDmv0Wi_5 zKQQ=BFSyURA1qNruTCw?7UbWhFJwpnAyBL!c01x#ofjt9gA#5wuVG?94{0rjhotMT zagubRK^AndW#7%9G=z=_)QiS2?iTH;0 zW>Z+@usmJJBno4Jw>ORIGuR%UzFORjV!WB7VO&7UQ}FL)3X~uvWq{=D5jJ>^j1kTR zRi^@PWj%LhG&ZN3(d{ z{G$IrS@(J*xC2MCXd>#*=~r`H0ZUB*EcH*nr4Vxe;hPV_E>eX4>{jt4R$joJsO%4A z*z}96HeW6aCzz>+xF%~{1McOT6AsW%BHoYYHNQZ$Ogp9z9nRmggCT{#;0s*L%SM&_SX3UPcU>kSshwN88|c zMcw)*Tj8bf8Zj@$W0Vk?ZOfd$dQL*wYGyu$LtZ=DGZ$FMZd?J+l9a04qmm*seg!iD z0pJcOBsp+AgvqhA!eYHTNq4Y+8E}Kw5iJe8om?7L<-hjH#OV^%Fk}kg0RDW#H zN4JfE*FJ>{oVHAZyyn>InS!|DqiIU~fazdl{i*={p_o>gJ`0OhuXR4##V0$%>74u{ zV?S3V4ifb7kA>qS-#b8?)v#}rW)i{bfilWbLxnK*Oa+!Ih+B_Y`FL|AD_CDF=R=%xh6!m&% zR@)HJ{lonyJ9E?^`&H2bVjP)tDC(rUi`xVF)&2lzWu5p7Xna&EX}b-+)7ayM58pEM(r7`7VBE~P5eBVcy=jg2F)mFI zEfIsK8;KuGGRNp!jJ{rwi7r0>l~C82WcYgoyoDKOi>TEchRMIpVjArQ;VPJE-VWw{ zW796#dxfskm&aqIH8x#G`lno#kf{xW)pO2J=lSThtDz*uHH|(WTbf>k5sh94Xke1t zj$~c38HVmz--blD+k!GgE7q3qbUwHW69YBs;df0WD#Lpjg&l{*;0}i{(8^m89GOdS zAz}hb*EgF^2OoMR0tf1$SzhW={3V(2HGR^mn7Vz*M$d57mOz^P3gQqmouB?rHlLGWsBAiIRo~fK9 zh9vm#oWobX=r^zXr1GD4Ius}+g%@6nd>9Rmh_Zy5wtmGmIWcF%4Rt2$tcj?8lJ zix20UHS|}D#A9bX((}>%E9K4HowmK&!OnznB#Z3RgOa66-$I!>e}9;(o5MAu=@j^E zU0Gw+S=Tl=+^G_H^_1KK=LKaIT# zT&p=cMtxgn=MZ)gp@MLsGO&MZGTV*Ftta+FR9eEv~R5N5_=WqM2#W^#W=Qe_AM zgFR1lCLRrRB~ljYCNpxjOZXn622An-K~`RXXrQ8~=WQ@E$ywJVtI~~zM#qyTDBP%7 zVSfqUrf$k4M6|>+CxSQ~a80yz>6Mgl>_5m0;>;-ACM%GPKu{*F_aqyWgFB?p`_AAx zi_{^Qx#_CG*Cl(_WQZ7@KO=w1W5!D2;v%tGrGiL);cRiBtGuCYu~1^?rSEiLP6bie z<8LVf^~$6zfqy7hn!_TwUE?3tsZkI;3PP4Q;&>h{0Kt_Jq(N1@J|OFL<4oC|9hc3( zqwhtd#xNBAhrogy!P9%Fev+h+kD%v+iT&!BT@yB)K9D$mvQ{a+(? zMZ7f1f#MkPi=5JtWOGgs^ZvAE2=)7kzRm2j%eN5ha@zZysC8m1$*_mmwYb2VA@Qh& zDb=8Dt|9C^strf$^U1tt4!Z6nuK}oej1CK7xWk9IacsJuOx$NpBbh@Ox$8KY!_g4e zsI>;(XkW92uGOKudlm{8DpHu*M_jQioA|lau$|ZyN*(PcGgA>aN*`_OEl1-20u_H- z7#AtV^6z-P$3j4jt;x%lz?uJJy5zX@{>y2Aw9!o3M+)hkQM=qk?AuAvU`(cpQ!0PM zujAL(MqS%Sx*|5K+yF4JCSGx8D{Mx538_@ApK|k(z?VNL zJW}XQ_2xU)40n{&&29I=c%jH!G8Si)zl@>joYG5U z12SZFyReJ%O`N`oXeQrkT4?}iPs5;VDm88K@94QF?XS?qwR7)$A_XFzn4M6{zcPB1 zaIUEzgk!=V|4M=EnAfDW2G?Xyl~+;k1;*9&uEWp^j9Xw%lPI~$)4{vvVI?$veqD9K zw9##!f>Bk%W#o617ISHV#!kUI+zNGPZ>Dk@@ql7rk|&q5o+e*zb??Rs?$3126UQqY z2pA`a=~?~}YIBMtZ@BppN#3ZO*(6(q(0HwnfI;gEQ@TON99^i7^ew-mifg3iuA*$f zRbXM{0qRZ~qphWhMKr-YNBsp)-ri79WVBP9OY6oI0pfO!g~)#j}4sha9)S4{LNn6UAEV zr&A=o2~hJzv@T7jPsKBUaXKC)A_U7lbM zvQZaF1zkkEFabsYxcfHW-wA|(RH-Yh7Mf?-!aS33WCGTdNI{NJeZ6B+kT2;j3ps3o z);9S9nsNKc_J<^Q%5NQR51%tM=t>P{ZZJ*K4O25Gl6`9b$c9iUEy@?HTF7t0-~5~I z!wsRmACZxuFQsMPKmh9ViWuSSO+ORD6_>6eFjW8RY7>%l<-RKZpyQK^JvW>P@x<33g^#?wQc6?#@ z`|DbkRz(DNom8Q;ucPlA-nYSTTqD0SoEQqr2I`^XuYO*_A?yF3s8hZ$*hO3pb5?%* z@;K1a{-%iW+=X||aFv5Sv}?xF>pHQ%?e_FRr@tfBe>|OUH1lz;ykzg7hZJotIKcHB z&R0k4&UP;Vf^7H2fhr51kD^#_#>0C|ZuXI5r+Tl4OY`vyOV26QE=0Wa@It`ns;jUt z^Xl}p03F&jyA7FnU7>ZRv`e&N|H?^dxhlo|Jd#1tMfte)=g*aQQ9WJj9OxEm4Mv^^6(@_cv@-Hw_Hii?R=EpKmP7v1ZRsVQ_j z&ql>d6Ro`qDH17b;LgU!Sy7oU2=fiLS9wSJVHBU;fMMbeb7e2P5l4oqae6Ymz(uoN z!$ome`@*KX5EeJBxwVEHbVABht`ecl$`%uGHp71S@-@Ck3Ifh#d(vF5yO#(21xC6y z){+wp>sc|961Kgp-C2!~C^C4gix>|Civb&Yq%#+=c7>6Yl3k5fsE23lq9wsd(`sDM znYjAdis?iB^+|lpHC`+a9L6@_SSn6YT*(8NR1E7Km?vWJl(?0YwKDjOMip?;w*0j| zr6fj4Zn*0SpQl*TMn;M1gXc@blPSYBX*Cqn_L0ktZX17V!DGsq8I$B%U5Lo%y+Q3L zfw59oiQ9F|Yx;{V9^P~hyrR)<%#6%QVNbKANKQll8(8|C3A@{uGF*hVo`)V?{6CS1F@10=096pzB`v)w5J*jD&AcP6axG8U5! zJX2775XpynT;P6&i{F!pq>xtfydaG;<*;wv(I@MG*(wGKtmqm*hXG0YcWI~dkmw^? zvF@L2p-iTxAC$t^Zkc&a`IlveS}MNa?kBAFglMM(k;H8Qf8qrCYnSZ)hGx2&fPFaf zgE`dx`Ztntv1ztCk7@c@cO&x_7w-O*A)ExO&kHtmRpy(NoOWR=kSdjmhC_Mtb}?S}$ZEHpoZ=wKA+*)wndFAX7kbrs==oQ8{;11tCwP zr0f3p>h^4;m+3y3L}~Lmuqkx|n^HHzgGP@-c_2yUMRC7=cV+D;xdReHfVK~A0f=qJ z=@^r(4;3;g6D|BkyC)|(%|&`2a+4ZN;!;f6?a&;PbR?I^TsP6S^ZpNyM#Od%$zRah z3*ngZYsuK4KU>eD=fbuA{e}X78wUthcr%B)K5LDpxKWvCFo3s9Y+-mrq)K=P3&men z>rEh5$+YQWDLUf>O;G%4u=_3$2iOcvSLLy+UJ`TO(IVTga(4q8n5k2?a2b(+TF+c} zSokrqQx<`{Dhj8Cy5OJjt$bk*x7{ddx6BGIrs#I?dBzwb>EE?@i8T+)$r+4q%&!iM z;c=U0v#eCwvHXBrYn+tF4hiUI2mwBQS#E4YBH5f1D^zCO`Qt@%mh|Cj$hvK_k6`2K z^e!P0Kpf(@Ee&8jMB&(-#Wm*FLb5?l^R;@35Awr6FaY0p!5RYySFXl_k@}yGiurWZ zFThb_KjQ?sHT>oA;ZC47OJ+hA8j|{}@U<)bj_$hv<|Gc=;3P&rV3&mePZvbqrD}ER z+8j`QMn}mNnGWu6iZxJp2M^pa5Lj=%tGCBhtcV9Kzyjz7T${VVDy5$x0MNpOu5%fi zx`_na~knTph8|m&o z5BQ$%{Jyo$A1)WeV$Z(!-q*G3o_X-srNuw6V3~e zIRJ`5a0C2G$g#h7hVT`vDfmVKrZndwe0vt>`x0@~?zw0&uaOfBrJO#aISOQtq zn(xyENTHBuz6+~-n??y6clzLe#S(V5a=v025<`=7C`e>K@X~Aqr~0QC|6fXiVJHJU zJia?gDPHa91qxmP6w^UOO^~v|2wCe-!SW^ecjU97GapSlir2q(gkQ+ufCXB78Y`A}>(j5!dQOM}JXUCrF#^QWA{^`Nf~iwH*P^ps;iOMA z=@bxX4hS>@1lr9?1&Jlh0em+fbc5h3W>t-Qj{Cpz3cLPegw_S13qb7W=D7mm5bgU# z48IzUdSM)d5%6+yH()_}C2TP8c|c6hF;@*5fck5*P$373qe?)^`xoa4PNGH8rBT$K z&kXqa>V*LtM@ZkI18Kyc=pc;j^|bWD1OERj43~gk?U`U+`1B_Ji&#-K`y}1}2NA%4 z(~Tr^D3I1gOhk)ecXCp2MuwBdul0z3EAGi?k&(>(~288(A*6 z+=@Tkz^@}^NYj};t3Kz2>k=;#EO4)UIXfgdu7op;FyBLG&-^N#!M4PG4|6zL{YDa` z|5Q;DF)kGT=LkX~y6U(euIg{Y5nf-j#0h1${62;eG%3Jg`p+?SMq&zo2|l=W`0%cTNurdG=A&@T5#L&c%tVtCSeEpa zg-H4e?u78NY~Z>8scGp2g+%$EZ|Q)uwio-O$_D+zq10dkkGTBuEN_)*C;#UTYO*}7 z@d4Imqmw5-fySkVXd3hr@cW0G}+bekG%9OU);9_{J z%wPf0u=%^7E~dK)^o9HY%pheAXvo5nGz*4xK%z}&bXQ$z2oawdQf<*71XjdM2IVax zhe>&gUiUo3ke}q`77acBTS+UtUY$;CMMSUr7)ztU)Yp`H5Zy=m+7DQ^dYSA zK8hea1ALAOeCXOD$uL{VD41a}G%c1s*8^bJLE|XF7xw7Z`3^BRC>-W%Xd(#*3`fCl z#2~wG6y=(xrCL^%8tMPHJabl9j>AIA8s5Daip}`Apgwg3p2YBVZuIPJI;VHR^#tLX z|Eu3b5OBCnq5qEiO|nR2E+D1>IQTJ^XF~qeT8*9Cp31ZR?^L$z* zO&RDdssOp_#fK`%bV)0t_BF~g96XNtUy`WYw+R2oaN+%_1wnbu+dSJ`M?ikSr|dp( z?_3-G8lVsz{vds$-_$=vk7qq5>3iItf}Yq;#UhMP0L*>}=QP;fiXW5&xaVj!^!G+KeC) z&r=wZ+TcmM``DIuSH_RYVPk*=PKnn+i=L*O(nDve5U7uRr;ZG6>i;&S^nWxIw9N@9BE*|MA98HU+2k+#_La7!gg6bx!`(rcb|-boS)( zc^P%&A6t6zJD5b*eJGYIID^!rG)}%bJ@SL3j0H71pxG58dSG-UF16Sd)g+q>1KqLO z_h`_CeY{(xr)oIPsdt}+yeNg2@#i1ISc zh!QXIgIx8mAE6E3RQ*Z{lSqc1%Aca}vjYs9vA-T)?Pq6dfPy5Y@OIE;O5Ps0mkSl4*w#U8!Ny7=#fxGglHl zLC(d0(}t$2Xi)Lo0@Q_c{S29&SgBbNm0y4uW)6j& zH);OPGzPKy@kqtk02Hu@m+;xP=X1EDwCMJNf<);{)qG-_!2Q= zpF*v}dAws+@L7`?Ia7*VgF@5=zI6DYKcf}~gKxg8h(SMab)MG_dc7QS%){fA?*7Lt zcdd&Ntk8A3pmczwcSs?ukW3K@jxRMICHQ*bd5FsP=}w^O0p>rN9s&FS zFjwjeb75PHh(vM+*;xZIqL1uD#1uzq)^IluZ|!+p_3%ZECTAB#D-31L!(g!d3Of{j zXYPZ|1s*z9CZOLl$v(4|^!x{V17ePI@AJ7d=^H*~QaM01z$@%xXmJ+U0zU#cpA*Q( z?xIGKFo?aB=fvfOMzc4Od*MIh7s+UJ^4uotiiZ6kUghe2_D^45~{@Lu@Jk z^x9c>ApvH10FtK~IwMx<(#0oHe$F5C5s2YQAciv!*DudVk7p+l{(!|YHUOqLm#yShy&lx z$+~qf(sOXRe_y=u3O134CavBe0A;JgfS6PO)B@!7BeOp4G&5Hd8oZGiofW~P&qTcZ z?UK)T$NSB32yF6dHJC>4xXZZE4cpXUp?D*d`4062rx{64AT#KI@XLeP1|(!UkEYfo z{}Apt1IE#du$JA0QO-+)B~{5~))69Dg_7tBh9W{Q{>wfI2U`YkjG^2nwBdpVeAxEw znhl+y?zBNr0<_drFclwlKDWY#huAd5J2n8q`~ZaiT-e=xZ2~a2ggyJ*J1B}g& z3hG&cm(M`D&A|sztAExIHjHSRA2L9)Mo6@#B{%Rd8|ucPKb+bugFU48W9@v8lnL>- zrmqB|8T&{JL!b{nJhA^uG^~HzgKK97s5(@>NLm>)MAQ{RaomC}Ft~=YR6mG5k#S7k zioBgv|4Sb^Ls)2Wt8AkcN~Cc?xb}Q;?EC7VooL$9>R=G{Zthl9L6YESWlt(yaiZPtSUGn_ zvngpE@0fD!q@i z+zeMVvH|t5RyN-dU}( z9%^TJrI@ij{stuXVC^gw&U#FL%;#q$xC0)s@OH8>m?KdWUh4VW48{JjfG9sAQ%<=x z_IB=aT}XQu&S9asin~Sxw};2l(si-~8uzfUid%s5idwDBWymcjgorBEnz%>=x4SXj zdMFyL-<8YvC;6>)c<(Ja>v-~m+%}H3*JN-$9vgg@~fELd8Pe{6^O$MDw<^Gu~_>Jx-WnKhSM$UQo&!d7r_#1{h20) z2VeU9a=auNP}mym2qS!BQXtuYUFbl0wlCDHg6GloCMtjCkj#M1B((`~R>jJpSCzo+ z*bTq;Sg#k%{7snNd5<&6YPd|O!rz6wSH|JfRfE|xK#pVOYj&hITddh8*%3|LZZk|c z~B08h{MDb3tx{KvvP}{yEY;Xs^|xCPR||9NlbT zsfQ(^xJ{k|eXy=FBq=3|m}0Vk;OrfPi3;?izKc;nprlWnmC_=~!SWK7vu_cj z3OR@RRvbZzCw=e~TsB9>1d6nS9HbMmaAp%4Uc|Lm9HGXRAn*|sXnh#PEO3cMKT2on z;t`Yl(9GJ52-IWsVVsl3?3RnHD>E`F?*XsUj^tODd|!I6nVUyj55PQwsyDSN9;2q# zAj@T_4^nz+{i=6iJhAiU{ezri*`t5I=hxy!0Sy|b0Bh_*u>~h4c}l!i(6o107ALFm zb5}qu2h?=c4U+Oggp_7@SAwWq5ui!bFc0Ed_MrSz??eH+DAiush_2Ol0UW!9oH?8n zMC+Fx^nlt#;3Evm^GIt&EIayxps9Lax%DEHsLtxDow7RU`-!;@PJEo*TMd^$6nQ=Ei>3cnFoyz9>@E7y|gG#7s(Pi z8sv+7&2GKdwkQ6x{xc-K6Qsv0@EWg4_l42wO-O)Qg z$*-`f`5G0e4bPKWwuC+@3@I(mgzub9A3Xfz+3(tH((2mw|D0r?n>GBh*D57J7nPFS zhvKv`pad(uirVy8&A4q@Ec_j;E9I`%KhcW$-R@32iA3K`H>5aSzA5Ebm_Xro^qM<% z$MP7?g`wA|%(37a^W7(@qc9;WsYnktT-l_Hfm>zE;pp()mREhyTuczeM4-g2{7{z4 zout#G1DE)JP--2KG+fmhCcvDS5_FrE)*GTsKh>`?*zUz=#=z4r&sg#dQVK4mhoj)z z(iUvg!R<&45HR8}vz+uS^0!HLFnnR&nc9_{>y+~dn#(L`iDq1?%zuF24!nA>qOaiWvYJTN8C10f zZ1w+1GtOxgX$`wYc{#706}p+ly_Zz1Kw)AuG1NkZJyO{^7nDkC((IsBpCZjraT3qS zGcwcxWViyz=znMpLz#uI^d(6W=LYf)mp_NpkMjOh(xLImzggn2rW0z}^0UUk*I&2; z*^JY4#vnVA7{Pc!%`~j{Ndnp7?wfbfaqyVEB<1N+dkphy9-L4MgfDQ0>?KUZs+V6%gr(eMUI` zPk-?{1DKQB>vH81eQuV5i*_I7SRP+rDw_b;-TbS_Z-iZ%QH+GNF4zyJu<5@c$T+h^ zOykfyT0nK!{_!$(7BEg9{jaEUChDnMaA1T1Ziyjx5oknV-K}ACg4&b3cpruUD*k z3$Yj5EDPV&faYM*y&K9hKB9@g^DbW#(Y4;+pmWBjl=77G0>&tQi8rHcK>u%nL*pv) zTvt!uWka>_83L6xI%FNuhLqT;<=3U{yNO&afR#E`M^J*4|NQH;{b3wG(MM`@s8^Tu zLMGI_h-#g`K~x+bX_!e9HeSP@HJPy2_z=C*p41oYXJy6~7(Gi+f%f=KP_CMfz;REM z(p4cM5*qwV2`Ji0I3_8eA*xttFO!P&w?b4k<2{PN9{2wp7bh%a zOWfCK`cW|Va40{1Ai?FE@P(PZzx4ka&8DQK087~%gr z><~5>_BCaOiN{PAk!hF`v{^_uw|s2w62 zEoji~i@JKRuWSB66YK4ug|q;WbmTZ}>0SAUKjA*zwD4a<_la z1AQqZqA7Gn92oPRYquZ*VL20FMUUmYhZS3lL>mk=rZGfJlhkHcIOf3MR3c6wD4f$N zxl1)+&CGXxMB;fM?yvpUg4J|jaZ=V9$NS$P78R0{^8E+ub{bYCIR`_P9MP-{<&rv1 zH!lv0pC!_JM+>CNhcY80QfPh>48vzM7AL8;9z5gRy_Iw2B&+?w`d zc@`KGz=N_U-SF<>yvQe-dW{5Y;yb^mCIR$TMK16AGXPYd#ho?&fRJc5vS%?Ejf; zmKTe$Jolx=Kd5;^W^UBrWkft96H4(@N9D)T_MI=uzfo{#Ag876S2XcE)i6j&puPaq z?jtVbE_PRsGW2DD{}rlsl!Yf1H4yF?fi6~86~TW4 zTdk9|5o!6qFs}g`tgV-O4Fgd<_-_nap@+R!!?g1sxd08gj+c!d*&G_j1%z72PQxGc zQz^#-J!by;tqb)KVgo~aM8#Kc?s~gA+Te6WR-=Y4R$yRDD+_Lwl5H3=k~4reRNcdX z0!jeG@{$zjd0leH9%R6$|5D9sXhXnQhK;eV>|%fykZHhhYs2KcRemRoKK?G~M*p%6 zFn@4*9`Qw|0`q11Md}<^MbWU3#eeGrf*NMXd~62A|Fwx(a>MMbD-9#Uo$k(!R?*xo zB?o(2M?KCdUrYxq7<5eg-ydE7A{>+^JSnB7%-CfO`V_hRyG8x}hSC*`tiu`i3zG{W zNYxWl6zI}|%JmJz_IY>7p@SyWpr~uF#DGzdcb)ROM{9?>DOO+q()}BG9qn!chA>tH zV$a?gnC}BK5SgM>ze%xj*Zv|5jzYIg-%fkQ9$Vi<8gUV`knRCsJ=+2v!yTFTVemvz3G>e9ii~2G8yb90dVqXj~jVjN32_x9>N<`O;H+#NqndfeJg?d&s*K2^Ji-|UkL&t7hoQKI_H_j0| zHE3`+7cc=5>sG>4I?8|o{LIzrdZ7&iIxK{e`Yw1T9dMZC4YF>WCu%@=+%1ebu0_O5Ym!ui% z{hw`(WX7e|3<-G1sYbZAt+3iZ{mYpj zV8j8UU;!Nmr@PH!zG8Hv#`w0`?)56G3) z$C2jN;(qBKPJ&aeg~iD-jbmsV5^aB-3!^{4xB=cKjse;kK(bBTNE?r{+6+BvMAs~T zO|8t1iIfS|+&xrIIA6XTtD)Hnkdpeqeop<`GGLac~un0T?g*XYo7x9r=yQ0 z_2Av??%ET4;M}^>72Ga-$?HBFz=QHk4r0AQ7 z>Vfc$k(^{*+W{oN9v=qRH9JnXfW$m8M&4<%X5;%glHoryd3tz48^MUGuHSka@IMy9Mlld zA~d{_swL*j(dsFPl$5``#R6wf3oul9fk?Ff?fxF9j5YwEVM!^1`XY@bl{|Y!jACGX z2z~z9PYLM1L_`9=g7Lo9|3U_{b0TGGe*;X>izLcgZcYIU(;#pY*XRGejl8_ zO;9VLdp1mSo%`y0A;)9<5g66x8q!HO8ee4%d=OnD6yU6@_O($nuN_Qo8ecmD;xeJ6 z^r#R`WTLcmz&8T`FT}PrWYSrkZ{hw`pxf_L^${*b@l#e1qy)w@?N$h(7q`KnE_$fU zR3^jzS1;RzAwxS8ht}`xP(XFq+PiDGP)-0E9L1?tLwSn}5{T#|j8i}$UA%D%mLL2c z@{mWd760ugWRk(ii@o5zMzdr&a_e@YYWPSixpdRrsw%&e3VrX=Ft({{OI?Sj;#GtH!h8#)Ai~3+4w+9sl)0K zXhXr@l9<34QDau|PiWi4!3JDLyDf#Sfo!ksW!rRHeRIOaNskXSR#3y9KDu?y z$#Ok)+Wp^XP*qfZ-$uEeV}6yjU%mBULPr0X9~P>_o*miGox4nJS%)4%$yTj!A&B3-%~dE|K(*r+iX{Qb%7%IWO(g1t7dq|wEp z4XsQ82_f(hy>Z6bzWTH1rLPQmk(=!eJw^-8IFrTY5{6TLzl)*%Jcz|=?X62J?T$~p zr>gmd87%V{Xhl*1HSpkWduA(EWuKW|`5K*m>LQ|WptLMEXQ0E;_U<(@H1iv=wFXi z`D2N^9!sm@^;E(Mq`7!dBf@PRNY-BT$j3=|3|=zv5rqgT)57zGN(WLXgk?Etywrds5G0hEERG+9H11a95=EMiIb^6j?kR<7azzks0O?F zzNH`L*xej87{;XRHQ+&XvM>Non7{1tEGCd!>q^mPM29~_KhuN=5>tsRs%8OrTS%w{CuSz`oM39BcR74O1y_hb)0I~CVId7k;867} zTq>sV6!~9*acEbq_I?3$j_jC&cJ=g0XRd6P*BO#TN(`BqcHjQUh!J%QpqO6skWoP? zY<>4aGLpb6Yfl+VdpjX=EV=pU#cpG8t)fKURQ8!3(w(sM7qzvn z5GJvo2?~fTV&IMvM&hkjFR%`~a9?8X5yE!30$K9d$ zQ5Yil=J^T$AH?Dw*yTUp`AR~5zPOY&NDKcna3+F{Bz|f3cM4g9e{51jY6dW4?o@3@ zgy<$;0y`yPNFkp4tY+rz;YWsg;I7fXPErREnWzc|iAV z#^C^RJpnG+V26H^;4A1Qeo&s6e$U`d^w8&FzWjVcA@1x)munLfY|zQ5+kbaE&^Vgf z;ecCY@a3si?yaoMm6{{9!vEc@3OcyhF-YW*v*ZJ=u&@IAZ%$zUP2vj6!KQSl^{=Hr zpCH^jm+ck}Ydn3?`uQGE)g#o)d804v0Q=Py0eS0LJ!&(jKbQ|bMV@#UFFRa`d~F)a z?u$>r;eh*4o50jgtO>7k$!N}iA{({4uCzT7Ckj~MwkPh=0&{BX?!?DSIHL7(weFxY zcC~UF8AgVQXgY|U-rVD(W+6ev`D9=YZ#?1(18TTF__ z2SBr$WJ*wQMu#(+WTq~N=bST$b~{@9lNtg@1r;s`o zxWCo$yT>nLSA7$t!4GfBdrO%J=S`lso#@PE>!xwNkeR1Uy~PxT42QQgIg%>=dF zv^UFqd}lId#}t-p6wYRy(J*J=QhHv~54fUclAo8^h@zWfvDd03AfrNu@nWm-RE zT2KfzSZAVVpVS2eK%)QYIZMJpHI~0Mcp)M3-%2gnIA@E>i`ZEmG#}G-cN1K+9dCWJ z=FYe>XcAySmzYiLMNsL#c?bKv_=ArdIu|B0>^8N0SQfnZfAC0L}}R#DJoo7>$I{b~$kXl3*}y?=g3_|*-A;=^^Mc63!RFbSX48<=IpMwC2nEN`v`5=wVUkFRps+1U*q z^&gK)(?lL_xFDU%aS4PX?l(TCJx_g`kHoLMcf~I z267W}*`KZtPxlhG61J3-*nz+ExVb$i?t@=E-P+3)@pQhqzur1;a62nyA9;%N=)Zbm z03N&a|MS@5kG+~lIKcCP@_@&XqyKv{lf##&OP zwbZJXmmsyh)(7RT?Ez!{A5==DEGUCnlpJ$d;UzIwN7U9lVS+`-9Ir%?$TO=sF50gg zo9W5+xU_JgnX^^NND~YCr>m*!MlZ3 zwq6$1bJk@|m(@-TTVVaR?S^1pA!3DZC~l(SjXBiTKt&cGpBdlPmM|rqGNb<=eKt}f z$eSH>*{qgtN{M2Z;u{RgY)PuA-n3AN=Gcj`Ha#d@KNu});}XF&JA=lSpTF*1*`X+F zX4>jGMId_kG*PITa>$Jvnzc;*cD{^G%=S6AI8sFUG#wy361kF3SB}0p)3wiu_BZxv z55nzxl-BUMehiDwbpJTMHR|0j0*UW3Mr#-AJqqZ~w4yV5oD0I=?mG|VRu$f+Ha~jB zhY_eVPxdorwv_2( z@2@J#SHW&5;74}efl->Qc~7MsDCCs_vsv5WYF*#qxpPi*Eu>`OJlEkk#KZW`Xh4kj zuJt3`+Z}mXIJNZTIXSD3HleZ@g;|Br);F9F(9lE}mG&`S?(k1x81F6y=~B|N9F~v6 z@+P;CwLi5x+9+EK48yMF!w9fy|XLfM&;C8z^7{$kt5`SEoV%kQG}!4KuQ zefoZ0T2GHr<${wFedbMyX|o;=d5&7SAS&)A)h!g~6VIkA(cxBMxH>xLH&qqI*M zk`3w@goKI&Kg4L%+{=V+0-IQ+d}XDVC&9namA;btl{$NJ#Qgt1&3H;ZyRi%m1tkc^ zgu?p|JRgnhO-;aG>_6F4??@T}pUV42_5bboB@| zm*b8kW5U))v#>F}+_b3~Oj8q+*r-vwqkoKQw#Ma9vA8&SF`=#Iev$Tc^k{QgwnV|x zcu9;Lx4G7(;-rZ#S%tO@@hUe+0+7<)yz$eG2o73ZQkEUCf>uFc_-z|+S zDVFR<8p#J;`yGeN^XrA7_8j+DkKY<^TAuV<9uLxV4aj+>HSYEb*Q*;F1oaK{FrLn? z&lZp8R}*GCc5SXToCp)9H7J~%8y~EmZXOCl=XItdMY=tIw=7ym8az7KPW2=|94~)O zY+AH-UZ?QTUbH>*cs$LWyvAgsc%l&Tm;&_K?KrOQXt^?K^3*iY9XXsXY@8NZVlf|i zRO9J*IzWBmci&pfcs%qZ->x+vWb|CDGm>C#oNE!uYO3)r^=#oUI<$Gbfqh(WH2-$s z5B~Buec0YOxoCHxwhN}N!rS`6S2EAWYdL)RkEudg$Lk~d$3lGP&oi*onQ%?Z2rLcHd}q8y_+DstRWuh5dUdtFtu1qDp7%Y36Q{I;3n z@H5g-wfu{gUATua@-BCp&@19g^7dO6-PP#9uFOA=Z*mypmmb z-;vR*<;vl@<#8Iz&)4S_?>zJ=O^EGNoM8mePl*}mk@w-8lvwqm^9hpZ&FahHojl2& z2);_wz_a?2vzFam+RIoRY7QGFlp7{o()|{VV5Ht?DENp(W@kaJy0;QqX*2S3jQFh! zC!{}!k>>C8$_HjJIyHV3`H``@BP@%n@crN&V_^5+fo#!YP2MQ2II zdU|h-Qf~KXr@i;?-~tte2W5g)YJ}wziZOBfgj|XWiTKMp9i!XT7CAOrd2|!Xbpv(3 zxb;FnM4EG;LU9N1gaHHT-%4G<3R`B&lJ|FVVjg;;^JV2mx02p0Fo?~1_KO=2jwMvv z$#~OUYYhP_z!%vne2QmVS5E7-L>X~J^$9ZVbIh(&JaDuqO%C2;>)GlINIMExrk1dt z(?B`hgRwI1baWR3dAIrPMO}j3VkRznk5KnN+3B&A6e3Z_V^7PL-YpiVsf>U0wQ|9D z$D&g*E-1g_IJVd6xYqEnbydn{V>@EaMbjG-R#!5hUMgXanYw2IBPOj$h`RU77h8g{ z%p1K@>o#nDFUplb7~+V=n(0(ZcCB*Y7z3C^wuIDzG-l7w@nU=RZg^|YO$Upzc%z}u zI*~3$8#cJ5j16Z>O{gusT6ypO*A%wkqWS5H>zw8mm&RTIVjvQU`x`WH2Z$TZ;j)b1 z-LZ!l-h!7KK1q6o*}u0Gb)!|vLJy3!kVCH-$bzx%e4Zgr@BJJ#0`7c2E!jS+Nvx#Q ztTu2O*JBVDu!>J{J*f%CexihEHGl%4&DQu8Iws!8D|CFfoBi**TEg|3S}-_=RCAP!LGy#O=su5%UW%Q$-rR?295@zm zo`XdZ?ga8KoTCpv_f!hQ+&(K~nM*!yP5?RbI(|1$kzl(R-r1`NhlY+RzUrdi=oKHJ*c2 zesOt*>JrE+r{vk(TpfKs6m0oX>B%^L$Y`&;_*l5iHOzd*qdIMVhr@UJW*v1IRmeK3 z40fD7szRZ+*i6Ea*wXP6@01!G*8m!MqJFrey`fwo?j#j?VnzdPehG6_<|NEbI$2_@ z07yrPQsjMMXx8LSYC2+{->zFX<`h-rn`SIEsy!?3vv~ska=o>=eMk{3Tc=B>;Qu-6ic`Eow(EvJ#5H~mV zL88xnLu<{qBFP|4bEV0Qa=x|2K=~L=fdD+QPLgoV=vV!%3RV(D zrrifoy*enE+;}zKfg?|v%j6m^e6-fVajQHyWhk16dJhTg3fD_QmDOFJf^f^0l7j4d zaflx)-sQk}-;bE6ZMl2193TkmrLLH_Rf<$HHyO!1!4;Kz#Zl@LpX~lB!+C8-F^%bx zBjzN&R=V;d{p)O)##S@d1iFw-=D9su7V_y(bHm#{jS2Du;$il~cN} zKDuEp=*zZNWi-6~s#2qxYt#G2K#`re+bLvs?OmbwZh?6d{O9p7>`Bw2$sxVyn~kwH zE%8bjFwV=k^Ho_8Y{K6)2y-WPU z1rB)HDP)Nm`~VgdRjVep@1dP67D;*vgqJDz28!)2=p6k`yVoLCmdiw(8@=3l!aulPbC z<72{B&5@9!2P3IZ=pAkiUj&zC15?zi84x+)t`zl%teFYT+?HPrHD$9yD-jVc)FRwM zT3U-pQ9%+=Ut-2in&nQ;@kK(;NGLrukJP?4?Lef()6wqRx16t>QPZfJ@I~X!5;z;4 zJgxj;AvH%oaLW{h*K_ueYO1`r3Ch&rnvrM>hct~ON#38dHuREcZe_o+9?e8|tune~ zAzwtZ=^{jN*uoGOQxAcWx8$u?@PWUvBX> zxax?st2_b>wVsd@+p=W$`Jf?tdSmRJY40FI0*`B?xGF=z-JP=>P=N}sD}D`#W~VeE z%T`e(WKg2U;<3srVMCG+dJ%2(B05-IqR_HgHKAOc_eyf4?AQ!r@CF1t^Z4Z9R!;oa z@zY1MyA!jdFRo!4G03#!vv{W9?+Pb{_}9AOPWps!&iSL}_UHKoGD_eT0)pF4aSCZl ziTN44fiU>uwtnC-fIIs+*-^hD^?5!7PK8d@zikK{mENW~PeOBN$`_Ws+)6-&$-=*V zCr(jo*z2Y6+immLEf&%wfXVBI+h4bJzvmNwv}1o?_7@hXNLS)nf12$6ZbAxH!y-b; zx|J`vl{q8+%bLsQIINu2LcahuWx1gQd;Ctzqpu4#=)lVr zmj6Ijvtz`B>T{YGWn-V^z$z9&%gqd+r$kbH2F5u$Ji4@Bb4YyZ)3K@s_V!VLYR`#c ztsg(KBhD`E1l@_EbGNGW=Y){moLv3@GTCQ{kieMLrZ?~#7h}xEnu|KZ9VN{ulXJqh zl@|ZZcFol}`XZ8Sl?Q#(0tbD&(1+XGz$^TVx-?W&ZCNgW_WBF--bU-(1YC+V%#>!U zHf|zfm>2iDa>yrGOBzFkDfE$J#acXd#v&C>UoRqagb24vI~7qFi%J-E69PO#$Ctl$ zg6psM;(k5?6+i&3b23H>Rb2@XrDP#XuR+mcA5qyABy4~y;fr9@wR|YlCG>BnDaO!0 zB;%KH>e9LDn7hQ?bR61Ty`k9Em3UW4Im!%I^v5gC&@tRgEj%?C#xl^Prj^dh99i+( zn^-Tkctb58Q{=}7!LDA9?JCwbxCwegp@_4;9;8?#UnO!=s3uswKdH8oplc$lPs3>5 zWe)(sk3+8SZ(J5W2fcS4fO0B_g4Jju(-##(MJGW|B@wdg5eN?a-1wP{x6Z9H_Rg$O zKRk7L0%^_K!tGJu+KelX3b9~7GvJ-s!?m6sbvic`cYvw}!Psurq-~HZZsjdWqjLLtuJu!n#kHX zRkR;vM`M0nh%}Z)0EBv;MCR@mS)_*KUWTEQu(vVhvBO1Bg>bF~0+o{AZXaByL*Lmy z*_5S`!HQiy=gMNKi+s|_XvpdNm;R2$T*W=>cK<(uxP%KZ|Hhbl#ZXpmtx8c^yIv|q zy6%$Hsbl|}qr3WtcT!nGDgA5BnLJ_B;etr^*NM|O?j|m{x4p-gEP4ugDMC>cmiL}y zsL0+SHvYl@Yh~P`(M_b2Z)l+f_lS7Yuxe=jq&Xn#AU%_Ei>iF1Lcr$y$2>Q6P43P++Ej&>S0eUIe0L;@pu6|9E~)3eQp?E?sbx?%~%TFb(%$AKB+ z4b%vTG9Y~YQL_!x7hVMO5}D<9cvIf6j-X-LaK8!QqebU%b#t_v=T;#P)e zabG+JJnTV+3US{C@mpxvopN$g!J0H&mmVvq^gbPdkHqh2-XDlQApTgook7+YbPV!r zS{kQV%Y5_|h*eiNX{Hi&`SJS4sCRcMlURl!0utP^%@87-C%lwbRISekPL|)~l-J@Y zK2Ty_zqZJKl`>|dBf;@}!QGc2&^qz*x^EE0UPQqnX>m~(^4Ux2_KVs>%7n(WkH>Or z10@X(8~atMt{FE-0R3d%fH2+N_kHm37x5JQ+z0KgW^0D)n}X8r`LXNJm{vS<1QB#^ z=RqP5qK5Y@8_~+7#2#}UM?Du3b98cUGRD0R2Xz=)L+z!-?^uJiajM6fIrN!w6MHFe zsxK=IC}cz`cNog5=nH>bO3JQyaI80^LRo~@M?k8^>@LGf9|!wx8z?+<(fEcRooa=K zU#Uy5?hW0#R2o><1kTPcI`KZP=1#i*s`{;Y8z#w`we3CfaQ2sfgG=tZ8h<+YxmV*) z!cY6~-gWV6)9aJLcNq)x(FXkKYF7JCuoSjKj&Lz?;rd(I)8UW4tLC~&*uqz(M3+@s zxdfa!tJCVb3?;b#q%;gSN2|yfj>t`2Vo?CjL-{@7r(~j4it?VT>*NzJxILos_{uwy};a%!I6C&AtoS3MpeB z%2KvyM2L(nktJC}g+e_y{l35V`MuBcAH1*6C)LNe?)$p0^SsXUI*#K!Z;XjMgZN}D zn?JQ$vrxr{$!K{}5OpQz`zMUyzQYF^TRRvmZ_g-At3*YQB10W+@rjE;M5=CWp5_O6 zY-x&aElGr0&*K4Xsq*%cWkkh^!LQ7H{#E^5{-Y3*2yoJZ+isuqy;05x@ZuCjgecle zaO3Oauj=xFKlsYozI~nOxUr;ir}%{#aQmv+o8zypQ0dT#)zxrf)0Muor!CfZCvH+) zPcEx=TKamHogBIcOZ1x6Ya{S`D6#)cSmn-qfn9!UO(~?MWvP9fIjmD=s)Zmg?FeuA z3sx4O<_CCZ`3CSyzhjV|5+|e1tXG5@^ zpOQB1r0Rz5lIj=VVdmT)TMqoow%!1)aKwai2Q*Pf_{=0ELvnY!iT8&8M0WO|R3w^8 zunVDtvR~ulbqC+*kNUU4@ikvlHJH=ugvSHbGKNY4-8X#LJx@uIhiGp6KIgX6gnYYF^}Tgj((gKA1+USz!H^3%4$ThYC{8B zb4c+PEo0Ur&;(77s*cPQ*;u$s^KsdRY;WX=6 z>$#x6PdV{BX2Ms6p@rxA>anK5_ z{fiQ}bTClW%=!LppU5xD{7Ct}Hycf`PrA{`Hb~*7W6Y1)&4?qJw4H^8oz^!}k53kG z=}O0wZukCo_}2`*Pn-Va=2aBNppuQZ*=uEuTq}=n1|3JSFy@6J{0ctGPQbB~Uo0V* z0b>^BY-Nl8;uDv;YZ%`pl_oloP%srv?*B!Q>RZ9B&|W|V1Oa+ zujP-8()f5a->>>^hSc92z>SZvfkml-xfTfb|=!jgAop z=AsKxU6Eh!9#IVa(e1uDpu;2qY#}9%=E+-28O67P2qydtjpBq6Df@wNj6&Aho=goC zY>Q#OIZkw$)FP-{uF_F~?84$8RbT{pEtW{NYLLHuyif3mPoJd0j#$W`#N8w^B|RnG z-r1&_6xpf@w8km66pYI6wdj6ojc%EoF1q33SN7O#FNC2-SHz9AImz~k3sH1oYBlru z6?OO&t(*V|@U)h18IyaO7d`m#zaJLyPf&2_TevqfBQh2BPQpRDk2SlQ@FlTuq_J$o zGNW=9sP@c%W5;G$K$TarUyb6kV|9~F{K;&wWeRL~EeZSRNd+u1B^U0&M_uaBiY4}F zsdQdbISErb!5pm)kyQvY@c@LwtH0&rOB?&jinf0a99lVq=sR~Ef_G2@X_~s1&MtSp zvB5&cJXrB1iJ#ZvZ&qxu8IbrO5H+H6GI&pIl!V8rqR2fyzT?t-5)3!&byGA^)}@kl z_WS)&sax@;68Cm%lEEB#IdEbgJY9a99hB?7S`b{I32C{6r$+F{-o(z0gAw7dGJ>IJ zaaeC%O-5i9>3f6`N}#euEK@MQdxH~(8Zi{k+YHI8%5j3R^M8c1&8IH5C z&5xG~8;p%Hgiz`~D}2dL|19O7)k7c`n6JwEG>Kh{b`)$%*2M_+*n8_>VlEppG^y9| z<~6$?;0W`97N(S?4l3~haRmt&h$@A9XFI<+TK_k`nOxv`($-F1LMfb=ST7kdTTj1v z+V^`Y^dJJw@XxW@Ay;w=Gq`0_yWI`LjT`Eq9R|p$mE%SC;%2~AB4%WB#KZ^90{uJ` zI)LG@F~aZ8Jvw9SEw=17e^XIsT*GaHX0Gwrg?Pq+P0SmY4wMnHim|$B)&qkckchRY zWb3Ns5D?Q=s>*g#N)zRJ^MQwqZ%yX(?;b^c-Z7p_P2v3y`p3!3t~Alb67M9<7#~LY zddK(Wm?865rUSb)iHBsLjSB4_`mb)JX=b+YbqKk?liWUOa=K#uz!T$HU%O%e_t1S6 z9#hZ8h&-_5uhcV2eQ1{YBfM4pM#Xbd-kRgQvfe9hsr@+CfI|vVCcWW8;4M5y-6thw z!){OXs@~zozD#L$TL!K?{bGPrRaB>kf<>I+GANLn;Pi~5N{t^4X{*egF=%r{7|s`g zy(Zz7`Wk1IJ}gfvQbyjK2ZYd(jm!-dbvFrc9aIMOFhkJIb<#F7;Ue!1@bAReIAE;J zSQS+EHrHiOIg}Ojng+=;#^wRT3-(t0a;bn($)EhTVW&4 z$c_GLcfZ2!H(t~CGru=kxC_)cC+P61P4o37b(=}~pZLCYUeT`sFAfk~Rn)#BBZ~^7 zxSLdx(kHL=G$n09@7T}C3}3rCQlgutK{HW*{P~T|>*=#lFw^ICL=)Pq{%H%~8l4U> z&*xJk{~^a#N{6fC?jPCjtBoHe=01NDblcPDEEPefvPAA?IQ)aw>;8zFZ*<=Juuv-e z?j^un7;|mTlEc18)g||%ty)9v3mR`Hm~`*1yQZfQqEE&x>S|W|Sf=Qt(iiD@dfKw- zZ>XF6l78~t>3|%Dz0%?vz~weivq@oY{-|Cw@8UWQb!E3ufPKN8NbZ1c67`OX2Z6|` z+t%3~(zaQV$@;7l>cIrB>x+_%=OF)tlYRd7cNT!NDdo=%a7t@g&}kf5`(5GOhLeSF zj*m!+sOW72zF@tXaky$c*hNm{D+=0eBZWCRoD&76322|_VOG-52(S4SuVO#&kIMzp z`~}kC#oII&tp>d8XJ=f$c-f2K9xFIih3|r8HJyqZ%xsjni3%IF9h?fqcl-PR^ZzX7 zUk5cfi9gvxMgRT z0?D7E^>dnq%TS#T+-J!CdPCg^+h+W8tX=YD$xF)P&ZP!h%WR;-T*hOhnw0D|3r--> z#<{fbiSVN?HSc)r;x4M1hNr$?{VC@{reLmS6~xeZi~pb?E&Q2xaT3|_QQo2xbECQV z!8*8tp6kF0RS8=T7q#q`x1)-wr@+p=(t^nq?!_=5Qt-mG5eVj9Mae;lt z9VTsNu*IAl&OWY_-4iCO{kkxXT(0avD?Y_Z}};LiQ0?6+N5A+JeeWhY7=kTA&Z+~>H^!#5$Vu6ZRn zOY?hf$i^CA$%#Ib$|XOnVPv!NF_a*r24e9e6$1!N8oPd>hZXd}Pj)HPf&nZ#+#6#P zyafc&y_(@eD_x69yo+#MayAGmm7>|BHLo7&Q8`D;lX$6wX=5}D1iIQn&im|I zkAk>!Dl_h34b=vt;%kH(PP>Y`kqtCc2@np(7DsbHcTh3sYp#-UuTW_V!66;Sy144Y z>RnaUTh8`K)k3N5%TA3DFj0$WKtO!?J?`5gF1LgG4(wGiw1d&@joi&u5}5n8wlA9% z0)Tu{&W6LoZpC12ZZlDbdo00i-Le&k~L*kV=CPEygG>TB$jxG z?IUm?@NLSiy@zCCAzU~Qp}v^~dH@Jlrr=W9qBH9bY?v!+K!U>oWcQyOeW=E1+hWYy zVu z+b$!c34vTdb{;`&dW*4OY{I3RGliYU?mNA?C@*Y;E0;&@S%O}ZmTt=m(~l{>7JS>X z^BJ^BH8ag&icouBBZPo8g#69DEOON{UBLQ0HvaJ0mg-J@)^{C`_#4<`+tM`6!c5N2qjN>&X!(;ktqifm za{`#E4d8qmwZ9A;+1P7;d!)G|)i0UlJOu~wka0DkWZ_#GZ3^m08T=>*HRcm5EkD05 zpfT=v-LhX}jFNlwFBi|)`c2BwObT)w*LZ2Qtz-=0Cj@SkeA@O|C3uN}FSP z_6!Wa&5QI+t=Dzk=@(CC3K1kfXu&;rf_oq#yR>M|(-flA@Qt>oPCtIKd(F5pIa_3v z24fE^>nn=lwtV0FW<%Gw;R!hgSlY*9E)uv0KLc2{Gd$soLTuBfe@;w3IVKEC?oBcF z%_iB(A>mkYgJDq_OXro??HK#kZ}dRYkZM=uB4_l7Ut=z-EW-OWj*0)q{G@?5O%8O+ zu8NTUMy^KhQv*h?)!-dz*B)5h7RUl>9-y_{e44pKvK5FlnUaFEgQ^E$j8b$C@;)c~hwCoNvP|oec2L;DF0LyI zG5Z;LW-hg}w2dTh2De@GJndei2I*>@<1k8mQ&uytL`xN?Ch1^!HbAkULaIR2tFNg5 z&?Ux>A$0enZ}`aW3i;H1AKzs14U8E;aNV@Oq_=VKk$sIe^XL0cJeb-Ru2n^c{lOj}SY4Eiij zT4m>IsHvQ$+OhSk$PUt17%KYF|JH^17lF5g zN)JCNS3o(YC(e?a{BLtHKb_a9m>92JmkA*_2M=`neq6JAd?T^;0Z@lQj{#Llh+r(Y zDyB`JO#f1!doN<};LRJa(Xw^$mUDEm@R*AaONU-kF-r%CwF6)On8{EtTGquT1zAA# zYx!LO2K|fjr-$6`&Y2)ebi{rf`t)KcCF6$+{r{4;;aOKPJ!rp5818^TX^MErPTQjZa{`2Z4j$lL%(3Bu6MO8Q55|0zWBWz1eJu||EfRP0DHQ5Bt zkCDQzaI8sBtnGvuQz&+}F++i~3Cf(>Z3Van2mO@9MC+acNGTJzrDX*k?$4aoU034@tuLNOlGmUF#;YtyIyp;b8PGp{**H~&;G4PVgmG}F)m zVn+p>gwM2V3rmv#Zn1ajPE;Cd8adQuPrpgG`>S$@6EPua;1M7#frqAIj>@q33G#6W z)%lUt&v3C|QIYp{2aIi&^a(<1bA_(fH6e(Jf@n3yNr#{^Vgf||1$XpOOJfMW&BW*o z*C+TYx>`$wXF2PAbg+jmPmQJtBXD*kug%sHlXW9EYbiqqc=&{p&S;Hs(jY|I|E4v& z6Kgc?neT>Gw!CetWVL;oWffsz0AhiAJbdNz<7a;9j2UE-~|AKhytb z072zRON6jB;#NF`3=AdjA$SEcHyyJH^Awb33|KgzrR__SAd;b;4@Tv~2`1!$`{%c<_u(p@U7^-*9<_6#l<><_9{#pW_m$zmpO*5GpKY%52uCG&n z?AIGBY#uLEoK~)wX8(V*b*xm#J@!c6s}&`eY;M6e4bNxzpTn`GhaiEa0&iA_mt-S= zlrjXt2p1Si+yBy>CMrA7Tuc_e+~Wo-D>L>?Wp3hxZLYe|kIMk97P8)@D;+r-7Go@6 zK%!-QrXF0p^jugO6S^;CW*}%$d8QzYFdsdA1lcuzpov;C64R!*;*rW+XE* z5@Aaz1LF;PL&=Iwwgmh&)scRL13@KA4%=KAo4pBoj{vSs7KAomq?5rCAKpV`Hgc9a z$Ue~CDpS}7Zs#p^E$g_KJHySAYeQ_`G7~koZv&&S;?1Te5TSI=?M8cpz-!%}F(neQ zM31o~V3Vyuk=3fZ0~VIpyOz&7UJa}U=j$IEP%Qv*t&Ah$W2j*_o&b9XCtt;v8vJik z&#N>@>T@&c$hv?!Lw$0)fBVGZ0FMXG9IUWV&nL}LKc}#(TJ)dBpa3A6-kl+UWNo6h z6`r)E8q*`FTx}u>?n_eVKx1)@8M#hOnRNKPaa$>U7s4)}F1@Apgp0=;fqmOpreH>3 z!jEf-?SJ?TK-1l9|580Zd>%P0vHxAGXx2MOTDD`LzP2ov4UswNb27kh;0HJs0Gm~eB?Tpb z{@KOGHOpKoT+P`)mMJ*k2!1WF7FsrUrZmBx@6!_=i`-GEZ?Co z)}!P`^3?|z0ot+bK?_qeWKC4X6mrX&zy9Wp6i|yB;z>u#_8!*1ud$9U)3v&4J_} zzF$h532-S1a;YkofQacuho1w!{w_>osf;s|mUC#bj+EyHoe0-0(Rb5HpxG<9DM`DumAhuEpR3qnc8%af$td}&Zc#KQZ*8jz*oK8 z13&Bd7bj%#1; zU<=~rRTC+>7QF91%2oVy2$HFmL2(v=&tk+R4I=w85h06=0_ZA^GO=3%uRs7Q?(xpn z({yfdis6Aa=*%62WS8bj`=A3=h3o>SJt>n+xUhk)8K$2|K{oCP~Orjb% zUgHUH4^!2@x4v$(d{DJMx;LFWcF0I(-IxlXu;O^hs8!u$d%Ba(u@XgX;^%di`ld!>GvZ+FP7+V|( zH+N3EySVyie)r3XjOKj$;9nq8J?|?QZR;6qma6`Dcw2t~h!S-dH9HkQx4-_`p66(k z{X&v$>L*~KkEbR%HqizyGU^>$RK8H{y6muO(}4gdz#*=e;h2SuRd&U9`bY5DKK2&52qj= zwGz(p!hGw8%8F}JeKn+Or?S$1dx3WsX!IpHpT@e9$^l@Vr|8-r?E;hqlI%?aXNqJL zRg*Y>UG{CIikaon_l<0RVSthm8N5OSXxk);qn2D2Lor=w`91H9waL{Qf#>7iMY zHw`HwpXF-ErsJSA;r5xRoeTMhvAWR~g6az5czzLjiM!O^65m&7nCZ!1Q#C&Z6$=Og zsaHd^-4;t&fcO%Jy8#vJDQ9akOT)e5x3T6!$s+}KJGuC3ZW48@h~=~I=h$1dGS&it&&>`@6ERzHXe@y`yK}B!EhVIh@ zC5k@F!rD6{Qy@Rb8G}r97ZIj{$j{nr+R5#FQ=Xb)dwpDz4y#bExt8CT#xpx*?0`=O`FDTN zoU4LG8q>-Qyr5H+sc3ushPtJ88#`;JBO31)b#HCzj8!{u90z#rDXTc1Ck#`mQr2wd z*!5{WY4v*MUzNdw01WwD*n&S7xNen>f93SFbP=hiKJAv*o%t1)8;JO}kfnCz_isZ+ z%X}WBm_C&yZf2Bomf9x<5Ncyb5P2 z(Da10>l^q7Cu0p`Beb3w;NiO!i=w41p%Xd8dlXfSjY&3VQjady>Dy=Mi~i5O#-Ay< z21rKgNJ{rQohFUND4mTcvy%rWx0FpL22_wXA)c<*$A<~4wAWVg!qd~3K=nAZ`QTu| zvzw0Yx10cb&Fcvo4(c+E8vXE0#fjTXKu(4VbZUj-E6)LCR&|=&Y^%h*SYi|x)hL~1W0Qi>{Tu%U`{BS=Jb0Fhi};mtA-ui0m0%*}ZWOi)KC1iQ$dEJiT~lv%hKB_Q;lnJNnlEQ-o;S zCy<8FV@g~3Yv_~3`2m6*b^1?^zI2rc%gfhnatSJSn(vuUUSoNa)&hJMh5c3&K0Dnt zKH9_bB934ISJicOgu0`TZ?-DUd_vwU8aaT!J;3BbPjVDUK2S$E_n0S}$ddvQX}k8V z?XRav+g&>-uzdgJty!PeC$Z*7iXd2+N(#@HX@783!w+JF`er}`5qkoA0z zGTkvKO+dmBk%h0y!DqB-l_}S`RSgyu0AMFB4*kAi=V=9xLpt4M1eb2jh|PN~m7u-B zN_`_}`86LQVkOs>8Ru5MkTle(kP*M#nkstf@4}L*=(qo%JiQ#?!JRgfKFcVk2$}tS+d%D z7X0(z;G;EZ#@#FGH>YS{DnN-Iuajc)Eiitv(v^dNYBEn`m#=0N;q>po>if7sP}$vC z7n8!VrFxG)E79t;sB>|a4b@uUi$&NCO^;eu^K3FB52I7v^>763goV2XUVu9)m|PlFB(%Kw=1uC|%m;U1n5NOi zWizAJGx{eq8}eR>=kdiN%?O79nvMX-{A0A^$9dFTH0*sCl@h%r|Z8o{b;(kq?rgP&dYR{v+3Ujx#A@mOj>M@b8uVT|L z0W=LLNsUoMJYY92Hzb*#j^wcDcP|Kxi;6NS7fd@TzpfPU%{$%hqbA$02y})r^bS(x z&TH2>W;s$UOYD0$Y2YRI5wEx+lHDbH9pGfAjEkkISPM6`hkpL%S4l4=h(P?iPE0cN z3l!e*cg;h-%+6WS&EFuju=0i#wduHZd6R>zS7w!D_hC;4_G5o_^RI=0NL%T6Z(gMV z*L|hxZR6vmjkm$x)J`^=4JNeE*(r_FFTG#{%8a;TGKX5*oL9(5pERB5 z-Z8@mmMmIueTI$Dfn&lnHBV=jdt9paZ<@VQ^QJ%t94RE`yg^}gj7WO{DS|p}UT%vg z4004oqV+Hc3(0RF1!3nt;K<5_{h^5rOP4*@E=Mc6X@k)tq*y60tc#Bkn3fw1jh#q0 z;%hcA1ZOcsG}G%Veuk`uo(zmUU;u~BVq!Hjw38SfF_LQ6JTpuWD1IJq!FcnU2~~8D zvw#)@-)kQf&9wK2Sbuj*A2vQUG)3tzd9>qMrR7(Ah$VLU`7;Xj`80+VS)&(JJ&gWc zsqtegwR}0WG=7J#W1a-ho5e!TM&UYUBvh`*Cf)ECcwuP*Cb>@;>c_9=}azUu;MQ7#~4Jsaeq+4Lx`X*tl4v?dkov~OKT z1)oe}2+M7W-k{+_ZpiK%=Qqbo5Bmx!AH_@ZGioW^7R*m?E=rFcPgTjCe5w}G3$w_| ziTCF;Jd2sv>W=az9C43f1=hh9Ni>+->LJyJstI~c;=1H#?ncV}*QBS`eE^F1qr!x3q0m<`c@M7~}`P4zUP( zfXIt1!1*)K;Wy!VAtz>-=0NH_KYD{Xj=HH z>0mx!FYPFdCx1-ch0hzCcIAZZ!HmA!yER6TmLd`@^9&v?W3V6z{|tkcz0|dyFMnS| zbT5p5Z>pveC4INOE?SNm*S+Oqh1L{fors>q@V5kca)+OcC*TN>29_6X zV{#zC8NK8?j!hlT*t;ayBd;%aHa8=v2f(@GZ{B>r6rP4|>u& zozk2yW=1P{N0p{@=#P(_qA1Fg?v;>v9`rj{GqnhK8GgvB7QAl!2!2+k9T8=wN(CiE z<6ex&rI=+^D>O5e9bXx7YwiH$$_5YmDr^4?sIDH*(oZ6J4(7o$xif8EfF8)DlZOUp?n(l#@` zd+yFC^ntVT!ybS>fACJco9g}Nwcj=DQ~h{H{qL{x4EvbIC*v1p+EirL0QE&I>3TiY zA4p6=PyB5Ny|<(NHbHWav_@DNuQ&{F;JRAY+`LWf&^&H@6;Q3TGIFNCjeY7@Nx)?) zY-&57l(oFI@syZ=FMDB6#sNt2_O19k>dwUM;UqP*Gm$^2j4q}JM*pLKkhEEWGT#)o zyDbEu`@^$DkPZJiem%jAt7F7}0g!(>MH*}k;UXeam~-?Z6QW+SD}{nOXnY!thrWD& zl&U|b&tGn(RTE1bbo(|k^a^6J0;Ggw82vLH<~Qy8;!OBVP!VgO&To_y#y+GVZBCnIAPBl!l8axkBQ!dU-(NApEThyB@;Iq z^BUPRO<=bDHWl9HOlgWbqgk6!0mQA0CuyTna>5-Ud`dzRGkktGPVy7NR5Ir=At&gc zPN#h}4)mMLzjqrV&~n#loF3j3acHV(;wC1gxE2E40t8b<0jBrkc}g+n_mj&O$xcCX7~UB zuT**&zkWDoqd9rZJzs8yQLW<)p0v#>VtiObkYt;A2h0=T@k6$Rn_7W+mb-{*tx~JL zt7Dtl%i`Ww?2ilq(bfG^#J;8y{dF+IC!DhA@{_gzMA0M=Z7<${%J@>&y*?XNJlgi| z;{ESO8U50PZvQAFD~}tzH5_t#KTAnFggZz|8!6j=?aB?yYJA+jJHO&I>9FrdoZoh8 znc)`pJM1{!P2jaYEZU9}sfixC>4UjrDTss#`Q!E6OiH)MWAHt7zB-uj!VEW!EL2U{ zpyaY*2X#U8=fM%V&JUQZVk!19xG}wC#j?`y_FV7ka@_L0dYm(rW`0`B?3+=CO+q`8kqK%XVWzrB z;dhenpuw$$_HBf`tqf0)I$Vl9?^DtiG}Hc-J;rq)%YG@ZfpcAf&Of!BW5TnD+b7?? z;GmTe`@0^%ffez|rCKn3G_9*I$x-<`1zP4^I~~3I z{L06i$)>jW@6hA&TdNaJrl{i+YsOqsrCx-ux7jpt#syt^PxET>eSjY`&&omu9 zxv=O)v{#zR-7V8*O*hV)MyTTE@uVR0MHhHXSm&6rkK%!lkB8NQFhGKKsf1bZ8N~b( z?Iw;PE*bR8WQc$fly6oNPB9v@gK%03OOe{l9HN^ZK*?RHMUSMG5^g9Fq^JPHxhFmT zCQ;*7ybOpF9^`40X@1X!5r(!t=cdx)6(^c<#zU{+%7dr=N_=_+3Cmh!XY-~3=smG< zA%<%C8EI5@^H?D!)UZ+hjfsb8k?rKTkr*B-rhBB8xcG<#5JB|g_+@KGTPqc|1u8+`EzgN9fcpHR1W-x}qH_@#M5iXF06^POBlKg5wyh{crl*EF$-{h*px*fiR)O&+pL9Hb za){OPtfK+leth??fJZ7zQ-%ji6y-aocKHOVU++J=Q1_sO&-rnEBvI&Axq^>dF_rD{ zTa1Q-*dXIAy8Tr;WE3D(9Ssg@Fu$ij-gn!RuO>rbM`u7&J{(k3>bFPd?3v#ai<_sr zLQmZ}{moh*_&Hh!S=&^6Ic50w-fDllu9-Jgtk@tflc}4!olf1q{Va^CsVMKgW1;SbaPV4)^n4LN{!Rp**tB1q5jXoNKEXVq%2RNJi}0t3)Y-7XfLwv_L@9dWz#& zFYfLlmXwh@40Api7IJfSg|Fx*q>FgDx9DNkad)7i-B)w|75Z3Xq0-kFS785(1O-(!o3t@9-s&*KPf;G+lFuy##@ z%wf?2E7{FN*_sA8-@Rw!!>}7qfQoJ5XI$wUUuHtxGYvr{8;I-ny{9D+W{U?(z3nN-*Cs|Jzu$IH zsio#Hv2DC~^&5Su7{f=wUKKzS>Z^tWin$5Y9}G+p(20Te853vwQUQT>$^KDroii5> z&~*KSO!H_TKjl$>dE2jpH3HR-mt5&#A==+PqNlf&phiahXRIPu)nWx797+@b6Y1Rq z=&S0#_qV6aQ2-+smNB?`^x_DO7egG>^G|MhC+WN@2*&ZhFpfp*+2ps@mqOfTOr(9N zS9&OVTRyZ~TPscR9?YG3blx7#xazoQcdk;^65@=WXtCHl8F%fx!eslj$335g8efc9 zi$llw{IUPm@RgKtP3G4nVrsD%1CkoJFMCjnqzjHeILK-KtBv*3=aQ?RRK5xwX=b^` zqB#zUeC}L}jlQr3!#8HN+9R61r4rA(avC6 z#f|}lqRMQHHApa#uTGqF|EQR#qoOuB4DRkpv&kGGJ(j#IDP8A(4utG-pf&!*H z$)t9#Tl9YJBuk1(*xom8*sTWu)FtZ3ZSGtv-@6tHlzHMGT#hVN!%51;7tw2w!FhHL zI(EKm9J7E802HpQz<~yS)-dGtk}M$ewn6&gTj-`n+=w=AQg!=x;Q9N=6>$t zeSXC}-znnZp~iwk{GABfXUPiJ9pBwkX542R zFt-0VBt<1E=vLym(!9K&x-zi`RQXQ;J*E03mq9YkZ(m6jFhL@wjs>gD`$KYVFE_i})nU8Y$k34*WTSjagb$L`uJUK~g(z)xQr_x8w zt{zUOKIllJ{ns^-;_-1!?LGJIs_aQ6g3UJt8+=VGl#xH>hAz#m+&sCFR)({9*L|pAQjfakU)8;X zy^ZX5EhT03GNzl(-r_xI*qA*u4jmLX$#}UYSb?cNG(K0CjTALnll({O*pTxtLSu36 za%QRgAL^>=o(C-r(4pj`X4ZNm$K38vjE`=Ki`E5&0Fb^B$>^ub;M+A(oUZ*fglFN4 z?@fbQe<>`>#l~IkQ3_AXsJc5IqQ7|9N&u0c5Faw8HjgwGI(MY8wxN zQ{k9w1RIPT!)<=Doc<3##Lm2#JaxOrrw3Yk8r5>lCc`AE!GVlaknN!B9JjRL&z%aZ zyXEs1pa$ar-o36i68!5I zo1cyOEq*=q`9R?gl}?SS@Yd)jmnL=JX75+3U^{N!R8pCg!3AFWpi2!0Xcl^pWeEwn zyp8erc8XuY(LanVp0{hbYFWQA{no!3N%s)lm-U-wBa~|z$loH_QCR+=LFx^mCw||C zl=lcKf=#;Q4nhLKjkUB7KYp{EtY)&u6rR5SEX;Biyke0A2(#MjKf zUGHZ8-r_j^X`0iEO1{Z9tv*X+_sv`L9L{=qHDDtVSx3FM*(09>gWG!bYHFJ1^`cJ- z_kKQa=X;PV{4ANJ_Txj?l(cQBjr&J#kBUnOZ%`N7Ehchd|7KMc6Ovq5$YabQsz1_)c1hnp8{GAf7Ua5jN zlV=)zbzjOdmxk0mWlWgu_b^!g8vl>M;KHS#+ZLBk`kqW}`aJJVZ!QUyI>_AOpK%Y+ z^0N@hEn9M)dJ}uuIm(=sDvel`{`4mAjjXL@cMy^NtPI05jZlC)2UcTcHtU&Ogq#8q>x79E^nb(mr1J zB8H7%Xf&_zSoI>+e$05hf;%2gO8UIG9aP$eBf!sSAF^7aYu}C9dVje&6viGh7go=gBZs}I z70a-mjp2EEkK&crKP)sBrkpt;8I&6=R^ULy#C-E$308>APT0YKx-QC;Qn-F%M{8FawkeuttuTl+Py>pi~fqxTKEc_)CQ+)mHH zmNxPks8UDl=;`nVg;^WH+;23n37g#&{E4JC@KEp)^ zMd#O^4KjDmKuC}RQcTN(z3OOgkUu@PyCL_Jo_2LW337!xzF$5*c5F_VYTAYqdxp3A zlj}-8Hpq)LvDY)mr@O7Kscx^ikB7z<@Z0RVnScd*{*rQORm<&Y8+3f_k**|MjL0D2 zj-wJn$zbDdOlQU3)5uTZG6qAuf4n&|fW~*L zY9ia!K&pLVx_VV#LSv0f-62T{B-MJqT*?Q>KW*U_j|REvxwO;?L2ms^Ttgonf-s7P zh&vngv~rKhwkGCJR-gMWoVMOF|I_;S$IRcrk3a19PV0B7y1*rWi1|lHKMw!CYIET2 zm^`gF|GUU*9=Ti!{8@N&y0iJso;!X1T_ouL+8+1oN6{&5k_#7XNiSSryZ|Oa`ngyH z`1uD)x%dURp0&t@JOYtiDZ2oC3~ zw*32!DCbDbz_yO$X;fd>ccPr+7~dzdglQ?3R&9`AU8*&sF>G(Hr$lyMOlgW#{PA}9 zX@#m{#1omFhZ08+vz?gS>_(rtYSUwO^~jV3#q`nBXXPK}Yn98O%nt*|h9|48RAzIO zu(mH-4Y#LueTQRTsHT;CZ(sY-NXeeqOjOXuPvI`c*WFVFc6c>O_%oq4B zJpG;*7YF>y0IdJR*g2GY3U5S->&1hGgro;)Spt#LBw2!*_mT|cc%G?X4Y9Q0 zz9g4v`^m4a{#tc|Y&K&5Vum&Idn?$ZX|*ZVPR1V%e}IyAeF%5}qNdyDwxdZJHdq#r z4wm~WEh{fA4czAcWhOq2Y_tWy9IpdyrWyWsA9C{d|NmX+?3w-hdYEnMw+vy3|0ecR z!{#H`!-{8c#;RxIwE z47P4uuRxM3Z=;qmtoP>C7b0ABwN|}cU&bUALmDYVzU$&1(=)u+6eaXlCT%nJVZT=# zjy;p-o5>tMnij2)-+AH3`S|nTrZ&yRUpVn^S1&W#(f#x}l1DyXe$@9@q4wp@ukpD9 z7O+jy8wT8a>h+xcj`#0{7aaGtt9z(RlCfVE%jn-P8s=fwo=$tXIvEZ$T~~}=%*Wb9 zZzQzBg@i;@?1IYPzkwFebIzr(eiMbI-)J<`eSDb-zMv?i?XBH=rS!8SuCk42F&6(@ zGx39RlJ)i>&92!(YYh-l^?#ABgUbZY)yBE95T9qb@@LXlP8@vf(3fv0%qvUoX;K8 z#mU=6+r!Dz_spDwisyGe!UJA^BU|AH&AUrjF7$+6T6CufEK-Yth@r@uIvY|TA;%|7 z-U>5TE2$T(rk;A0l$2=m1RVYS?(p|`s$S~P=Fqo=$Y0xY=~4+AFGGJV4Lu+2I{h*9 zyzBI6U*msu_vPVGe&OFJDb-N6zBTq_%lMXL#?C{0qYOeA6qQP01|hPQY-KCPPNHOa zB*|E#i0qZ9$THT9r6`(6zw^v!{q?@r`}ccYuE)%I&bgP*{kiXR%ypY*`NATZOWw}+ z+t7>BboC2gr+Uc3cFXPL8ToHt$o|XV+uxVLcg8Qx-L|W)(j4qr05_K!g#EvD3;TUu zrjN-#^!u`WyMK9kWLwO)rKtrwjjy%-{@;4I`oAqNl8rPje4{s$HT=GQdHi|eWreVx z?!X8TK(C+CsP?V&qf-S)UUVw$+tK}I?suq|8SZslF(0_4xnkzF;G+J1p*7MyhL@B{euB7% zktue1ZH3}v-7#~_;Th@;$GXyg(ZHCer=Z@F3?P^ zFZU|?*Eau(fPn*i6~aV9a3q9@g5W3!6Ai)95GDqKV<1c{1jj;{YY==5!d!>o>kuXm zg5w}eJOsx>7%~KtAxr`UCqS4)2u_4BNf4X_VUi&@8N#GMa0-M;h2T^OlLo=L6~9) zE`~7oA^1LoDS_Y;LdchqHwjKt|F@s+bO*TP|JNTsV+A_<>&Y6i0o|T~-qlVt;w+7# zt0|0K-&JF#Id(RvK6xqE_1qD@jyV2WlQ-yur3n)9E?cQKHf<@>eNzWVTacnFUx)Xi zV&%H7_fHFb9XZTdPq=P$32Lq>y!rEu$U(kQ%`WYhp*8)S8ib|&{*iMrCDGIO`22Fb zHCl->#q7K5%UaQm{EfV~H4H@6+RI!=%GTUNMmtSHX+Gcbm0G@nwHB96Qy#Pi?hO9u z``{6m;!IR_8|&h$GS{m%t6sCcUX@6_M3Sx(tSaf+Hfl~GB~#HJsAFO3G+y#$HxVb%3zL2q zU4msFOT&A|09NJA=AUnj-o9#JQ$AnhHn_Ed|9PVIp#4GOlnTc^{^u{}fz3;w&CFi@cv%$hRFLEo9Ud>BAt$r??wv-*Mehx!O1dfd&3Ji{h%LU`2fiLF- z5HxPwK9d5sZtvKHSyyKo) z={q_HN8svFuh5N~8@D#vhN^s#QLSIogKjhly~AfqZ|Lh~FrmlOK=dsULx^+|u@*6% zWXA+k{M^Sky2%m}4U4L<2nrWU5f*gd=4HA8kcfN2n28;tZfE>qB#y3EQ|;5;5u5X- z00lk|Qu7AU$-v;Zpw|>X7kT)!aA{QP`tDaH(QUmh?+aX|4U4o?Iqva3w?XLjP&>t; z)EfkLYAic?8Y_TlK<04@xP=Q&{eWp+`^zhaq8?w=G3mOOOK7if!G-Uj2TlfmEV3Tl zs#5=8ndvT|xF-ja4Cm7pH&*lc4GXJnD;4R|?$vcrspk9U8fFVuY`ri^pgaLC03s!r z_VRF zi9rnpZ%a84qJDX`l9|246p$)Jfr3$H^xs~~c6R!~-4%1D$!!dC+DaMT8jo=%4&9mr zpcv^O`7s&nW&W)DgV)O+U>ThPR_2dBQdDpf@c~I8x~CUTd(y+3)VLmVJ*J!0Tac>7(p_>x;b%L~YytXg%#2ufO`gmCOshSpVntb!+QlVC5q8iAjxD24!6BjNq_}e zc?CeN{0gf7wBVw%xh>|3gQWdsi_m!C);ZL2z9g3_woYLq>S(5-gMoA8>)QC7XD(O)5KUXs$ zDb9)Ttn2{ZUBtCK8VU_{qHC1vG+oTrDC?X<86VbCJ8H;_fAoU8U09BzGh}W{Y^h?q zD6URiA9a*k5FVECudyc1p4#E3c>z1!R{yqwEKUp!MD6PEiMh}2VaLmd&7R`kfg)}X zDi@pX3r@i5Xa{|9&F95yOPwzUo)pXF$i}|&V3B1%Xx?|`Fz!+ul(2SUIzh^H_lFaY z>qHG#2WPTL>dt8M3ThkUEw-WGgTs>1=r>$BTnzv{A3b|2_bNgA46FUct(qZQ#<^EjIbv;rbG&@f>l$Qp+=@&z z3Hg~P2kYC4ZIfTi84nWmB_JX z+_mOp-u-VGK|I7vRjLH7AwN~FYDb$Y6~d3r4i~t2AL(9P5wcLhV!oBAEHi`6M^iP~ zJ!An?(&uF}$GM-X=)4Jfq!V~8Oi6SH>Zn+bEJ>A9KL+5s+iP(b9`M12Rho*)al>`c zSa4Dzn@I03*CS|vuxWs>MFxpA&{)hlQ%E1HkEN~lup!|!A3xQ?kJ)DjP|$G;65*&D zQaQ4_=ek+*d9nG_XFG)gEb`9Tqy<=LKK5R1iyxczWEG0(UK{p)L$%UQK&tZLjDXA6 zE@rezgnZY?-_RtQzdHEkO60~5pZRph=7<10hW@B$VdkMgr{j3`s_A@a% z?ClA{G99FC9C$6$Q!*U!5Z3<>UbVfj=4n#}k8B8_O#xPhJu5T}YKiug+=03wk&`?C z2N+^?K(1A=QD;}}o;l{HHOj5Q=N1~+N8aFmQY|B`3FL5-?%mmHKxV(uQSND!=nVI4 zUqqwIrT7eNEW?u%J&a6Z2C-Ij)EF-uS;4loE%3Y#;PeiVR*5nqx&X^MmH0p;$pA#2 z%mlX|5sb)$DC;?O*$;;IrEL&ka{F2(2&6ZAorL#{ZvN^|gNLOv1`n@8>I=7LQ}_7$ z#RD!U{c7HEKkVim-ob}W^y;4-GS&j=4JyoZkTTgWMn(kFFr;=Rju|Ml?00p)422|^ zeqYk}I01Vp45T$D5BtF#$h$gYl}m*X`XZDimUH`2tv5781DgOb9t~A)t z1tx~~6)ojh1Ek{EwnoNfw7s2S8_w9YS(L-&cs}~ke*9q@j=LrU$3`wR4|4uw_lPT^ zKR^ddaB=!|TDBiQC`&B?8P1>KcUMYTXO>9^rJYRT#a6PJY(E>K-?Q!4C>XqD zN^GoMOauh`9>iXD@TeczjKNCtTA%a<8Ejny-|8}ZBuG!2KRho3^dAEpbn^~->=96k zm2z#WwMO{)=kk_2N=g8a4$(E|^LBTL-s9;s75$$1LQjzV^pHJa$|?t^SN)U<-m z%T!8@E7v3k@nT6=ZufYZ#(cR)i@gXUhYC^_kY%qM$*Ejd^h=?~^?t8v(;yLlscH`p zU5uzp>bhv}!2cxFaW-aP6Et0{f2GRE*@z!Z0lStlub`MWbMr_hU-~82Vl6ZYwi6?* z&DK?DYKbjlJ0A$P+e*AQI|^#~FE-p{*l@QTbtD@U8y|OEpJlJd)7rA(0gwyE5-!&F z(b@+1h3x%|YAzV%DQS*Sg7neWAp;tgk|I?iE2Z^Zw3(=8sxxXRR%ph+5GlY)TE?u2 z8RJuWGK_t>!xgXwGg8GkL?q6dfd|aBTYIR9l*%}Bz0Xw_sBKy#;WE@y&?yE0P0xqx zqc84DL3MBAM~Wb?Il~A`?;iURZUvE*jj@79H$>l-S=}G36kyzbc5rCfkkPyyt|ZsBo{$^AzTy!Hmr78Mecx zF7+18?%1yPH#EpU(U=PP6%BBdA{(au>Q+m1sf-n~R15)j#Bz7?>@#MSxRR+P1WrFc zcDvnU-K^lWAZEIJYEz%Y)PeFHb&J`lC6bpa7sO^6n-l8BNb64+e&yU<(pp(?cdgt^*+{_o z$ONna52H}szF#F_{Ns?M*LMt{7KGt^+V?-KJIL+NL~`#khooRX-XM9!b3 zNpHoL0Nzs7t&0k=5nF7W_;+T5k73k0-^o`me9ji|*kVv~?P0b*` z!uC2eq>zsvE~B5Sk~wE+M&Q{czc-5XZPhz0S$-6USC4(ol zni@7r#&VgfZ?C@?Se=D;{1!W$=-~L_V%>VF6Jq{Rtxm`6C+32&m4~H9hFFs%gzT-U zxK6dUzWAKB*sDA}TMYKd$ZZkkN@q!WO>4U*R@>B2GA^EeOYIzb{#B%vy?nY+g#R&I z`aI_QkjaQu=i7o0DzAdWq>L+f*J=``#t1IT%Pp2f;lOsJ>3-2=u zvY7UI{9#_svv-I_40D;1K)FT<#*{dVjH?`x&ywHeE53MJPUy|i)c4*;Vj^*^R`MnB z=39%Xlf*|4hX?CQdu>An+v=5Ud^ry~MUU$6i>wI!zy~m83c>-28)G?HNChZmR)sPA?O2Q`$U9}eZ zLX$vMsBI_dAeDckWZaAHQG+FiB1ndHM`WNh)9n-}?& z`a$2=?q(w+^MMJ4c;OGd8e^BbMsO%YP0+42zRpuIIVaC| zo9_-^>02+Ju;S0-^gVO;;Llj0XgMNXNUPdibx_SO_g;f#$JXrL^}E`ad`BE5+pkdT zLanU2KNL(f5+x1T2a_dFXrxa$sLd5>v^o3Q=VTcvdY<{Z7^cJiDRICuZ)u!wxRZL-yVG|Jw@;cj*IyZ{SHlRJ zZ&c0j%Tg_++9iFg78$cmZR%m1+ci@dwHd@46*%&KLyjkvl6&2>sxY*o)uH=1M_ z4pFauj7tu~wfBF$D|AZCeM94-=CsL4&N?d1Hd^=;Vf*uaea-h{M1+OyE4iq>j*~`}@5KrF~0DehHftNQ*!OMti zrhM%QMQ)Es=f8?}IacIu&yd}1n?7Yf>Z3tlyBI=@qCHbPh@Hpw4|G0J@AM&DcRfCg zHu_-c$TsEN3Ax>XygA1`3xty1QrG>PCb`IaMD>CqIgMqgUZA#^+i~Jp_IBDtUE(g> zOOLiry@3v1s$t=L@x+XwnRZgt(5ly`=dL7+MGakPO2|#xldjaF=bMxk?3I?=ctg4_ z;ln#0erijO@z=)YMB|&vX6J6nn0O1>!Dr)zhzI9))+tu)Yafz%w#Q*KYVJRWT!-sp zHxEvgFDg{`3YD;r8G4Wz5>uY2t$&vkMcK8uvkr(En#>pWvH4_{7EC$u(KuBQt8n_z z;{LWPTVGC085Ta9qeR{n4^J$lId>oG9)Bg=klD2-y$D*wVrrC&d9&!1N7e1sy!q|D zyDUH7xYI^D(V1hu-ErU5(++Qd@N%njV4$rhk&gb9Wz_I&`yvXy3aho#^wGIN7~LL3#QzJyfB|Q8dl5 zGiTZmam{lTVoQOn!;|?}ARzm$M&^y|HHdn}1E5W^z3HfScc>+S4jy=BICE3)?2P+p zG3L$$4{4IGRQ!B=P(u5*QSk?)v|#rIz21v{{Pryrr&$J!=VxmZiEVh5F9>pPAw+O0 zd2f2u8wr>WA~RG0?-faTci|%z11B#kI2)=>Odsj?jeit#TRBfbn0Nq8Lhx!H2Jx+` zYyq#|GbTtBeSR50ozyVCx1y^?x`s!`gZROWG+`NVzQeA;7x%y24KtQg(BqHYR^f|>@V{Z}#c-PTvr9N6T(s`GDhhfl+8F| zp%bfx7?sV&4R@07T^(PiTL6H80>pS!^n7S^bZfL2A-;V>#gafwEF+TNZkYZ=a8(?! z5peFBI-$1;*10aPlmR=jcGK1%mP?SHGZcibcW}&uEqRH73k2P;%)WRJXp$btPj4VOX4JIu6je=~kh& zMpCB+RfsQTU~4f+_?9Zd3dNDyxW+KxH>`7zaKIacm1^4^fzvjOx;ngv`M=$j0T zz6fTN#L?pan0~tHqHGM0g{criHpc9_m)C*6ziFtg>XCn1I;j>ZtX=LLmf{Z7wwAv% z*F$IoW+N%iG24=Ul6WR*7G(L$2m0Vn6A+4oS7s5hy)O1P`sr|+eTbari zVCOPB(o&^{`!C`i72n*9dw04CQlgpnhygEe_!M(!qby64)uJ7%!-E>^6-UybuoNV( z7?yVw)GW;B-kRqO5mxvA^2K|Z{zATgdG;ab-CF4&VP%s8j|l(X+;#cQN6%2u5_NqI z3kwgk`{$RdHRJ;Nyqw+b4tcvCce6p7O7I513n(%BSNs!LVhA*>|79r)OD*WKvLhWo z<0g+mu7584_=!Vh8_;YC`W?6awr~vC0-DU2Ydu{^PWCP?PKfTm$|2~mwqyZ0pMU{e zzsb>F$B^@@gg=d7MVWUb0ChRr{&b%QI0KAuKY9G@aprZ`-`rO@yW5}^Xw?Q5i2tU& zche8;ZYPf)cXwNHi1CIY>#y!a2y85|1;Si_J6nDe*thvlfecZ*|7Oi-PSpO3Zwxw^!kx%AJ6-2W-z_qN%e>seUHFIZUqR}<}@%m3_s{3&2l7sG)6 zmrlq(h5p`#_){bcOAiqG!={y{#6MU6+4c2veeP?9Nx$`g;SJaUy^+k|VtEgOFu91l F`yZXLYODYN literal 0 HcmV?d00001 diff --git a/app/src/test/res/autotune/test1/oaps-iobCalc.2022-05-21.json b/app/src/test/res/autotune/test1/oaps-iobCalc.2022-05-21.json new file mode 100644 index 0000000000..92304dbf45 --- /dev/null +++ b/app/src/test/res/autotune/test1/oaps-iobCalc.2022-05-21.json @@ -0,0 +1,286 @@ +[ + { "iob": 5.249, "activity": 0.0391, "date": 1653099848000}, + { "iob": 5.292, "activity": 0.0438, "date": 1653100148000}, + { "iob": 4.964, "activity": 0.047, "date": 1653100449000}, + { "iob": 4.674, "activity": 0.0489, "date": 1653100748000}, + { "iob": 4.377, "activity": 0.0498, "date": 1653101048000}, + { "iob": 4.077, "activity": 0.0498, "date": 1653101348000}, + { "iob": 3.73, "activity": 0.0491, "date": 1653101648000}, + { "iob": 3.389, "activity": 0.0476, "date": 1653101948000}, + { "iob": 3.055, "activity": 0.0457, "date": 1653102249000}, + { "iob": 2.782, "activity": 0.0436, "date": 1653102548000}, + { "iob": 2.47, "activity": 0.0411, "date": 1653102848000}, + { "iob": 2.22, "activity": 0.0386, "date": 1653103149000}, + { "iob": 1.935, "activity": 0.0358, "date": 1653103448000}, + { "iob": 1.711, "activity": 0.0332, "date": 1653103748000}, + { "iob": 1.452, "activity": 0.0304, "date": 1653104049000}, + { "iob": 1.927, "activity": 0.028, "date": 1653104349000}, + { "iob": 1.84, "activity": 0.027, "date": 1653104648000}, + { "iob": 1.658, "activity": 0.0258, "date": 1653104949000}, + { "iob": 1.482, "activity": 0.0245, "date": 1653105248000}, + { "iob": 1.264, "activity": 0.0229, "date": 1653105549000}, + { "iob": 1.104, "activity": 0.0212, "date": 1653105848000}, + { "iob": 0.952, "activity": 0.0194, "date": 1653106149000}, + { "iob": 1.619, "activity": 0.0181, "date": 1653106449000}, + { "iob": 1.678, "activity": 0.0184, "date": 1653106749000}, + { "iob": 1.775, "activity": 0.0187, "date": 1653107048000}, + { "iob": 1.581, "activity": 0.019, "date": 1653107348000}, + { "iob": 1.437, "activity": 0.0188, "date": 1653107648000}, + { "iob": 1.294, "activity": 0.0183, "date": 1653107948000}, + { "iob": 1.153, "activity": 0.0176, "date": 1653108249000}, + { "iob": 1.017, "activity": 0.0167, "date": 1653108548000}, + { "iob": 0.887, "activity": 0.0156, "date": 1653108848000}, + { "iob": 1.011, "activity": 0.0147, "date": 1653109148000}, + { "iob": 0.889, "activity": 0.0141, "date": 1653109448000}, + { "iob": 0.771, "activity": 0.0133, "date": 1653109748000}, + { "iob": 0.656, "activity": 0.0124, "date": 1653110049000}, + { "iob": 0.547, "activity": 0.0114, "date": 1653110348000}, + { "iob": 0.392, "activity": 0.0103, "date": 1653110649000}, + { "iob": 0.294, "activity": 0.0091, "date": 1653110949000}, + { "iob": 0.2, "activity": 0.008, "date": 1653111249000}, + { "iob": 0.065, "activity": 0.0066, "date": 1653111549000}, + { "iob": 0.034, "activity": 0.0055, "date": 1653111849000}, + { "iob": 0.549, "activity": 0.0048, "date": 1653112148000}, + { "iob": 0.674, "activity": 0.0053, "date": 1653112449000}, + { "iob": 0.597, "activity": 0.0057, "date": 1653112749000}, + { "iob": 0.468, "activity": 0.0058, "date": 1653113049000}, + { "iob": 0.389, "activity": 0.0057, "date": 1653113349000}, + { "iob": 0.262, "activity": 0.0053, "date": 1653113649000}, + { "iob": 0.186, "activity": 0.0048, "date": 1653113949000}, + { "iob": 0.064, "activity": 0.0041, "date": 1653114249000}, + { "iob": -0.005, "activity": 0.0034, "date": 1653114549000}, + { "iob": -0.12, "activity": 0.0026, "date": 1653114849000}, + { "iob": -0.181, "activity": 0.0018, "date": 1653115149000}, + { "iob": -0.287, "activity": 0.0008, "date": 1653115449000}, + { "iob": -0.34, "activity": 0, "date": 1653115749000}, + { "iob": -0.436, "activity": -0.001, "date": 1653116049000}, + { "iob": -0.48, "activity": -0.0018, "date": 1653116349000}, + { "iob": -0.519, "activity": -0.0026, "date": 1653116649000}, + { "iob": -0.554, "activity": -0.0034, "date": 1653116949000}, + { "iob": -0.585, "activity": -0.0041, "date": 1653117249000}, + { "iob": -0.662, "activity": -0.0049, "date": 1653117549000}, + { "iob": -0.687, "activity": -0.0055, "date": 1653117848000}, + { "iob": -0.708, "activity": -0.0061, "date": 1653118149000}, + { "iob": -0.726, "activity": -0.0066, "date": 1653118449000}, + { "iob": -0.351, "activity": -0.0071, "date": 1653118748000}, + { "iob": -0.218, "activity": -0.0064, "date": 1653119049000}, + { "iob": -0.088, "activity": -0.0055, "date": 1653119349000}, + { "iob": 13.594, "activity": 0.0023, "date": 1653119649000}, + { "iob": 13.552, "activity": 0.0331, "date": 1653119949000}, + { "iob": 13.224, "activity": 0.0573, "date": 1653120249000}, + { "iob": 12.838, "activity": 0.076, "date": 1653120548000}, + { "iob": 12.322, "activity": 0.09, "date": 1653120849000}, + { "iob": 11.794, "activity": 0.1001, "date": 1653121149000}, + { "iob": 11.177, "activity": 0.1068, "date": 1653121449000}, + { "iob": 10.58, "activity": 0.111, "date": 1653121749000}, + { "iob": 9.919, "activity": 0.1129, "date": 1653122049000}, + { "iob": 9.254, "activity": 0.1129, "date": 1653122349000}, + { "iob": 8.643, "activity": 0.1114, "date": 1653122649000}, + { "iob": 7.992, "activity": 0.1088, "date": 1653122949000}, + { "iob": 7.406, "activity": 0.1053, "date": 1653123248000}, + { "iob": 7.111, "activity": 0.1012, "date": 1653123549000}, + { "iob": 6.515, "activity": 0.0971, "date": 1653123849000}, + { "iob": 5.99, "activity": 0.0927, "date": 1653124149000}, + { "iob": 5.439, "activity": 0.0878, "date": 1653124448000}, + { "iob": 4.962, "activity": 0.0828, "date": 1653124749000}, + { "iob": 4.462, "activity": 0.0775, "date": 1653125048000}, + { "iob": 4.036, "activity": 0.0724, "date": 1653125349000}, + { "iob": 3.638, "activity": 0.0672, "date": 1653125649000}, + { "iob": 3.214, "activity": 0.0621, "date": 1653125948000}, + { "iob": 2.866, "activity": 0.0571, "date": 1653126249000}, + { "iob": 2.494, "activity": 0.0522, "date": 1653126549000}, + { "iob": 2.193, "activity": 0.0476, "date": 1653126849000}, + { "iob": 1.867, "activity": 0.0431, "date": 1653127149000}, + { "iob": 1.563, "activity": 0.0388, "date": 1653127449000}, + { "iob": 1.329, "activity": 0.0347, "date": 1653127748000}, + { "iob": 1.115, "activity": 0.0309, "date": 1653128049000}, + { "iob": 0.87, "activity": 0.0272, "date": 1653128349000}, + { "iob": 0.692, "activity": 0.0239, "date": 1653128649000}, + { "iob": 0.482, "activity": 0.0206, "date": 1653128948000}, + { "iob": 0.287, "activity": 0.0176, "date": 1653129249000}, + { "iob": 0.156, "activity": 0.0148, "date": 1653129548000}, + { "iob": 0.038, "activity": 0.0122, "date": 1653129848000}, + { "iob": -0.067, "activity": 0.0099, "date": 1653130149000}, + { "iob": -0.161, "activity": 0.0078, "date": 1653130448000}, + { "iob": -0.195, "activity": 0.006, "date": 1653130748000}, + { "iob": -0.271, "activity": 0.0044, "date": 1653131049000}, + { "iob": -0.339, "activity": 0.0029, "date": 1653131349000}, + { "iob": -0.4, "activity": 0.0015, "date": 1653131649000}, + { "iob": -0.155, "activity": 0.0007, "date": 1653131948000}, + { "iob": 8.11, "activity": 0.0045, "date": 1653132249000}, + { "iob": 7.992, "activity": 0.0222, "date": 1653132549000}, + { "iob": 7.745, "activity": 0.0359, "date": 1653132849000}, + { "iob": 7.488, "activity": 0.0465, "date": 1653133149000}, + { "iob": 7.136, "activity": 0.0541, "date": 1653133449000}, + { "iob": 6.8, "activity": 0.0596, "date": 1653133749000}, + { "iob": 6.441, "activity": 0.0633, "date": 1653134049000}, + { "iob": 6.022, "activity": 0.0651, "date": 1653134349000}, + { "iob": 5.644, "activity": 0.0657, "date": 1653134649000}, + { "iob": 5.216, "activity": 0.0653, "date": 1653134949000}, + { "iob": 4.962, "activity": 0.0644, "date": 1653135249000}, + { "iob": 4.544, "activity": 0.0627, "date": 1653135549000}, + { "iob": 4.185, "activity": 0.0606, "date": 1653135849000}, + { "iob": 3.839, "activity": 0.058, "date": 1653136149000}, + { "iob": 3.456, "activity": 0.055, "date": 1653136449000}, + { "iob": 3.139, "activity": 0.0519, "date": 1653136749000}, + { "iob": 2.788, "activity": 0.0486, "date": 1653137049000}, + { "iob": 2.503, "activity": 0.0453, "date": 1653137350000}, + { "iob": 2.186, "activity": 0.0418, "date": 1653137649000}, + { "iob": 3.17, "activity": 0.0407, "date": 1653137949000}, + { "iob": 3.956, "activity": 0.0413, "date": 1653138249000}, + { "iob": 3.648, "activity": 0.042, "date": 1653138549000}, + { "iob": 4.126, "activity": 0.043, "date": 1653138849000}, + { "iob": 3.81, "activity": 0.0437, "date": 1653139150000}, + { "iob": 3.541, "activity": 0.0437, "date": 1653139450000}, + { "iob": 3.272, "activity": 0.0431, "date": 1653139749000}, + { "iob": 3.588, "activity": 0.0428, "date": 1653140049000}, + { "iob": 3.875, "activity": 0.0431, "date": 1653140349000}, + { "iob": 3.608, "activity": 0.0434, "date": 1653140648000}, + { "iob": 4.271, "activity": 0.0442, "date": 1653140949000}, + { "iob": 3.996, "activity": 0.0452, "date": 1653141249000}, + { "iob": 4.298, "activity": 0.0462, "date": 1653141548000}, + { "iob": 4.015, "activity": 0.0468, "date": 1653141849000}, + { "iob": 4.538, "activity": 0.0481, "date": 1653142149000}, + { "iob": 4.245, "activity": 0.0489, "date": 1653142449000}, + { "iob": 4.729, "activity": 0.05, "date": 1653142749000}, + { "iob": 4.426, "activity": 0.0508, "date": 1653143049000}, + { "iob": 4.353, "activity": 0.051, "date": 1653143349000}, + { "iob": 4.049, "activity": 0.0507, "date": 1653143650000}, + { "iob": 3.747, "activity": 0.0498, "date": 1653143949000}, + { "iob": 3.402, "activity": 0.0483, "date": 1653144249000}, + { "iob": 3.115, "activity": 0.0464, "date": 1653144550000}, + { "iob": 2.788, "activity": 0.0441, "date": 1653144849000}, + { "iob": 2.524, "activity": 0.0417, "date": 1653145149000}, + { "iob": 2.271, "activity": 0.0391, "date": 1653145449000}, + { "iob": 2.033, "activity": 0.0365, "date": 1653145750000}, + { "iob": 1.807, "activity": 0.0338, "date": 1653146050000}, + { "iob": 1.594, "activity": 0.0312, "date": 1653146349000}, + { "iob": 1.395, "activity": 0.0286, "date": 1653146650000}, + { "iob": 1.258, "activity": 0.0262, "date": 1653146949000}, + { "iob": 1.034, "activity": 0.0236, "date": 1653147249000}, + { "iob": 0.971, "activity": 0.0215, "date": 1653147549000}, + { "iob": 1.008, "activity": 0.0197, "date": 1653147849000}, + { "iob": 0.963, "activity": 0.0183, "date": 1653148149000}, + { "iob": 1.046, "activity": 0.0171, "date": 1653148450000}, + { "iob": 0.912, "activity": 0.0161, "date": 1653148749000}, + { "iob": 1.254, "activity": 0.0156, "date": 1653149049000}, + { "iob": 1.176, "activity": 0.0154, "date": 1653149349000}, + { "iob": 1.051, "activity": 0.0149, "date": 1653149650000}, + { "iob": 0.928, "activity": 0.0142, "date": 1653149949000}, + { "iob": 1.008, "activity": 0.0138, "date": 1653150249000}, + { "iob": 0.89, "activity": 0.0133, "date": 1653150549000}, + { "iob": 0.775, "activity": 0.0127, "date": 1653150849000}, + { "iob": 0.664, "activity": 0.0118, "date": 1653151149000}, + { "iob": 0.606, "activity": 0.011, "date": 1653151449000}, + { "iob": 0.703, "activity": 0.0105, "date": 1653151749000}, + { "iob": 0.702, "activity": 0.0101, "date": 1653152049000}, + { "iob": 0.902, "activity": 0.0101, "date": 1653152349000}, + { "iob": 0.801, "activity": 0.0101, "date": 1653152649000}, + { "iob": 0.701, "activity": 0.0098, "date": 1653152949000}, + { "iob": 0.603, "activity": 0.0094, "date": 1653153249000}, + { "iob": 0.508, "activity": 0.0088, "date": 1653153549000}, + { "iob": 0.415, "activity": 0.0081, "date": 1653153849000}, + { "iob": 0.327, "activity": 0.0074, "date": 1653154149000}, + { "iob": 0.242, "activity": 0.0066, "date": 1653154449000}, + { "iob": 0.161, "activity": 0.0058, "date": 1653154749000}, + { "iob": 0.134, "activity": 0.005, "date": 1653155049000}, + { "iob": 0.4, "activity": 0.0048, "date": 1653155349000}, + { "iob": 0.475, "activity": 0.0049, "date": 1653155649000}, + { "iob": 0.401, "activity": 0.005, "date": 1653155950000}, + { "iob": 0.327, "activity": 0.0048, "date": 1653156250000}, + { "iob": 0.203, "activity": 0.0044, "date": 1653156549000}, + { "iob": 0.132, "activity": 0.004, "date": 1653156849000}, + { "iob": 0.064, "activity": 0.0034, "date": 1653157149000}, + { "iob": -0.002, "activity": 0.0028, "date": 1653157449000}, + { "iob": -0.064, "activity": 0.0022, "date": 1653157750000}, + { "iob": -0.073, "activity": 0.0016, "date": 1653158049000}, + { "iob": -0.08, "activity": 0.0011, "date": 1653158349000}, + { "iob": -0.085, "activity": 0.0007, "date": 1653158649000}, + { "iob": -0.087, "activity": 0.0004, "date": 1653158949000}, + { "iob": -0.088, "activity": 0.0001, "date": 1653159249000}, + { "iob": -0.088, "activity": -0.0001, "date": 1653159549000}, + { "iob": -0.137, "activity": -0.0004, "date": 1653159849000}, + { "iob": -0.184, "activity": -0.0007, "date": 1653160150000}, + { "iob": -0.18, "activity": -0.001, "date": 1653160449000}, + { "iob": -0.175, "activity": -0.0012, "date": 1653160749000}, + { "iob": -0.168, "activity": -0.0014, "date": 1653161049000}, + { "iob": -0.211, "activity": -0.0015, "date": 1653161350000}, + { "iob": -0.203, "activity": -0.0017, "date": 1653161649000}, + { "iob": -0.243, "activity": -0.002, "date": 1653161950000}, + { "iob": -0.282, "activity": -0.0023, "date": 1653162250000}, + { "iob": -0.32, "activity": -0.0026, "date": 1653162549000}, + { "iob": -0.357, "activity": -0.0029, "date": 1653162850000}, + { "iob": -0.391, "activity": -0.0032, "date": 1653163150000}, + { "iob": -0.375, "activity": -0.0035, "date": 1653163449000}, + { "iob": -0.357, "activity": -0.0036, "date": 1653163749000}, + { "iob": -0.149, "activity": -0.0035, "date": 1653164049000}, + { "iob": -0.132, "activity": -0.0031, "date": 1653164350000}, + { "iob": 9.296, "activity": 0.015, "date": 1653164649000}, + { "iob": 9.123, "activity": 0.0332, "date": 1653164950000}, + { "iob": 8.96, "activity": 0.0474, "date": 1653165249000}, + { "iob": 8.644, "activity": 0.0584, "date": 1653165550000}, + { "iob": 8.282, "activity": 0.0664, "date": 1653165850000}, + { "iob": 7.835, "activity": 0.0718, "date": 1653166149000}, + { "iob": 7.416, "activity": 0.0753, "date": 1653166450000}, + { "iob": 6.984, "activity": 0.0772, "date": 1653166749000}, + { "iob": 6.547, "activity": 0.0776, "date": 1653167049000}, + { "iob": 6.061, "activity": 0.0769, "date": 1653167350000}, + { "iob": 5.68, "activity": 0.0754, "date": 1653167650000}, + { "iob": 5.458, "activity": 0.0734, "date": 1653167949000}, + { "iob": 5.046, "activity": 0.0712, "date": 1653168250000}, + { "iob": 4.925, "activity": 0.069, "date": 1653168549000}, + { "iob": 4.487, "activity": 0.0663, "date": 1653168849000}, + { "iob": 4.113, "activity": 0.0633, "date": 1653169150000}, + { "iob": 3.706, "activity": 0.0599, "date": 1653169449000}, + { "iob": 3.363, "activity": 0.0566, "date": 1653169749000}, + { "iob": 3.039, "activity": 0.053, "date": 1653170049000}, + { "iob": 2.733, "activity": 0.0494, "date": 1653170350000}, + { "iob": 2.395, "activity": 0.0457, "date": 1653170650000}, + { "iob": 2.126, "activity": 0.0421, "date": 1653170950000}, + { "iob": 1.824, "activity": 0.0385, "date": 1653171250000}, + { "iob": 1.64, "activity": 0.0351, "date": 1653171549000}, + { "iob": 1.473, "activity": 0.0319, "date": 1653171849000}, + { "iob": 1.273, "activity": 0.0288, "date": 1653172150000}, + { "iob": 1.136, "activity": 0.026, "date": 1653172450000}, + { "iob": 1.011, "activity": 0.0235, "date": 1653172749000}, + { "iob": 0.852, "activity": 0.021, "date": 1653173050000}, + { "iob": 0.752, "activity": 0.0189, "date": 1653173350000}, + { "iob": 0.662, "activity": 0.0169, "date": 1653173650000}, + { "iob": 0.534, "activity": 0.0149, "date": 1653173949000}, + { "iob": 0.463, "activity": 0.0132, "date": 1653174249000}, + { "iob": 0.352, "activity": 0.0115, "date": 1653174550000}, + { "iob": 0.298, "activity": 0.0101, "date": 1653174850000}, + { "iob": 0.25, "activity": 0.0089, "date": 1653175149000}, + { "iob": 0.329, "activity": 0.0079, "date": 1653175450000}, + { "iob": 0.34, "activity": 0.0074, "date": 1653175750000}, + { "iob": 0.304, "activity": 0.0068, "date": 1653176050000}, + { "iob": 0.272, "activity": 0.0062, "date": 1653176350000}, + { "iob": 0.512, "activity": 0.006, "date": 1653176650000}, + { "iob": 0.581, "activity": 0.0061, "date": 1653176950000}, + { "iob": 1.238, "activity": 0.0075, "date": 1653177250000}, + { "iob": 1.147, "activity": 0.0088, "date": 1653177550000}, + { "iob": 1.151, "activity": 0.0098, "date": 1653177850000}, + { "iob": 1.05, "activity": 0.0104, "date": 1653178149000}, + { "iob": 0.947, "activity": 0.0107, "date": 1653178449000}, + { "iob": 0.844, "activity": 0.0106, "date": 1653178750000}, + { "iob": 0.741, "activity": 0.0104, "date": 1653179050000}, + { "iob": 0.59, "activity": 0.0099, "date": 1653179350000}, + { "iob": 0.542, "activity": 0.0093, "date": 1653179649000}, + { "iob": 0.497, "activity": 0.0087, "date": 1653179949000}, + { "iob": 0.456, "activity": 0.0081, "date": 1653180250000}, + { "iob": 0.516, "activity": 0.0077, "date": 1653180549000}, + { "iob": 0.429, "activity": 0.0072, "date": 1653180849000}, + { "iob": 0.294, "activity": 0.0066, "date": 1653181150000}, + { "iob": 0.163, "activity": 0.0058, "date": 1653181450000}, + { "iob": 0.037, "activity": 0.0049, "date": 1653181750000}, + { "iob": -0.085, "activity": 0.0039, "date": 1653182050000}, + { "iob": -0.153, "activity": 0.0029, "date": 1653182349000}, + { "iob": -0.265, "activity": 0.0018, "date": 1653182650000}, + { "iob": -0.371, "activity": 0.0007, "date": 1653182949000}, + { "iob": -0.471, "activity": -0.0005, "date": 1653183249000}, + { "iob": -0.566, "activity": -0.0016, "date": 1653183550000}, + { "iob": -0.606, "activity": -0.0026, "date": 1653183850000}, + { "iob": -0.64, "activity": -0.0036, "date": 1653184150000}, + { "iob": -0.67, "activity": -0.0044, "date": 1653184450000} +] + From 0774aa46d0afec7140f6913e1845415cee5ee025 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 25 Jun 2022 10:17:59 +0200 Subject: [PATCH 007/154] prevent NPE --- .../nightscout/androidaps/dialogs/CarbsDialog.kt | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt index cd9eedaeb5..7c73776689 100644 --- a/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt @@ -143,7 +143,7 @@ class CarbsDialog : DialogFragmentWithDate() { ) val plus1text = toSignedString(sp.getInt(R.string.key_carbs_button_increment_1, FAV1_DEFAULT)) binding.plus1.text = plus1text - binding.plus1.contentDescription = rh.gs(R.string.treatments_wizard_carbs_label) + " " + plus1text + binding.plus1.contentDescription = rh.gs(R.string.treatments_wizard_carbs_label) + " " + plus1text binding.plus1.setOnClickListener { binding.carbs.value = max( 0.0, binding.carbs.value @@ -155,7 +155,7 @@ class CarbsDialog : DialogFragmentWithDate() { val plus2text = toSignedString(sp.getInt(R.string.key_carbs_button_increment_2, FAV2_DEFAULT)) binding.plus2.text = plus2text - binding.plus2.contentDescription = rh.gs(R.string.treatments_wizard_carbs_label) + " " + plus2text + binding.plus2.contentDescription = rh.gs(R.string.treatments_wizard_carbs_label) + " " + plus2text binding.plus2.setOnClickListener { binding.carbs.value = max( 0.0, binding.carbs.value @@ -166,7 +166,7 @@ class CarbsDialog : DialogFragmentWithDate() { } val plus3text = toSignedString(sp.getInt(R.string.key_carbs_button_increment_3, FAV3_DEFAULT)) binding.plus3.text = plus3text - binding.plus2.contentDescription = rh.gs(R.string.treatments_wizard_carbs_label) + " " + plus3text + binding.plus2.contentDescription = rh.gs(R.string.treatments_wizard_carbs_label) + " " + plus3text binding.plus3.setOnClickListener { binding.carbs.value = max( 0.0, binding.carbs.value @@ -179,7 +179,7 @@ class CarbsDialog : DialogFragmentWithDate() { setOnValueChangedListener { eventTime: Long -> run { val timeOffset = ((eventTime - eventTimeOriginal) / (1000 * 60)).toDouble() - binding.time.value = timeOffset + if (_binding != null) binding.time.value = timeOffset } } @@ -250,7 +250,8 @@ class CarbsDialog : DialogFragmentWithDate() { val hypoSelected = binding.hypoTt.isChecked if (hypoSelected) actions.add( - rh.gs(R.string.temptargetshort) + ": " + (DecimalFormatter.to1Decimal(hypoTT) + " " + unitLabel + " (" + rh.gs(R.string.format_mins, hypoTTDuration) + ")").formatColor( context, + rh.gs(R.string.temptargetshort) + ": " + (DecimalFormatter.to1Decimal(hypoTT) + " " + unitLabel + " (" + rh.gs(R.string.format_mins, hypoTTDuration) + ")").formatColor( + context, rh, R.attr.tempTargetConfirmation ) @@ -258,7 +259,7 @@ class CarbsDialog : DialogFragmentWithDate() { val timeOffset = binding.time.value.toInt() if (useAlarm && carbs > 0 && timeOffset > 0) - actions.add(rh.gs(R.string.alarminxmin, timeOffset).formatColor(context , rh, R.attr.infoColor)) + actions.add(rh.gs(R.string.alarminxmin, timeOffset).formatColor(context, rh, R.attr.infoColor)) val duration = binding.duration.value.toInt() if (duration > 0) actions.add(rh.gs(R.string.duration) + ": " + duration + rh.gs(R.string.shorthour)) @@ -385,7 +386,7 @@ class CarbsDialog : DialogFragmentWithDate() { override fun onResume() { super.onResume() - if(!queryingProtection) { + if (!queryingProtection) { queryingProtection = true activity?.let { activity -> val cancelFail = { From 530004fb57f557330e1f7487dfddd86ab72c5a8b Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 25 Jun 2022 10:27:28 +0200 Subject: [PATCH 008/154] remove unused code, prevent root blocking --- .../plugins/general/overview/OverviewFragment.kt | 13 ++++++------- .../events/EventUpdateOverviewPumpStatus.kt | 5 ----- 2 files changed, 6 insertions(+), 12 deletions(-) delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/general/overview/events/EventUpdateOverviewPumpStatus.kt diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt index 4374fd0c05..8ecba9d5ad 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt @@ -51,7 +51,11 @@ import info.nightscout.androidaps.plugins.constraints.bgQualityCheck.BgQualityCh import info.nightscout.androidaps.plugins.general.automation.AutomationPlugin import info.nightscout.androidaps.plugins.general.nsclient.data.NSDeviceStatus import info.nightscout.androidaps.plugins.general.overview.activities.QuickWizardListActivity -import info.nightscout.androidaps.plugins.general.overview.events.* +import info.nightscout.androidaps.plugins.general.overview.events.EventUpdateOverviewCalcProgress +import info.nightscout.androidaps.plugins.general.overview.events.EventUpdateOverviewGraph +import info.nightscout.androidaps.plugins.general.overview.events.EventUpdateOverviewIobCob +import info.nightscout.androidaps.plugins.general.overview.events.EventUpdateOverviewNotification +import info.nightscout.androidaps.plugins.general.overview.events.EventUpdateOverviewSensitivity import info.nightscout.androidaps.plugins.general.overview.graphData.GraphData import info.nightscout.androidaps.plugins.general.overview.notifications.NotificationStore import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider @@ -66,7 +70,6 @@ import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.ToastUtils import info.nightscout.androidaps.utils.TrendCalculator import info.nightscout.androidaps.utils.alertDialogs.OKDialog -import info.nightscout.androidaps.interfaces.BuildHelper import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.androidaps.utils.ui.SingleClickButton @@ -236,10 +239,6 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList .debounce(1L, TimeUnit.SECONDS) .observeOn(aapsSchedulers.main) .subscribe({ updateGraph() }, fabricPrivacy::logException) - disposable += activePlugin.activeOverview.overviewBus - .toObservable(EventUpdateOverviewPumpStatus::class.java) - .observeOn(aapsSchedulers.main) - .subscribe({ updatePumpStatus() }, fabricPrivacy::logException) disposable += activePlugin.activeOverview.overviewBus .toObservable(EventUpdateOverviewNotification::class.java) .observeOn(aapsSchedulers.main) @@ -308,7 +307,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList } handler.postDelayed(refreshLoop, 60 * 1000L) - refreshAll() + handler.post { refreshAll() } updatePumpStatus() updateCalcProgress() } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/events/EventUpdateOverviewPumpStatus.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/events/EventUpdateOverviewPumpStatus.kt deleted file mode 100644 index 30ad6b7507..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/events/EventUpdateOverviewPumpStatus.kt +++ /dev/null @@ -1,5 +0,0 @@ -package info.nightscout.androidaps.plugins.general.overview.events - -import info.nightscout.androidaps.events.Event - -class EventUpdateOverviewPumpStatus(val from: String) : Event() \ No newline at end of file From d71cc391fef3a37405e465a0b2d88a71e09356cb Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 25 Jun 2022 10:29:20 +0200 Subject: [PATCH 009/154] RL: resolve crash on nullable object --- .../common/hw/rileylink/service/tasks/ServiceTaskExecutor.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/tasks/ServiceTaskExecutor.kt b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/tasks/ServiceTaskExecutor.kt index 36494bb17b..f0623eaf92 100644 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/tasks/ServiceTaskExecutor.kt +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/tasks/ServiceTaskExecutor.kt @@ -30,7 +30,7 @@ class ServiceTaskExecutor @Inject constructor() : ThreadPoolExecutor(1, 1, 10000 task.preOp() } - override fun afterExecute(r: Runnable, t: Throwable) { + override fun afterExecute(r: Runnable, t: Throwable?) { // This is run on either caller UI thread or Service UI thread. val task = r as ServiceTask task.postOp() From 991f2c95b7ee5ffe351f21957a0d3f934069dc12 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 25 Jun 2022 13:51:44 +0200 Subject: [PATCH 010/154] Exception on NaN --- .../plugins/general/overview/OverviewData.kt | 4 +- .../general/overview/OverviewPlugin.kt | 49 +------------------ .../xdripStatusline/StatusLinePlugin.kt | 7 ++- .../plugins/insulin/InsulinLyumjevPlugin.kt | 6 ++- .../plugins/insulin/InsulinOrefBasePlugin.kt | 35 ++++++------- .../insulin/InsulinOrefFreePeakPlugin.kt | 6 ++- .../insulin/InsulinOrefRapidActingPlugin.kt | 6 ++- .../InsulinOrefUltraRapidActingPlugin.kt | 6 ++- .../IobCobCalculatorPlugin.kt | 1 + .../insulin/InsulinLyumjevPluginTest.kt | 8 +-- .../insulin/InsulinOrefBasePluginTest.kt | 38 ++++++-------- .../insulin/InsulinOrefFreePeakPluginTest.kt | 6 ++- .../InsulinOrefRapidActingPluginTest.kt | 8 +-- .../InsulinOrefUltraRapidActingPluginTest.kt | 8 +-- .../nightscout/androidaps/data/IobTotal.kt | 20 ++++---- .../info/nightscout/androidaps/utils/Round.kt | 13 ++--- .../androidaps/danaRv2/DanaRv2Plugin.java | 3 +- .../androidaps/danar/AbstractDanaRPlugin.java | 3 +- .../androidaps/danar/DanaRPlugin.java | 3 +- 19 files changed, 90 insertions(+), 140 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewData.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewData.kt index d114f19847..6f0b64bc6d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewData.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewData.kt @@ -207,8 +207,8 @@ class OverviewData @Inject constructor( * IOB, COB */ - fun bolusIob(iobCobCalculator: IobCobCalculator): IobTotal = iobCobCalculator.calculateIobFromBolus().round(fabricPrivacy) - fun basalIob(iobCobCalculator: IobCobCalculator): IobTotal = iobCobCalculator.calculateIobFromTempBasalsIncludingConvertedExtended().round(fabricPrivacy) + fun bolusIob(iobCobCalculator: IobCobCalculator): IobTotal = iobCobCalculator.calculateIobFromBolus().round() + fun basalIob(iobCobCalculator: IobCobCalculator): IobTotal = iobCobCalculator.calculateIobFromTempBasalsIncludingConvertedExtended().round() fun cobInfo(iobCobCalculator: IobCobCalculator): CobInfo = iobCobCalculator.getCobInfo(true, "Overview COB") val lastCarbsTime: Long diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewPlugin.kt index 50bf49c812..58b2de95d6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewPlugin.kt @@ -6,11 +6,7 @@ import dagger.android.HasAndroidInjector import info.nightscout.androidaps.R import info.nightscout.androidaps.events.EventPumpStatusChanged import info.nightscout.androidaps.extensions.* -import info.nightscout.androidaps.interfaces.Config -import info.nightscout.androidaps.interfaces.Overview -import info.nightscout.androidaps.interfaces.PluginBase -import info.nightscout.androidaps.interfaces.PluginDescription -import info.nightscout.androidaps.interfaces.PluginType +import info.nightscout.androidaps.interfaces.* import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification @@ -21,7 +17,6 @@ import info.nightscout.androidaps.plugins.general.overview.graphExtensions.Scale import info.nightscout.androidaps.plugins.general.overview.notifications.NotificationStore import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress import info.nightscout.androidaps.utils.FabricPrivacy -import info.nightscout.androidaps.interfaces.ResourceHelper import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.shared.logging.AAPSLogger import info.nightscout.shared.sharedPreferences.SP @@ -175,46 +170,4 @@ class OverviewPlugin @Inject constructor( .storeDouble(R.string.key_statuslights_bat_critical, sp, rh) .storeInt(R.string.key_boluswizard_percentage, sp, rh) } -/* - @Volatile - var runningRefresh = false - override fun refreshLoop(from: String) { - if (runningRefresh) return - runningRefresh = true - overviewBus.send(EventUpdateOverviewNotification(from)) - loadIobCobResults(from) - overviewBus.send(EventUpdateOverviewProfile(from)) - overviewBus.send(EventUpdateOverviewBg(from)) - overviewBus.send(EventUpdateOverviewTime(from)) - overviewBus.send(EventUpdateOverviewTemporaryBasal(from)) - overviewBus.send(EventUpdateOverviewExtendedBolus(from)) - overviewBus.send(EventUpdateOverviewTemporaryTarget(from)) - loadAsData(from) - overviewData.preparePredictions(from) - overviewData.prepareBasalData(from) - overviewData.prepareTemporaryTargetData(from) - overviewData.prepareTreatmentsData(from) - overviewData.prepareIobAutosensData(from) - overviewBus.send(EventUpdateOverviewGraph(from)) - overviewBus.send(EventUpdateOverviewIobCob(from)) - aapsLogger.debug(LTag.UI, "refreshLoop finished") - runningRefresh = false - } - - @Suppress("SameParameterValue") - private fun loadAll(from: String) { - loadBg(from) - loadProfile(from) - loadTemporaryTarget(from) - loadIobCobResults(from) - loadAsData(from) - overviewData.prepareBasalData(from) - overviewData.prepareTemporaryTargetData(from) - overviewData.prepareTreatmentsData(from) -// prepareIobAutosensData(from) -// preparePredictions(from) - overviewBus.send(EventUpdateOverviewGraph(from)) - aapsLogger.debug(LTag.UI, "loadAll finished") - } -*/ } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/xdripStatusline/StatusLinePlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/xdripStatusline/StatusLinePlugin.kt index 1c54ea4feb..e0106a49d5 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/xdripStatusline/StatusLinePlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/xdripStatusline/StatusLinePlugin.kt @@ -8,12 +8,11 @@ import info.nightscout.androidaps.R import info.nightscout.androidaps.events.* import info.nightscout.androidaps.extensions.toStringShort import info.nightscout.androidaps.interfaces.* -import info.nightscout.shared.logging.AAPSLogger import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.utils.DecimalFormatter import info.nightscout.androidaps.utils.FabricPrivacy -import info.nightscout.androidaps.interfaces.ResourceHelper import info.nightscout.androidaps.utils.rx.AapsSchedulers +import info.nightscout.shared.logging.AAPSLogger import info.nightscout.shared.sharedPreferences.SP import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign @@ -123,8 +122,8 @@ class StatusLinePlugin @Inject constructor( status += activeTemp.toStringShort() + " " } //IOB - val bolusIob = iobCobCalculator.calculateIobFromBolus().round(fabricPrivacy) - val basalIob = iobCobCalculator.calculateIobFromTempBasalsIncludingConvertedExtended().round(fabricPrivacy) + val bolusIob = iobCobCalculator.calculateIobFromBolus().round() + val basalIob = iobCobCalculator.calculateIobFromTempBasalsIncludingConvertedExtended().round() status += DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U" if (sp.getBoolean(R.string.key_xdripstatus_detailediob, true)) { status += ("(" diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinLyumjevPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinLyumjevPlugin.kt index 4ca7c6f91e..e13bb47b6f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinLyumjevPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinLyumjevPlugin.kt @@ -8,6 +8,7 @@ import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.shared.logging.AAPSLogger import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.androidaps.utils.HardLimits import org.json.JSONObject import javax.inject.Inject import javax.inject.Singleton @@ -19,8 +20,9 @@ class InsulinLyumjevPlugin @Inject constructor( profileFunction: ProfileFunction, rxBus: RxBus, aapsLogger: AAPSLogger, - config: Config -) : InsulinOrefBasePlugin(injector, rh, profileFunction, rxBus, aapsLogger, config) { + config: Config, + hardLimits: HardLimits +) : InsulinOrefBasePlugin(injector, rh, profileFunction, rxBus, aapsLogger, config, hardLimits) { override val id get(): Insulin.InsulinType = Insulin.InsulinType.OREF_LYUMJEV override val friendlyName get(): String = rh.gs(R.string.lyumjev) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefBasePlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefBasePlugin.kt index a13f3e467e..f84d23f531 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefBasePlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefBasePlugin.kt @@ -6,12 +6,12 @@ import info.nightscout.androidaps.data.Iob import info.nightscout.androidaps.database.embedments.InsulinConfiguration import info.nightscout.androidaps.database.entities.Bolus import info.nightscout.androidaps.interfaces.* -import info.nightscout.shared.logging.AAPSLogger import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification import info.nightscout.androidaps.plugins.general.overview.notifications.Notification +import info.nightscout.androidaps.utils.HardLimits import info.nightscout.androidaps.utils.T -import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.shared.logging.AAPSLogger import kotlin.math.exp import kotlin.math.pow @@ -27,7 +27,8 @@ abstract class InsulinOrefBasePlugin( val profileFunction: ProfileFunction, val rxBus: RxBus, aapsLogger: AAPSLogger, - config: Config + config: Config, + val hardLimits: HardLimits ) : PluginBase( PluginDescription() .mainType(PluginType.INSULIN) @@ -43,18 +44,18 @@ abstract class InsulinOrefBasePlugin( override val dia get(): Double { val dia = userDefinedDia - return if (dia >= MIN_DIA) { + return if (dia >= hardLimits.minDia()) { dia } else { sendShortDiaNotification(dia) - MIN_DIA + hardLimits.minDia() } } open fun sendShortDiaNotification(dia: Double) { if (System.currentTimeMillis() - lastWarned > 60 * 1000) { lastWarned = System.currentTimeMillis() - val notification = Notification(Notification.SHORT_DIA, String.format(notificationPattern, dia, MIN_DIA), Notification.URGENT) + val notification = Notification(Notification.SHORT_DIA, String.format(notificationPattern, dia, hardLimits.minDia()), Notification.URGENT) rxBus.send(EventNewNotification(notification)) } } @@ -65,12 +66,13 @@ abstract class InsulinOrefBasePlugin( open val userDefinedDia: Double get() { val profile = profileFunction.getProfile() - return profile?.dia ?: MIN_DIA + return profile?.dia ?: hardLimits.minDia() } override fun iobCalcForTreatment(bolus: Bolus, time: Long, dia: Double): Iob { + assert(dia != 0.0) + assert(peak != 0) val result = Iob() - val peak = peak if (bolus.amount != 0.0) { val bolusTime = bolus.timestamp val t = (time - bolusTime) / 1000.0 / 60.0 @@ -80,9 +82,9 @@ abstract class InsulinOrefBasePlugin( if (t < td) { val tau = tp * (1 - tp / td) / (1 - 2 * tp / td) val a = 2 * tau / td - val S = 1 / (1 - a + (1 + a) * exp(-td / tau)) - result.activityContrib = bolus.amount * (S / tau.pow(2.0)) * t * (1 - t / td) * exp(-t / tau) - result.iobContrib = bolus.amount * (1 - S * (1 - a) * ((t.pow(2.0) / (tau * td * (1 - a)) - t / tau - 1) * Math.exp(-t / tau) + 1)) + val s = 1 / (1 - a + (1 + a) * exp(-td / tau)) + result.activityContrib = bolus.amount * (s / tau.pow(2.0)) * t * (1 - t / td) * exp(-t / tau) + result.iobContrib = bolus.amount * (1 - s * (1 - a) * ((t.pow(2.0) / (tau * td * (1 - a)) - t / tau - 1) * exp(-t / tau) + 1)) } } return result @@ -95,17 +97,12 @@ abstract class InsulinOrefBasePlugin( get(): String { var comment = commentStandardText() val userDia = userDefinedDia - if (userDia < MIN_DIA) { - comment += "\n" + rh.gs(R.string.dia_too_short, userDia, MIN_DIA) + if (userDia < hardLimits.minDia()) { + comment += "\n" + rh.gs(R.string.dia_too_short, userDia, hardLimits.minDia()) } return comment } - override abstract val peak: Int + abstract override val peak: Int abstract fun commentStandardText(): String - - companion object { - - const val MIN_DIA = 5.0 - } } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefFreePeakPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefFreePeakPlugin.kt index c9588c493b..3b3150cca7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefFreePeakPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefFreePeakPlugin.kt @@ -10,6 +10,7 @@ import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.shared.logging.AAPSLogger import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.androidaps.utils.HardLimits import info.nightscout.shared.sharedPreferences.SP import org.json.JSONObject import javax.inject.Inject @@ -26,8 +27,9 @@ class InsulinOrefFreePeakPlugin @Inject constructor( profileFunction: ProfileFunction, rxBus: RxBus, aapsLogger: AAPSLogger, - config: Config -) : InsulinOrefBasePlugin(injector, rh, profileFunction, rxBus, aapsLogger, config) { + config: Config, + hardLimits: HardLimits +) : InsulinOrefBasePlugin(injector, rh, profileFunction, rxBus, aapsLogger, config, hardLimits) { override val id get(): Insulin.InsulinType = Insulin.InsulinType.OREF_FREE_PEAK diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefRapidActingPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefRapidActingPlugin.kt index 8abb4619cc..76bceef9f2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefRapidActingPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefRapidActingPlugin.kt @@ -8,6 +8,7 @@ import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.shared.logging.AAPSLogger import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.androidaps.utils.HardLimits import org.json.JSONObject import javax.inject.Inject import javax.inject.Singleton @@ -22,8 +23,9 @@ class InsulinOrefRapidActingPlugin @Inject constructor( profileFunction: ProfileFunction, rxBus: RxBus, aapsLogger: AAPSLogger, - config: Config -) : InsulinOrefBasePlugin(injector, rh, profileFunction, rxBus, aapsLogger, config) { + config: Config, + hardLimits: HardLimits +) : InsulinOrefBasePlugin(injector, rh, profileFunction, rxBus, aapsLogger, config, hardLimits) { override val id get(): Insulin.InsulinType = Insulin.InsulinType.OREF_RAPID_ACTING override val friendlyName get(): String = rh.gs(R.string.rapid_acting_oref) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefUltraRapidActingPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefUltraRapidActingPlugin.kt index 4f944b4674..631d495943 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefUltraRapidActingPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefUltraRapidActingPlugin.kt @@ -8,6 +8,7 @@ import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.shared.logging.AAPSLogger import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.androidaps.utils.HardLimits import org.json.JSONObject import javax.inject.Inject import javax.inject.Singleton @@ -22,8 +23,9 @@ class InsulinOrefUltraRapidActingPlugin @Inject constructor( profileFunction: ProfileFunction, rxBus: RxBus, aapsLogger: AAPSLogger, - config: Config -) : InsulinOrefBasePlugin(injector, rh, profileFunction, rxBus, aapsLogger, config) { + config: Config, + hardLimits: HardLimits +) : InsulinOrefBasePlugin(injector, rh, profileFunction, rxBus, aapsLogger, config, hardLimits) { override val id get(): Insulin.InsulinType = Insulin.InsulinType.OREF_ULTRA_RAPID_ACTING override val friendlyName get(): String = rh.gs(R.string.ultrarapid_oref) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobCalculatorPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobCalculatorPlugin.kt index 00fa1dd6dd..30c05b1f32 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobCalculatorPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobCalculatorPlugin.kt @@ -481,6 +481,7 @@ class IobCobCalculatorPlugin @Inject constructor( val profile = profileFunction.getProfile() ?: return total val dia = profile.dia val divisor = sp.getDouble(R.string.key_openapsama_bolussnooze_dia_divisor, 2.0) + assert(divisor > 0) val boluses = repository.getBolusesDataFromTime(toTime - range(), true).blockingGet() diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinLyumjevPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinLyumjevPluginTest.kt index c906ad4b27..27f3b16011 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinLyumjevPluginTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinLyumjevPluginTest.kt @@ -6,9 +6,10 @@ import info.nightscout.androidaps.R import info.nightscout.androidaps.interfaces.Config import info.nightscout.androidaps.interfaces.Insulin import info.nightscout.androidaps.interfaces.ProfileFunction -import info.nightscout.shared.logging.AAPSLogger -import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.androidaps.plugins.bus.RxBus +import info.nightscout.androidaps.utils.HardLimits +import info.nightscout.shared.logging.AAPSLogger import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Rule @@ -31,6 +32,7 @@ class InsulinLyumjevPluginTest { @Mock lateinit var profileFunction: ProfileFunction @Mock lateinit var aapsLogger: AAPSLogger @Mock lateinit var config: Config + @Mock lateinit var hardLimits: HardLimits private var injector: HasAndroidInjector = HasAndroidInjector { AndroidInjector { @@ -39,7 +41,7 @@ class InsulinLyumjevPluginTest { @Before fun setup() { - sut = InsulinLyumjevPlugin(injector, rh, profileFunction, rxBus, aapsLogger, config) + sut = InsulinLyumjevPlugin(injector, rh, profileFunction, rxBus, aapsLogger, config, hardLimits) } @Test diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefBasePluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefBasePluginTest.kt index 1aada50c74..254974283b 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefBasePluginTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefBasePluginTest.kt @@ -9,17 +9,17 @@ import info.nightscout.androidaps.interfaces.ActivePlugin import info.nightscout.androidaps.interfaces.Config import info.nightscout.androidaps.interfaces.Insulin import info.nightscout.androidaps.interfaces.ProfileFunction -import info.nightscout.shared.logging.AAPSLogger -import info.nightscout.androidaps.plugins.bus.RxBus -import info.nightscout.androidaps.plugins.insulin.InsulinOrefBasePlugin.Companion.MIN_DIA -import info.nightscout.androidaps.utils.DefaultValueHelper import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.androidaps.plugins.bus.RxBus +import info.nightscout.androidaps.utils.HardLimits +import info.nightscout.shared.logging.AAPSLogger import org.json.JSONObject import org.junit.Assert import org.junit.Before import org.junit.Rule import org.junit.Test import org.mockito.Mock +import org.mockito.Mockito.`when` import org.mockito.junit.MockitoJUnit import org.mockito.junit.MockitoRule @@ -35,10 +35,9 @@ class InsulinOrefBasePluginTest { profileFunction: ProfileFunction, rxBus: RxBus, aapsLogger: AAPSLogger, - config: Config - ) : InsulinOrefBasePlugin( - injector, rh, profileFunction, rxBus, aapsLogger, config - ) { + config: Config, + hardLimits: HardLimits + ) : InsulinOrefBasePlugin(injector, rh, profileFunction, rxBus, aapsLogger, config, hardLimits) { override fun sendShortDiaNotification(dia: Double) { shortDiaNotificationSend = true @@ -62,13 +61,13 @@ class InsulinOrefBasePluginTest { private lateinit var sut: InsulinBaseTest - @Mock lateinit var defaultValueHelper: DefaultValueHelper @Mock lateinit var rh: ResourceHelper @Mock lateinit var profileFunction: ProfileFunction @Mock lateinit var rxBus: RxBus @Mock lateinit var aapsLogger: AAPSLogger @Mock lateinit var activePlugin: ActivePlugin @Mock lateinit var config: Config + @Mock lateinit var hardLimits: HardLimits private var injector: HasAndroidInjector = HasAndroidInjector { AndroidInjector { @@ -77,30 +76,23 @@ class InsulinOrefBasePluginTest { @Before fun setUp() { - sut = InsulinBaseTest(injector, rh, profileFunction, rxBus, aapsLogger, config) + sut = InsulinBaseTest(injector, rh, profileFunction, rxBus, aapsLogger, config, hardLimits) + `when`(hardLimits.minDia()).thenReturn(5.0) } @Test fun testGetDia() { - Assert.assertEquals(MIN_DIA, sut.dia, 0.0) - testUserDefinedDia = MIN_DIA + 1 - Assert.assertEquals(MIN_DIA + 1, sut.dia, 0.0) - testUserDefinedDia = MIN_DIA - 1 - Assert.assertEquals(MIN_DIA, sut.dia, 0.0) + Assert.assertEquals(5.0, sut.dia, 0.0) + testUserDefinedDia = 5.0 + 1 + Assert.assertEquals(5.0 + 1, sut.dia, 0.0) + testUserDefinedDia = 5.0 - 1 + Assert.assertEquals(5.0, sut.dia, 0.0) Assert.assertTrue(shortDiaNotificationSend) } - @Test - fun minDiaTes() { - Assert.assertEquals(5.0, MIN_DIA, 0.0001) - } - @Test fun testIobCalcForTreatment() { val treatment = Bolus(timestamp = 0, amount = 10.0, type = Bolus.Type.NORMAL) - val expected = Iob() - Assert.assertEquals(expected.iobContrib, sut.iobCalcForTreatment(treatment, 0, 0.0).iobContrib, 0.001) - Assert.assertEquals(expected.activityContrib, sut.iobCalcForTreatment(treatment, 0, 0.0).activityContrib, 0.001) testPeak = 30 testUserDefinedDia = 4.0 val time = System.currentTimeMillis() diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefFreePeakPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefFreePeakPluginTest.kt index c71c61655b..75d996285d 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefFreePeakPluginTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefFreePeakPluginTest.kt @@ -7,8 +7,9 @@ import info.nightscout.androidaps.TestBase import info.nightscout.androidaps.interfaces.Config import info.nightscout.androidaps.interfaces.Insulin import info.nightscout.androidaps.interfaces.ProfileFunction -import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.androidaps.plugins.bus.RxBus +import info.nightscout.androidaps.utils.HardLimits import info.nightscout.shared.sharedPreferences.SP import org.junit.Assert.assertEquals import org.junit.Before @@ -31,6 +32,7 @@ class InsulinOrefFreePeakPluginTest : TestBase() { @Mock lateinit var rxBus: RxBus @Mock lateinit var profileFunction: ProfileFunction @Mock lateinit var config: Config + @Mock lateinit var hardLimits: HardLimits private var injector: HasAndroidInjector = HasAndroidInjector { AndroidInjector { @@ -39,7 +41,7 @@ class InsulinOrefFreePeakPluginTest : TestBase() { @Before fun setup() { - sut = InsulinOrefFreePeakPlugin( injector, sp, rh, profileFunction, rxBus, aapsLogger, config) + sut = InsulinOrefFreePeakPlugin(injector, sp, rh, profileFunction, rxBus, aapsLogger, config, hardLimits) } @Test diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefRapidActingPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefRapidActingPluginTest.kt index fb2a5f91da..317ccabf5f 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefRapidActingPluginTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefRapidActingPluginTest.kt @@ -6,9 +6,10 @@ import info.nightscout.androidaps.R import info.nightscout.androidaps.interfaces.Config import info.nightscout.androidaps.interfaces.Insulin import info.nightscout.androidaps.interfaces.ProfileFunction -import info.nightscout.shared.logging.AAPSLogger -import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.androidaps.plugins.bus.RxBus +import info.nightscout.androidaps.utils.HardLimits +import info.nightscout.shared.logging.AAPSLogger import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Rule @@ -31,6 +32,7 @@ class InsulinOrefRapidActingPluginTest { @Mock lateinit var profileFunction: ProfileFunction @Mock lateinit var aapsLogger: AAPSLogger @Mock lateinit var config: Config + @Mock lateinit var hardLimits: HardLimits private var injector: HasAndroidInjector = HasAndroidInjector { AndroidInjector { @@ -39,7 +41,7 @@ class InsulinOrefRapidActingPluginTest { @Before fun setup() { - sut = InsulinOrefRapidActingPlugin(injector, rh, profileFunction, rxBus, aapsLogger, config) + sut = InsulinOrefRapidActingPlugin(injector, rh, profileFunction, rxBus, aapsLogger, config, hardLimits) } @Test diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefUltraRapidActingPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefUltraRapidActingPluginTest.kt index 2de46cf16b..1944d0a0f0 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefUltraRapidActingPluginTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/insulin/InsulinOrefUltraRapidActingPluginTest.kt @@ -6,9 +6,10 @@ import info.nightscout.androidaps.R import info.nightscout.androidaps.interfaces.Config import info.nightscout.androidaps.interfaces.Insulin import info.nightscout.androidaps.interfaces.ProfileFunction -import info.nightscout.shared.logging.AAPSLogger -import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.androidaps.plugins.bus.RxBus +import info.nightscout.androidaps.utils.HardLimits +import info.nightscout.shared.logging.AAPSLogger import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Rule @@ -31,6 +32,7 @@ class InsulinOrefUltraRapidActingPluginTest { @Mock lateinit var profileFunction: ProfileFunction @Mock lateinit var aapsLogger: AAPSLogger @Mock lateinit var config: Config + @Mock lateinit var hardLimits: HardLimits private var injector: HasAndroidInjector = HasAndroidInjector { AndroidInjector { @@ -39,7 +41,7 @@ class InsulinOrefUltraRapidActingPluginTest { @Before fun setup() { - sut = InsulinOrefUltraRapidActingPlugin(injector, rh, profileFunction, rxBus, aapsLogger, config) + sut = InsulinOrefUltraRapidActingPlugin(injector, rh, profileFunction, rxBus, aapsLogger, config, hardLimits) } @Test diff --git a/core/src/main/java/info/nightscout/androidaps/data/IobTotal.kt b/core/src/main/java/info/nightscout/androidaps/data/IobTotal.kt index eb5f46428d..44540e1e27 100644 --- a/core/src/main/java/info/nightscout/androidaps/data/IobTotal.kt +++ b/core/src/main/java/info/nightscout/androidaps/data/IobTotal.kt @@ -10,7 +10,7 @@ import org.json.JSONException import org.json.JSONObject @Suppress("SpellCheckingInspection") -class IobTotal(val time: Long) : DataPointWithLabelInterface { +class IobTotal(val time: Long) : DataPointWithLabelInterface { var iob = 0.0 var activity = 0.0 @@ -51,15 +51,15 @@ class IobTotal(val time: Long) : DataPointWithLabelInterface { return this } - fun round(fabricPrivacy: FabricPrivacy? = null): IobTotal { - iob = Round.roundTo(iob, 0.001, fabricPrivacy) - activity = Round.roundTo(activity, 0.0001, fabricPrivacy) - bolussnooze = Round.roundTo(bolussnooze, 0.0001, fabricPrivacy) - basaliob = Round.roundTo(basaliob, 0.001, fabricPrivacy) - netbasalinsulin = Round.roundTo(netbasalinsulin, 0.001, fabricPrivacy) - hightempinsulin = Round.roundTo(hightempinsulin, 0.001, fabricPrivacy) - netInsulin = Round.roundTo(netInsulin, 0.001, fabricPrivacy) - extendedBolusInsulin = Round.roundTo(extendedBolusInsulin, 0.001, fabricPrivacy) + fun round(): IobTotal { + iob = Round.roundTo(iob, 0.001) + activity = Round.roundTo(activity, 0.0001) + bolussnooze = Round.roundTo(bolussnooze, 0.0001) + basaliob = Round.roundTo(basaliob, 0.001) + netbasalinsulin = Round.roundTo(netbasalinsulin, 0.001) + hightempinsulin = Round.roundTo(hightempinsulin, 0.001) + netInsulin = Round.roundTo(netInsulin, 0.001) + extendedBolusInsulin = Round.roundTo(extendedBolusInsulin, 0.001) return this } diff --git a/core/src/main/java/info/nightscout/androidaps/utils/Round.kt b/core/src/main/java/info/nightscout/androidaps/utils/Round.kt index 3f854d4979..e7ca2f5fd8 100644 --- a/core/src/main/java/info/nightscout/androidaps/utils/Round.kt +++ b/core/src/main/java/info/nightscout/androidaps/utils/Round.kt @@ -2,6 +2,7 @@ package info.nightscout.androidaps.utils import android.os.Bundle import java.math.BigDecimal +import java.security.InvalidParameterException import kotlin.math.abs import kotlin.math.ceil import kotlin.math.floor @@ -12,16 +13,10 @@ import kotlin.math.roundToLong */ object Round { - fun roundTo(x: Double, step: Double, fabricPrivacy: FabricPrivacy? = null): Double = try { - if (x == 0.0) 0.0 + fun roundTo(x: Double, step: Double): Double { + if (x.isNaN()) throw InvalidParameterException("Parameter is NaN") + return if (x == 0.0) 0.0 else BigDecimal.valueOf((x / step).roundToLong()).multiply(BigDecimal.valueOf(step)).toDouble() - } catch (e: Exception) { - fabricPrivacy?.logCustom("Error_roundTo", Bundle().apply { - putDouble("x", x) - putDouble("step", step) - putString("stacktrace", e.stackTraceToString()) - }) - 0.0 } fun floorTo(x: Double, step: Double): Double = diff --git a/danar/src/main/java/info/nightscout/androidaps/danaRv2/DanaRv2Plugin.java b/danar/src/main/java/info/nightscout/androidaps/danaRv2/DanaRv2Plugin.java index 1253ef889a..40e9688199 100644 --- a/danar/src/main/java/info/nightscout/androidaps/danaRv2/DanaRv2Plugin.java +++ b/danar/src/main/java/info/nightscout/androidaps/danaRv2/DanaRv2Plugin.java @@ -354,8 +354,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { insulin = constraintChecker.applyExtendedBolusConstraints(new Constraint<>(insulin)).value(); // needs to be rounded int durationInHalfHours = Math.max(durationInMinutes / 30, 1); - insulin = Round.INSTANCE.roundTo(insulin, getPumpDescription().getExtendedBolusStep(), - null); + insulin = Round.INSTANCE.roundTo(insulin, getPumpDescription().getExtendedBolusStep()); PumpEnactResult result = new PumpEnactResult(getInjector()); if (danaPump.isExtendedInProgress() && Math.abs(danaPump.getExtendedBolusAmount() - insulin) < pumpDescription.getExtendedBolusStep()) { diff --git a/danar/src/main/java/info/nightscout/androidaps/danar/AbstractDanaRPlugin.java b/danar/src/main/java/info/nightscout/androidaps/danar/AbstractDanaRPlugin.java index f2dbf782a6..77588a77bf 100644 --- a/danar/src/main/java/info/nightscout/androidaps/danar/AbstractDanaRPlugin.java +++ b/danar/src/main/java/info/nightscout/androidaps/danar/AbstractDanaRPlugin.java @@ -267,8 +267,7 @@ public abstract class AbstractDanaRPlugin extends PumpPluginBase implements Pump insulin = constraintChecker.applyExtendedBolusConstraints(new Constraint<>(insulin)).value(); // needs to be rounded int durationInHalfHours = Math.max(durationInMinutes / 30, 1); - insulin = Round.INSTANCE.roundTo(insulin, getPumpDescription().getExtendedBolusStep(), - null); + insulin = Round.INSTANCE.roundTo(insulin, getPumpDescription().getExtendedBolusStep()); PumpEnactResult result = new PumpEnactResult(getInjector()); if (danaPump.isExtendedInProgress() && Math.abs(danaPump.getExtendedBolusAmount() - insulin) < getPumpDescription().getExtendedBolusStep()) { diff --git a/danar/src/main/java/info/nightscout/androidaps/danar/DanaRPlugin.java b/danar/src/main/java/info/nightscout/androidaps/danar/DanaRPlugin.java index 1a2e573be2..10c8b58fa2 100644 --- a/danar/src/main/java/info/nightscout/androidaps/danar/DanaRPlugin.java +++ b/danar/src/main/java/info/nightscout/androidaps/danar/DanaRPlugin.java @@ -288,8 +288,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin { double extendedRateToSet = absoluteRate - getBaseBasalRate(); extendedRateToSet = constraintChecker.applyBasalConstraints(new Constraint<>(extendedRateToSet), profile).value(); // needs to be rounded to 0.1 - extendedRateToSet = Round.INSTANCE.roundTo(extendedRateToSet, - pumpDescription.getExtendedBolusStep() * 2, null); // *2 because of half hours + extendedRateToSet = Round.INSTANCE.roundTo(extendedRateToSet, pumpDescription.getExtendedBolusStep() * 2); // *2 because of half hours // What is current rate of extended bolusing in u/h? aapsLogger.debug(LTag.PUMP, "setTempBasalAbsolute: Extended bolus in progress: " + (danaPump.isExtendedInProgress()) + " rate: " + danaPump.getExtendedBolusAbsoluteRate() + "U/h duration remaining: " + danaPump.getExtendedBolusRemainingMinutes() + "min"); From 9cfcf238a16f1cc7e494ff6510bb749b84f8406e Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 25 Jun 2022 13:57:37 +0200 Subject: [PATCH 011/154] fix typo --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cb0b891cfe..d33d543dd9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1175,7 +1175,7 @@ Max-BG out of range! Temptarget:\nMin: %1$s\nMax: %2$s\nDuration: %3$s Temptarget:\nTarget: %1$s\nDuration: %2$s - Temptarget:\Reason: %1$s\nTarget: %2$s\nDuration: %3$s + Temptarget:\nReason: %1$s\nTarget: %2$s\nDuration: %3$s QuickWizard: %1$s\nInsulin: %2$.2fU\nCarbs: %3$dg Calc. Wizard:\nInsulin: %1$.2fU\nCarbs: %2$dg Show entry on device: From 00f0446c21e059f1287333fc72578daeb6f8c8c2 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 25 Jun 2022 15:53:40 +0200 Subject: [PATCH 012/154] EROS: show discard button in engineering mode --- .../pump/omnipod/eros/ui/ErosPodManagementActivity.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/ui/ErosPodManagementActivity.kt b/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/ui/ErosPodManagementActivity.kt index 0aa199eabc..5e55c7d612 100644 --- a/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/ui/ErosPodManagementActivity.kt +++ b/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/ui/ErosPodManagementActivity.kt @@ -32,6 +32,7 @@ import info.nightscout.androidaps.queue.events.EventQueueChanged import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.alertDialogs.OKDialog import info.nightscout.androidaps.extensions.toVisibility +import info.nightscout.androidaps.interfaces.BuildHelper import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.androidaps.utils.ui.UIRunnable import io.reactivex.rxjava3.disposables.CompositeDisposable @@ -53,6 +54,7 @@ class ErosPodManagementActivity : NoSplashAppCompatActivity() { @Inject lateinit var omnipodErosPumpPlugin: OmnipodErosPumpPlugin @Inject lateinit var serviceTaskExecutor: ServiceTaskExecutor @Inject lateinit var aapsSchedulers: AapsSchedulers + @Inject lateinit var buildHelper: BuildHelper private var disposables: CompositeDisposable = CompositeDisposable() private val handler = Handler(HandlerThread(this::class.simpleName + "Handler").also { it.start() }.looper) @@ -160,7 +162,8 @@ class ErosPodManagementActivity : NoSplashAppCompatActivity() { // Only show the discard button to reset a cached Pod address before the Pod has actually been initialized // Otherwise, users should use the Deactivate Pod Wizard. In case proper deactivation fails, // they will get an option to discard the Pod state there - val discardButtonEnabled = podStateManager.hasPodState() && !podStateManager.isPodInitialized + // Milos Kozak: allow to show button by activating engineering mode + val discardButtonEnabled = podStateManager.hasPodState() && (!podStateManager.isPodInitialized || buildHelper.isEngineeringMode()) binding.buttonDiscardPod.visibility = discardButtonEnabled.toVisibility() val pulseLogButtonEnabled = aapsOmnipodManager.isPulseLogButtonEnabled From 37aebc1575657a03aab81ee136c1fec5fde69c3a Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 25 Jun 2022 17:20:49 +0200 Subject: [PATCH 013/154] New Crowdin updates (#1844) * New translations strings.xml (Norwegian) * New translations strings.xml (Dutch) * New translations strings.xml (Dutch) * New translations exam.xml (Dutch) * New translations strings.xml (Dutch) * New translations strings.xml (Dutch) * New translations strings.xml (Dutch) * New translations strings.xml (Dutch) * New translations strings.xml (Dutch) * New translations strings.xml (Dutch) * New translations strings.xml (Dutch) * New translations strings.xml (Dutch) * New translations strings.xml (Portuguese, Brazilian) * New translations strings.xml (Chinese Simplified) * New translations strings.xml (Turkish) * New translations strings.xml (Slovak) * New translations strings.xml (Russian) * New translations strings.xml (Norwegian) * New translations strings.xml (Dutch) * New translations strings.xml (Italian) * New translations strings.xml (French) * New translations strings.xml (Hebrew) * New translations strings.xml (Danish) * New translations strings.xml (Czech) * New translations strings.xml (Spanish) * Update source file strings.xml * New translations strings.xml (Dutch) * New translations strings.xml (Turkish) * New translations exam.xml (Hebrew) * New translations strings.xml (Hebrew) * New translations strings.xml (Hebrew) * New translations strings.xml (Czech) * New translations strings.xml (Hebrew) * New translations strings.xml (Slovak) * New translations strings.xml (Hebrew) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations exam.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Portuguese, Brazilian) * New translations strings.xml (Chinese Simplified) * New translations strings.xml (Turkish) * New translations strings.xml (Swedish) * New translations strings.xml (Slovak) * New translations strings.xml (Russian) * New translations strings.xml (Norwegian) * New translations strings.xml (Dutch) * New translations strings.xml (Italian) * New translations strings.xml (French) * New translations strings.xml (Hebrew) * New translations strings.xml (Danish) * New translations strings.xml (Czech) * New translations strings.xml (Spanish) * Update source file strings.xml * New translations strings.xml (Czech) * Update source file strings.xml * New translations strings.xml (Spanish) --- app/src/main/res/values-cs-rCZ/strings.xml | 4 +- app/src/main/res/values-da-rDK/strings.xml | 3 - app/src/main/res/values-es-rES/strings.xml | 6 +- app/src/main/res/values-fr-rFR/strings.xml | 3 - app/src/main/res/values-it-rIT/exam.xml | 1 + app/src/main/res/values-it-rIT/strings.xml | 34 +++++++++++- app/src/main/res/values-iw-rIL/exam.xml | 1 + app/src/main/res/values-iw-rIL/strings.xml | 55 ++++++++++++++++++- app/src/main/res/values-nl-rNL/exam.xml | 1 + app/src/main/res/values-nl-rNL/strings.xml | 25 ++++++++- app/src/main/res/values-no-rNO/strings.xml | 5 +- app/src/main/res/values-pt-rBR/strings.xml | 3 - app/src/main/res/values-ru-rRU/strings.xml | 3 - app/src/main/res/values-sk-rSK/strings.xml | 7 ++- app/src/main/res/values-sv-rSE/strings.xml | 1 - app/src/main/res/values-tr-rTR/strings.xml | 5 +- app/src/main/res/values-zh-rCN/strings.xml | 3 - .../src/main/res/values-it-rIT/strings.xml | 3 + .../src/main/res/values-nl-rNL/strings.xml | 3 + core/src/main/res/values-it-rIT/strings.xml | 47 ++++++++++++++++ core/src/main/res/values-nl-rNL/strings.xml | 43 +++++++++++++++ danar/src/main/res/values-it-rIT/strings.xml | 4 +- danar/src/main/res/values-nl-rNL/strings.xml | 4 +- .../src/main/res/values-it-rIT/strings.xml | 2 + .../src/main/res/values-nl-rNL/strings.xml | 2 + .../src/main/res/values-it-rIT/strings.xml | 38 +++++++++++++ .../src/main/res/values-nl-rNL/strings.xml | 38 +++++++++++++ .../src/main/res/values-it-rIT/strings.xml | 21 +++++++ .../src/main/res/values-nl-rNL/strings.xml | 21 +++++++ shared/src/main/res/values-iw-rIL/strings.xml | 26 +++++++++ shared/src/main/res/values-nl-rNL/strings.xml | 26 +++++++++ wear/src/main/res/values-it-rIT/strings.xml | 28 ++++++++++ wear/src/main/res/values-iw-rIL/strings.xml | 28 ++++++++++ wear/src/main/res/values-nl-rNL/strings.xml | 28 ++++++++++ wear/src/main/res/values/strings.xml | 19 +------ 35 files changed, 483 insertions(+), 58 deletions(-) diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 5fbe88be2f..c577d77db7 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -433,8 +433,8 @@ Povolení odesílaní OpenAPS SMB Dynamická ISF - Korekční faktor pro DynamicISF v %% - Korekční faktor pro DynamicISF. Pro agresivnější korekční dávky nastavte hodnoty větší než 100%%, a pro méně agresivní korekce menší než 100%%. + Korekční faktor pro DynamicISF v % + Korekční faktor pro DynamicISF. Pro agresivnější korekční dávky nastavte hodnoty vyšší než 100 %, pro méně agresivní korekce nižší než 100 %. Povolit UAM Povolit SMB Použít super mikro bolusy místo dočasných bazálů pro zrychlení účinku diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index c906acf229..0f64e595f1 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -432,8 +432,6 @@ Aktiver lokale udsendelser. OpenAPS SMB Dynamisk ISF - DynamicISF-justeringsfaktor %% - Justeringsfaktor for Dynamisk ISF. Indstil mere end 100%% for mere aggressive korrektionsdoser og mindre end 100%% for mindre aggressive korrektioner. Aktiver UAM Aktiver SMB Brug Super Mikro Boluser i stedet for midlertidig basal for hurtigere handling @@ -956,7 +954,6 @@ Max-BS udenfor området! Midlertidigt mål:\nMin: %1$s\nMax: %2$s\nVarighed: %3$s Midlertigt mål:\nMål: %1$s\nVarighed: %2$s - Midlertigt mål:\Grund: %1$s\nMål: %2$s\nVarighed: %3$s Hurtigguide: %1$s\nInsulin: %2$.2fE\nKH: %3$dg Guide:\nInsulin: %1$.2fE\nKH: %2$dg Vis post på enhed: diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 0f21604eb6..d80010a14a 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -433,8 +433,8 @@ Habilitar la emisión de mensajes localmente. OpenAPS SMB ISF Dinámico - Factor de ajuste de ISF Dinámico % - Porcentaje del factor de ajuste de ISF Dinámico\nValor predeterminado: 100\nEstablecer valores por encima del 100%% para que el algoritmo aplique correcciones más agresivas y valores por debajo del 100%% para correcciones menos agresivas. + Factor de ajuste de ISF Dinámico % + Porcentaje del factor de ajuste de ISF Dinámico\nValor predeterminado: 100\nEstablecer valores por encima del 100% para que el algoritmo aplique correcciones más agresivas y valores por debajo del 100% para correcciones menos agresivas. Activar UAM Activar SMB Usar microbolos en lugar de basales temporales, para corregir más rápidamente @@ -970,7 +970,7 @@ ¡Glucosa máxima fuera de rango! Objetivo temporal:\nMin: %1$s\nMax: %2$s\nDuración: %3$s Objetivo temporal:\nObjetivo: %1$s\nDuración: %2$s - ObjetivoTemporal:\Razón: %1$s\nObjetivo: %2$s\nDuración: %3$s + ObjetivoTemporal:\nRazón: %1$s\nObjetivo: %2$s\nDuración: %3$s Asistente Rápido: %1$s\nInsulina: %2$.2fU\nCarbohidratos: %3$dg Calc. Asistente:\nInsulina: %1$.2fU\nCarbohidratos: %2$dg Mostrar entrada en dispositivo: diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index e160225133..a278365845 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -434,8 +434,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Activer les transmissions locales OpenAPS SMB SI dynamique - Facteur d\'ajustement SI dynamique %% - Facteur d\'ajustement pour SI dynamique. Définissez plus de 100 %% pour des corrections plus agressives et moins de 100 %% pour des corrections moins agressives. Activer RNS Activer SMB Utiliser les Super Micro Bolus au lieu des débits de base temporaires pour une action rapide @@ -970,7 +968,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Gly maxi hors limite! Cible temporaire:\nMin: %1$s\nMax : %2$s\nDurée : %3$s Cible temporaire:\nCible: %1$s\nDurée: %2$s - Cible temporaire:\nRaison: %1$s\nCible : %2$s\nDurée : %3$s Assistant: %1$s\nInsuline : %2$.2fU\nGlucides : %3$dg Assistant Calc :\nInsuline : %1$.2fU\nGlucides : %2$dg Afficher l\'entrée sur l\'appareil : diff --git a/app/src/main/res/values-it-rIT/exam.xml b/app/src/main/res/values-it-rIT/exam.xml index 3f3d10cbfa..c91b576f44 100644 --- a/app/src/main/res/values-it-rIT/exam.xml +++ b/app/src/main/res/values-it-rIT/exam.xml @@ -123,6 +123,7 @@ La registrazione di un cambio cannula ripristinerà il rapporto Autosens al 100%. Alcune opzioni del plugin hanno intervalli di tempo configurabili che possono essere impostati dall\'utente. https://androidaps.readthedocs.io/en/latest/EN/Configuration/Sensitivity-detection-and-COB.html + https://androidaps.readthedocs.io/en/latest/Usage/Open-APS-features.html?highlight=Autosens#autosens Errori inserimento CHO Cosa dovresti fare se hai fatto un inserimento non corretto di carboidrati? Eliminare nei Trattamenti l\'inserimento non corretto e immettere il nuovo valore CHO. diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index eb81d05f9f..4bcbd2d112 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -6,6 +6,7 @@ Sicurezza trattamenti Max bolo consentito [U] Max CHO consentiti [g] + Glicemia sotto la quale si attiva la sospensione per glicemia bassa %1$s Preferenze Preferenze Aggiorna trattamenti da NS @@ -432,14 +433,15 @@ Abilita trasmissioni locali OpenAPS SMB ISF Dinamico - %% fattore di regolazione ISF dinamico - Fattore di regolazione per ISF dinamico. Imposta più del 100%% per correzioni più aggressive, meno del 100%% per correzioni meno aggressive. + Fattore di regolazione per ISF Dinamico (%) + Fattore di regolazione per ISF Dinamico. Imposta più del 100% per dosi di correzione più aggressive e meno del 100% per correzioni meno aggressive. Abilita UAM Abilita SMB Usa super-micro-boli al posto della basale temporanea per un\'azione più veloce Rilevamento dei pasti non annunciati Tempo picco Curva IOB Tempo del picco [min] + Picco Free-Peak Oref Rapid-Acting Oref Ultra-Rapid Oref @@ -591,6 +593,7 @@ Questo valore è chiamato Max IOB nel contesto OpenAPS\nOpenAPS non aggiungerà ulteriore insulina se IOB corrente è maggiore di questo valore Max tempo assorbimento pasto [h] Tempo entro il quale ogni pasto si considera assorbito. Eventuali carboidrati rimanenti verranno tagliati fuori. + Glicemia sotto la quale l\'erogazione d\'insulina è sospesa. Il valore predefinito utilizza il modello target standard. L\'utente può impostare un valore compreso tra 60 mg/dl (3.3mmol/l) e 100mg/dl (5.5mmol/l). Con valori inferiori a 65/3.6 viene usato il modello predefinito Finestre tratt.nto: mostra campo note Avanti Indietro @@ -603,7 +606,11 @@ Secondo incremento di CHO Terzo incremento di CHO CGM + Usa connessione cellulare + Usa connessione WiFi WiFi SSID + Durante la ricarica + Utilizzo batteria Impostazioni connessione SSID ammessi (separati da punto e virgola) Consenti connessione in roaming @@ -678,6 +685,8 @@ Un trattamento (insulina: %1$.2f, carboidrati: %2$d, a: %3$s) non può essere aggiunto ai trattamenti. Controlla e aggiungi il record necessario. eCarbs: %1$d g (%2$d h), ritardo: %3$d m Nessun dato autosens disponibile + File di log + Miscellanea Impostazioni Log Ripristina valori predefiniti Malfunzionamento NSClient. Considera il riavvio di NS e NSClient. @@ -770,6 +779,11 @@ Inserimento % non valido Media TIR + TIR giorno + TIR notte + Dettaglio 14 giorni + SD: %1$s + HbA1c: Monitor attività Vuoi resettare le statistiche sull\'attività? Statistiche @@ -956,7 +970,6 @@ Max-BG fuori range! Temptarget:\nMin: %1$s\nMax: %2$s\nDurata: %3$s Temptarget:\nTarget: %1$s\nDurata: %2$s - Temptarget:\Motivo: %1$s\nTarget: %2$s\nDurata: %3$s QuickWizard: %1$s\nInsulina: %2$.2fU\nCHO: %3$dg Calc. Wizard:\nInsulina: %1$.2fU\nCHO: %2$dg Mostra voce sul dispositivo: @@ -965,9 +978,11 @@ Nessun profilo attivo! Valore COB sconosciuto! Lettura BG mancante o recente riavvio dell\'app? Violazione vincolo CHO! + Calc (IC: %1$.1f, ISF: %2$.1f) CHO: %1$.2fU COB: %1$.0fg %2$.2fU BG: %1$.2fU + IOB: %1$.2fU Superbolo: %1$.2fU Trend di 15\': %1$.2fU Percentuale: %1$.2fU x %2$d%% ≈ %3$.2fU @@ -994,6 +1009,10 @@ %1$d selezionati Ordina Finestra di dialogo cancellata + Molto basso + Basso + Alto + Molto alto Sotto In range Sopra @@ -1001,6 +1020,13 @@ Nascondi record di loop Widget di AndroidAPS Configura opacità + Stato loop + Scala del grafico + Profilo 1 + Profilo 2 + Login + Rimuovi tutto + Avvio reset Codice QR per configurare OTP apri impostazioni imposta allarme timer CHO @@ -1014,4 +1040,6 @@ GlucoRx Aidex GlucoRx Aidex Ricevi valori glicemia da CGM GlucoRx Aidex. + Bloccato dalle opzioni di ricarica + Bloccato dalle opzioni di connettività diff --git a/app/src/main/res/values-iw-rIL/exam.xml b/app/src/main/res/values-iw-rIL/exam.xml index ef3818b091..e4f2d5dd9e 100644 --- a/app/src/main/res/values-iw-rIL/exam.xml +++ b/app/src/main/res/values-iw-rIL/exam.xml @@ -123,6 +123,7 @@ רישום החלפת צינורית יאפס את היחס של Autosens בחזרה ל-100%. חלק מאפשרויות התוסף כוללות טווחי זמן הניתנים להגדרה ע\"י המשתמש. https://androidaps.readthedocs.io/en/latest/EN/Configuration/Sensitivity-detection-and-COB.html + https://androidaps.readthedocs.io/en/latest/Usage/Open-APS-features.html?highlight=Autosens#autosens שגיאות רישום פחמימות מה לעשות אם טעיתם ברישום הפחמימות? מחקו את הרשומה השגויה בטיפולים וציינו את ערך הפחמימות הנכון. diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/app/src/main/res/values-iw-rIL/strings.xml index df974a2eec..498f502fc0 100644 --- a/app/src/main/res/values-iw-rIL/strings.xml +++ b/app/src/main/res/values-iw-rIL/strings.xml @@ -6,6 +6,7 @@ בטיחות טיפולים בולוס מקסימלי מותר [U] מקסימום פחמימות מותר [g] + רמת הסוכר נמוכה מסף ההשהיה עקב סוכר נמוך העדפות %1$s העדפות רענן טיפול מ-Nightscout @@ -432,14 +433,15 @@ אפשר שידורים מקומיים. OpenAPS SMB רגישות דינאמית - כיוונון פקטור הרגישות הדינאמית %% - כיוונון פקטור הרגישות הדינאמית. קבעו יותר מ-100%% לקבלת תיקונים אגרסיביים יותר ופחות מ-100%% לקבלת תיקונים עדינים יותר. + כיוונון פקטור הרגישות הדינאמית % + כיוונון פקטור הרגישות הדינאמית. הגדירו יותר מ-100% לקבלת תיקונים אגרסיביים יותר ופחות מ-100% לקבלת תיקונים עדינים יותר. הפעלת UAM אפשר SMB השתמש בסופר מיקרו בולוסים במקום בבזאלי זמני לפעילות מהירה יותר זיהוי של ארוחות לא מוכרזות שעת שיא של עקומת IOB זמן שיא [min] + שיא Oref שיא חופשי Oref אינסולין מהיר Oref אינסולין אולטרה מהיר @@ -591,6 +593,7 @@ ב-OpenAPS ערך זה נקרא מקסימום אינסולין פעיל (maxIOB). \nלא יוזרק עוד אינסולין אם כמות האינסולין הפעיל הנוכחי גדול מערך זה זמן ספיגה מקסימלי של הארוחה [h] משך זמן בו כל ארוחה תחשב כנספגה. לא תהיה התחשבות בפחמימות שנותרו. + ערך הסוכר שמתחתיו מושעה הזרקת אינסולין. ערך ברירת המחדל משתמש במודל מטרה סטנדרטי. המשתמש יכול להגדיר ערך בין 60 ל-100 מג\"\\ד\"ל. ערכים מתחת ל-65 מביאים לשימוש במודל ברירת המחדל הצגת שדות הערות בתיבות דו-שיח של טיפול הבא הקודם @@ -603,7 +606,11 @@ תוספת פחמימות שניה תוספת פחמימות שלישית סנסור + השתמש באינטרנט סלולרי + השתמש בחיבור WiFi WiFi SSID + בזמן טעינה + משתמש בסוללה הגדרות חיבור SSID מורשים (מופרדים בנקודה-פסיק) אפשר חיבור בנדידה @@ -770,6 +777,11 @@ רשומת אחוזים לא חוקית ממוצע זמן בטווח + זמן בטווח ביום + זמן בטווח בלילה + פירוט 14 יום + סטיית תקן: %1$s + HbA1c: מוניטור פעילות האם ברצונכם לאפס את הסטטיסטיקות הפעילות? סטטיסטיקה @@ -880,6 +892,8 @@ קבלת החלפות פרופיל שהוגדרו בנייטסקאוט או ב-NSClient אחזר אירועים לא מקוונים קבל אירועים לא מקוונים שנרשמו דרך נייטסקאוט או NSClient + קבל מינון בזאלי זמני ובולוס מושהה + קבל מינוני בזאלי זמני ובולוסים מושהים שהופעלו ממכשיר עוקב קבלת אינסולין קבלת אינסולין שהוזן באמצעות נייטסקאוט או NSClient (הוא לא מוזרק, רק מחושב רק כאינסולין פעיל) קבלת פחמימות @@ -946,12 +960,33 @@ ערכת נושא בהירה השתמש בערכת הנושא של המכשיר + מבטל ערך מטרה זמני נוכחי + יחידות המידה שונות בין הטלפון והשעון! + ערך הסוכר המינימלי מחוץ לטווח! + ערך הסוכר המקסימלי מחוץ לטווח! + ע\' מטרה זמני:\nמינ\': %1$s\nמקס\': %2$s\nמשך: %3$s + ע\' מטרה זמני:\nמטרה: %1$s\n משך: %2$s + אשף מהיר: %1$s\n אינס\': %2$.2f יח\'\nפחמ\': %3$d גר\' + מחשבון: %1$s\n אינס\': %2$.2f יח\'\nפחמ\': %3$d גר\' + הצג רשומה על המכשיר: + האשף המהיר שנבחר אינו זמין, נא לרענן את האריח + אין נתוני סוכר לביסוס חישוב! + לא הופעל פרופיל! + הפחמימות הפעילות לא ידועות! חסרות קריאות סוכר או שאותחל היישום לאחרונה? הפרת מגבלות פחמימה! + מחשבון (IC: %1$.1f, ISF: %2$.1f) פחמ\': %1$.2f יח\' פחמ\': %1$.0f גר\' %2$.2f יח\' סוכר: %1$.2f יח\' + אינ\' פעיל: %1$.2f יח\' סופר בולוס: %1$.2f יח\' מגמת 15 דק\': %1$.2f יח\' + אחוזים: %1$.2f יח\' x %2$d%% ≈ %3$.2f יח\' + הופעלה מגבלת אינסולין!\nלא ניתן להזריק %1$.2f יח\' + ע\' מטרה זמני: %1$s + %1$s ל-%2$s + המשאבה אינה זמינה! + פקודה לא ידועה: אחוזים ברירת המחדל של היישום הצג רשומות מבוטלות\\מחוקות @@ -970,6 +1005,10 @@ %1$d נבחרו מיין דו-שיח בוטל + נמוך מאוד + נמוך + גבוה + גבוה מאוד מתחת בטווח מעל @@ -977,7 +1016,17 @@ החבא רשומות לולאה ווידג\'ט AndroidAPS הגדרת אטימות + סטטוס הלולאה קנה מידה של הגרף + פרופיל 1 + פרופיל 2 + התחברות + הסר הכל + אתחל התחלה + ברקוד QR ליצירת סיסמה חד פעמית + פתח הגדרות + הגדרת אזעקה טיימר פחמימות + הכול טלפון שעון על השעון בלבד @@ -987,4 +1036,6 @@ GlucoRx Aidex Aidex קבלת נתוני סוכר מחיישני GlucoRx Aidex. + חסום ע\"י הגדרות טעינה + חסום ע\"י הגדרות חיבור diff --git a/app/src/main/res/values-nl-rNL/exam.xml b/app/src/main/res/values-nl-rNL/exam.xml index 8e8c00900e..5a64cd78c6 100644 --- a/app/src/main/res/values-nl-rNL/exam.xml +++ b/app/src/main/res/values-nl-rNL/exam.xml @@ -123,6 +123,7 @@ Het vastleggen van een canulewissel zet de Autosens-ratio terug naar 100%. Sommige van de plugins hebben configureerbare tijdbereiken die kunnen worden ingesteld door de gebruiker. https://androidaps.readthedocs.io/en/latest/CROWDIN/nl/Configuration/Sensitivity-detection-and-COB.html + https://androidaps.readthedocs.io/nl/latest/Usage/Open-APS-features.html?highlight=Autosens#autosens Koolhydraatinvoerfouten Wat moet u doen als u een onjuiste hoeveelheid koolhydraten hebt ingevoerd? Verwijder het onjuiste record in Behandelingen en voer de juiste koolhydraten opnieuw in. diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index dc28fa97db..059181d347 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -6,6 +6,7 @@ Behandelingen veiligheid Max toegestane bolus [E] Max toegestane koolhydraten [g] + BG niveau waarbij lage glucose onderbreking wordt geactiveerd %1$s Instellingen Instellingen Haal behandelingen op van NS @@ -432,8 +433,8 @@ Activeer locaal delen. OpenAPS SMB Dynamische ISF - Dynamische ISF aanpassingsfactor %% - Aanpassingsfactor voor Dynamische ISF. Stel meer dan 100%% in voor een agressievere correctie dosis en minder dan 100%% voor minder agressieve correcties. + Dynamische Isf aanpassingsfactor % + Aanpassingsfactor voor DynamicISF. Stel meer dan 100% in voor een agressievere correctie en minder dan 100% voor minder agressieve correctie. Activeer UAM Activeer SMB SMB in plaats van tijdelijke basalen voor snellere reactie @@ -592,6 +593,7 @@ Deze waarde heet MAX IOB in OpenAPS context\nOpenAPS zal geen extra insuline toedienen als de actuele IOB onderstaande waarde overschreden heeft Maximum maaltijd absorptie tijd [uur] Tijdspanne waarbinnen elke maaltijd volledig is opgenomen. Resterende KH worden niet mee gerekend. + BG waarde waarbij insuline afgifte wordt onderbroken. De standaard waarde gebruikt het standaard doelmodel. Gebruiker kan waarde instellen tussen 60 mg/dl (3.3 mmol/l) en 100mg/dl(5.6mmol/l). Waarden lager dan 65/3.6 resulteren in gebruik van het standaard model Toon notities veld in behandeling dialoogvensters Volgende Vorige @@ -604,7 +606,11 @@ Tweede koolhydraten increment Derde koolhydraten increment CGM + Mobiele verbinding gebruiken + Gebruik WiFi verbinding WiFi SSID + Tijdens opladen + Op batterij Verbindings instellingen Toegelaten SSIDs (gescheiden door puntkomma) Sta verbinding tijdens roaming toe @@ -679,6 +685,8 @@ Een Behandeling (insuline: %1$.2f, koolhydraten: %2$d, in: %3$s) niet konden worden toegevoegd aan Behandelingen. Gelieve te controleren en handmatig een record toe te voegen indien nodig. eCarbs: %1$d g (%2$d h), vertraging: %3$d m Geen autosens-gegevens beschikbaar + Logbestanden + Overige Log instellingen Terug naar standaardinstellingen NSClient werkt niet goed. Overweg een herstart van NS en NSClient. @@ -771,6 +779,11 @@ Ongeldig % invoer Gemiddelde TIR + TIR overdag + TIR s\'nachts + 14 dagen details + SD: %1$s + HbA1c: Activiteitsmonitor Wil je de activiteitenstatistieken resetten? Statistieken @@ -957,7 +970,6 @@ Max BG buiten bereik! Tijdelijk streefdoel:\nMin: %1$s\nMax: %2$s\nDuur: %3$s Tijdelijk streefdoel:\nDoel: %1$s\nDuur: %2$s - Tijdelijk streefdoel:\Reden: %1$s\nDoel: %2$s\nDuur: %3$s QuickWizard: %1$s\nInsuline: %2$.2fE\nKoolhy.: %3$dg Reken. Wizard:\nInsuline: %1$.2fE\nKoolhy.: %2$dg Toon invoer op apparaat: @@ -997,6 +1009,10 @@ %1$d geselecteerd Sorteren Dialoog geannuleerd + Zeer laag + Laag + Hoog + Zeer hoog Onder Binnen bereik Boven @@ -1004,6 +1020,7 @@ Verberg loop records AndroidAPS widget Configureer transparantie + Loop status Grafiek schaal Profiel 1 Profiel 2 @@ -1023,4 +1040,6 @@ GlucoRx Aidex Aidex Ontvang BG waarden van GlucoRx Aidex CGMS. + Geblokkeerd door oplaad instellingen + Geblokkeerd door verbindings instellingen diff --git a/app/src/main/res/values-no-rNO/strings.xml b/app/src/main/res/values-no-rNO/strings.xml index 7e12b4f62e..c81f69586e 100644 --- a/app/src/main/res/values-no-rNO/strings.xml +++ b/app/src/main/res/values-no-rNO/strings.xml @@ -6,6 +6,7 @@ Sikkerhet ved behandlinger Maks tillat bolus [U] Maks tillat karbo [g] + BS er under terskelverdi slik at all insulintilførsel stoppes %1$s innstillinger Innstillinger Oppdater behandlinger fra NS @@ -432,8 +433,6 @@ Aktiver lokale sendinger. OpenAPS SMB Dynamisk ISF - DynamiskISF justeringsfaktor %% - Justeringsfaktor for dynamisk ISF. Verdier over 100%% vil gi mer aggressive korreksjonsdoser, mens verdier under 100%% vil gi mildere korreksjonsdoser. Aktiver UAM Aktiver SMB Bruk Super Mikro Solen i stedet for temp basal for raskere resultat @@ -592,6 +591,7 @@ Denne verdien kalles Maks IOB av OpenAPS\nOpenAPS vil ikke gi mere insulin hvis mengden insulin ombord (IOB) overstiger denne verdien Maks absorpsjonstid for måltid [h] Etter denne tiden forventes det at måltidet er absorbert. Eventuelle gjenværende karbo vil tas ut av beregninger. + BS er under terskelverdi slik at all insulintilførsel stoppes. Mulighet for bruker å definere verdier mellom 3.3mmol/l (60mg/dl) og 5.5mmol/l (100mg/dl). Verdier under 3.6/65 bruker standard målverdier Vis merknadsfelt i dialogvindu for Behandlinger Neste Forrige @@ -968,7 +968,6 @@ Maks-BS utenfor område! Temp target:\nMin: %1$s\nMaks: %2$s\nVarighet: %3$s TempTarget:\nMål: %1$s\nVarighet: %2$s - TempTarget:\nMin: %1$s\nMål: %2$s\nVarighet: %3$s QuickWizard: %1$s\ninsulin: %2$.2fE\nKarbo: %3$dg Kalk. Wizard:\nInsulin: %1$.2fE\nKarbo: %2$dg Vis oppføring på enhet: diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index cc897fcb4c..fc2d50ec62 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -413,8 +413,6 @@ Ativar partilha local. SMB OpenAPS FSI Dinâmico - Fator de Ajuste FSI dinâmico %% - Fator de ajuste para FSI dinâmico. Defina mais de 100%% para doses de correção mais agressivas e menos de 100%% para correções menos agressivas. Ativar UAM Ativar SMB Use Super Micro Boluses em vez de basal temp para uma ação mais rápida @@ -865,7 +863,6 @@ Glicemia maxima fora da meta! Alvo temporário:\nMin: %1$s\nMax: %2$s\nDuração: %3$s Alvo temporário:\nTarget: %1$s\nDuration: %2$s - Alvo temporário:\Reason: %1$s\nTarget: %2$s\nDuration: %3$s Assistente rápido: %1$s\nInsulin: %2$.2fU\nCarbs: %3$dg Calculadora:\nInsulin: %1$.2fU\nCarbs: %2$dg Mostrar entrada no dispositivo: diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index d41d36c2e4..9baf342a88 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -432,8 +432,6 @@ Активировать локальную передачу Супер микро болюс OpenAPS Динамический ISF - Коэффициент регулировки динамического диапазона чувствительности ISF %% - Коэффициент корректировки динамического диапазона чувствительности ISF. Установите более 100%% для более агрессивных доз коррекции и менее 100%% для менее агрессивной коррекции. Включить непредвиденный прием пищи UAM Включить супер микро болюс SMB Для ускорения действия используйте супер микро болюсы SMB вместо временного базала @@ -967,7 +965,6 @@ Макс ГК вне диапазона! ВремЦель:\nМин: %1$s\nМакс.: %2$s\nДлительность: %3$s ВремЦель:\nЦель: %1$s\nДлительность: %2$s - ВремЦель:\Причина: %1$s\nЦель.: %2$s\nДлительность: %3$s Мастер: %1$s\nИнсулин: %2$.2fЕд\nУгл: %3$dg Мастер:\nИнсулин: %1$.2fЕд\nУгл: %2$dg Показать запись на устройстве: diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index b0e22b54b4..d0a550b70c 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -6,6 +6,7 @@ Bezpečnosť zadania ošetrenia Maximálny povolený bolus [JI] Maximálne povolené množstvo sacharidov [g] + Hodnota glykémie, pri ktorej sa aktivuje LGS Nastavenie pluginu %1$s Nastavenia Obnoviť ošetrenia z NS @@ -432,8 +433,8 @@ Povoliť lokálne vysielanie. OpenAPS SMB Dynamická ISF - Korekčný faktor pre Dynamickú ISF v %% - Korekčný faktor pre dynamickú ISF. Pre agresivnejšie korekčné dávky nastavte hodnoty väčšie ako 100%% a pre menej agresivne korekcie menšie než 100%%. + Korekčný faktor pre Dynamickú ISF v % + Korekčný faktor pre dynamickú ISF. Pre agresivnejšie korekčné dávky nastavte hodnoty väčšie ako 100%, pre menej agresívne korekcie, menšie než 100%. Povoliť UAM Povoliť SMB Použiť Super Mikro Bolusy namiesto dočasných bazálov, pre zrýchleniu účinku @@ -592,6 +593,7 @@ Táto hodnota je v kontexte OpenAPS nazývaná Max IOB.\nOpenAPS nikdy nepridá inzulín, pokiaľ je súčasné IOB väčšie, ako táto hodnota Maximálna doba vstrebávania sacharidov [h] Doba, po ktorej sú všetky sacharidy považované za vstrebané. Zvyšné budú orezané. + Hodnota glykémie, pri ktorej bude podávanie inzulínu zastavené. Východzia hodnota využíva štandardný cieľový model. Užívateľ môže nastaviť hodnoty od 3,3 mmol/l do 5,5 mmol/l. Pri hodnotách pod 3,6 mmol/l se použije východzí model. Zobrazovať kolónku poznámky v dialógoch ošetrení Ďalšia Späť @@ -968,7 +970,6 @@ Maximálna glykémia mimo rozsah! Doč. cieľ:\nMin: %1$s\nMax: %2$s\nTrvanie: %3$s Doč. cieľ:\nCieľ: %1$s\nTrvanie: %2$s - Doč. cieľ:\nDôvod: %1$s\nCieľ: %2$s\nTrvanie: %3$s Rýchly bolus: %1$s\nInzulín: %2$.2fJI\nSacharidy: %3$dg Kalkulačka: \nInzulín: %1$.2fJI\nSacharidy: %2$dg Zobraziť záznam na zariadení: diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index ee5c7d8905..a85a2e4cb2 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -941,7 +941,6 @@ Eversense-appen. Ogiltigt maximum BG! Temp-mål:\nMin: %1$s\nMax: %2$s\nVaraktighet: %3$s Temp-mål:\nMål: %1$s\nDuration: %2$s - Temp-mål:\Orsak: %1$s\nMål: %2$s\nVaraktighet: %3$s Snabbsteg: %1$s\nInsulin: %2$.2fU\nKolhydrater: %3$dg Kalkylator:\nInsulin: %1$.2fU\nKolhydrater: %2$dg Visa post på enhet: diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index f0383b2d42..7737bbb046 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -433,8 +433,8 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d Yerel yayınları etkinleştirin. OpenAPS SMB Dinamik İDF - DinamikİDF ayarlama faktörü %% - DinamikİDF için ayarlama faktörü. Daha agresif düzeltme dozları için %%100\'den fazla ve de az agresif düzeltmeler için %%100\'den az ayarlayın. + DinamikİDF Ayar Faktörü % + DinamikİDF için ayarlama faktörü. Daha agresif düzeltme dozları için %100\'den fazla ve daha az agresif düzeltmeler için %100\'den az ayarlayın. UAM etkinleştir SMB (Super Micro Bolus) etkinleştir Daha hızlı bir etki için geçici bazal yerine Super Micro Bolus kullanın @@ -970,7 +970,6 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d Maks-KŞ aralık dışında! Geçici Hedef:\nMin: %1$s\nMaks: %2$s\nSüre: %3$s Geçici Hedef:\nHedef: %1$s\nSüre: %2$s - Geçici Hedef:\Neden: %1$s\nHedef: %2$s\nSüre: %3$s Hızlı Asistan: %1$s\nİnsülin: %2$.2fU\nKarb: %3$dg Hesap Mak.:\nİnsulin: %1$.2fÜ\nKarb: %2$dg Girişi cihazda göster: diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 0258e545fb..642148ddb4 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -432,8 +432,6 @@ 启用本地广播。 OpenAPS SMB 动态ISF(胰岛素敏感系数) - 动态ISF胰岛素敏系数调整比例 %% - 动态ISF的调整因子。设置100%%以上用于更积极的校正,100%%以下则不那么积极校正。 启用 UAM 启用微型大剂量 使用微型大剂量代替使用临时基础率,更快的干预 @@ -957,7 +955,6 @@ 目标血糖最大值超出范围! 临时目标:\n最小: %1$s\n最大: %2$s\n持续时间: %3$s 临时目标:\n目标: %1$s\n持续时间: %2$s - 临时目标:\原因: %1$s\n目标: %2$s\n持续时间: %3$s 快速向导: %1$s\n胰岛素: %2$.2fU\n碳水: %3$d克 计算. 向导:\n胰岛素: %1$.2fU\n碳水: %2$d克 在设备上显示条目: diff --git a/automation/src/main/res/values-it-rIT/strings.xml b/automation/src/main/res/values-it-rIT/strings.xml index 01f8733efa..926f76ebc6 100644 --- a/automation/src/main/res/values-it-rIT/strings.xml +++ b/automation/src/main/res/values-it-rIT/strings.xml @@ -120,4 +120,7 @@ Sicuro di voler eliminare %1$d elementi Ordina Automazione sistema + Esegui automazioni + Aggiungi regola + Rimuovi/ordina diff --git a/automation/src/main/res/values-nl-rNL/strings.xml b/automation/src/main/res/values-nl-rNL/strings.xml index cf5f20fb24..d4815fd566 100644 --- a/automation/src/main/res/values-nl-rNL/strings.xml +++ b/automation/src/main/res/values-nl-rNL/strings.xml @@ -120,4 +120,7 @@ Weet je zeker dat je %1$d items wilt verwijderen Sorteren Systeem automatisering + Automatisering uitvoeren + Regel toevoegen + Verwijderen/sorteren diff --git a/core/src/main/res/values-it-rIT/strings.xml b/core/src/main/res/values-it-rIT/strings.xml index 5ac31e2345..0f86119b89 100644 --- a/core/src/main/res/values-it-rIT/strings.xml +++ b/core/src/main/res/values-it-rIT/strings.xml @@ -42,6 +42,7 @@ CHO Profilo non valido !!! NESSUN PROFILO IMPOSTATO + ]]> Data Unità DIA @@ -441,6 +442,52 @@ file utente + Autotune + Aiuto per potenziali regolazioni del profilo (ISF, rapporto CHO e velocità basali) + AT + Impostazioni Autotune + Automazione cambio profilo + Se abilitato, Autotune si aggiornerà automaticamente e passerà al profilo di input dopo il calcolo da una regola di automazione. + Classifica UAM come basale + Abilita solo se hai inserito in modo affidabile tutti i carboidrati assunti, con questa opzione aumenti improvvisi individuati da Autotune verranno usati per consigliare modifiche alla velocità basale. + Regola la curva dell\'insulina + Abilita solo se usi free-peak. Questa opzione regolerà la durata di picco e DIA + Numero di giorni di dati + Applica il risultato medio in IC/ISF circadiano + Autotune non regolerà le variazioni circadiane, questa opzione applica solo la regolazione media di IC e ISF al tuo profilo di input circadiano + Includi più informazioni di log per il debug + Attiva solo se richiesto dallo sviluppatore per inviare ulteriori informazioni di log per aiutare il debug del plugin Autotune + Numero predefinito di giorni di dati da elaborare da Autotune (fino a 30) + Regolato + Profilo : + Giorni regolazione : + Ultima esecuzione : + Avviso : + Seleziona il profilo da regolare + Il profilo selezionato ha %1$d valori IC. Autotune userà %2$.2f g/U + Il profilo selezionato ha %1$d valori ISF. Autotune userà %2$.1f %3$s/U + Errore nei dati di input, prova a eseguire di nuovo Autotune o ridurre il numero di giorni + Il calcolo di Autotune è iniziato, attendi + Controlla attentamente i risultati prima di utilizzarli! + Risultato parziale giorno %1$d / %2$d regolato + Risultato: %1$s + Param + % + Mancante + Profilo Autotune %1$s + Esegui Autotune + Controlla il profilo di input + Compara profili + Copia nel profilo locale + Aggiorna il profilo di input + Ripristina il profilo di input + Creare un nuovo profilo locale da questo profilo Autotune? + Aggiornare il profilo %1$s con il profilo Autotune? + Ripristinare il profilo %1$s con il profilo di input? + Profilo non valido + Autotune eseguito senza cambio profilo + Autotune eseguito e profilo cambiato automaticamente + Errore durante l\'ultima esecuzione di Autotune %1$d giorno %1$d giorni diff --git a/core/src/main/res/values-nl-rNL/strings.xml b/core/src/main/res/values-nl-rNL/strings.xml index 28fccb7843..9a314f98f1 100644 --- a/core/src/main/res/values-nl-rNL/strings.xml +++ b/core/src/main/res/values-nl-rNL/strings.xml @@ -42,6 +42,7 @@ Koolhydraten Ongeldig profiel !!! Geen profiel ingesteld + ]]> Datum Eenheden DIA @@ -441,10 +442,52 @@ bestand gebruiker + Autotune + Hulp voor potentiële aanpassingen van het profiel (ISF, koolhydraten en basale koersen) + AT + Autotune instellingen + Automatisering Profiel Wissel + Indien ingeschakeld, wordt Autotune automatisch bijgewerkt en overschakelen naar invoerprofiel na de berekening van een automatiseringsregel. + UAM als basaal categoriseren + Alleen inschakelen als u betrouwbaar alle koolhydraten ingevoerd en hebt opgegeten, met deze optie zullen plotselinge stijgingen van Autotune worden gebruikt om wijzigingen in de basaalstand aan te bevelen. Insuline curve afstemmen Alleen inschakelen als je vrije piek gebruikt. Deze optie zal piek en DIA duur afstemmen + Aantal dagen data + Gemiddelde resultaat toepassen in circadiaan IC/ISF + Autotune zal de circadiaanse variaties niet afstemmen, deze optie past alleen de gemiddelde tuning van IC en ISF toe op uw circadiaanse invoerprofiel + Meer log-informatie voor foutopsporing toevoegen + Schakel alleen in op verzoek van een onwikkelaar om meer log-informatie te sturen om Autotune plugin te helpen debuggen Standaard aantal dagen aan gegevens dat Autotune moet verwerken (tot 30) + Tuned + Profiel : + Afstemmen dagen : + Laatste berekening : + Waarschuwing : + Selecteer profiel om aan te passen + Het geselecteerde profiel heeft %1$d IC waarden. Autotune gebruikt %2$.2f g/E + Het geselecteerde profiel heeft %1$d ISF waarden. Autotune gebruikt %2$.1f %3$s/E Fout in invoergegevens, probeer autotune opnieuw te starten of het aantal dagen te verminderen + Autotune berekening gestart, even geduld a.u.b. + Controleer de resultaten zorgvuldig voordat u het gebruikt! + Gedeeltelijk resultaat dag %1$d / %2$d afgestemd + Resultaat: %1$s + Parameter + % + Ontbreekt + Autotune profiel %1$s + Autotune uitvoeren + Controleer invoerprofiel + Vergelijk profielen + Kopiëren naar lokaal profiel + Invoerprofiel bijwerken + Invoerprofiel ongedaan maken + Een lokaal profiel van dit Autotune profiel aanmaken? + Profiel %1$s bijwerken met Autotune Profiel? + Profiel %1$s terugzetten met invoerprofiel? + Profiel ongeldig + Autotune uitgevoerd zonder profiel aanpassing + Autotune uitgevoerd en profiel automatisch gewisseld + Fout tijdens laatste Autotune uitvoeren %1$d dag %1$d dagen diff --git a/danar/src/main/res/values-it-rIT/strings.xml b/danar/src/main/res/values-it-rIT/strings.xml index 3ea04e700d..5a4de59455 100644 --- a/danar/src/main/res/values-it-rIT/strings.xml +++ b/danar/src/main/res/values-it-rIT/strings.xml @@ -1,2 +1,4 @@ - + + Azione non supportata nel micro. Usa solo l\'interfaccia di AndroidAPS! + diff --git a/danar/src/main/res/values-nl-rNL/strings.xml b/danar/src/main/res/values-nl-rNL/strings.xml index 3ea04e700d..ff920b8ec5 100644 --- a/danar/src/main/res/values-nl-rNL/strings.xml +++ b/danar/src/main/res/values-nl-rNL/strings.xml @@ -1,2 +1,4 @@ - + + Niet-ondersteunde actie in pomp. Gebruik alleen AndroidAPS gebruikersinterface! + diff --git a/diaconn/src/main/res/values-it-rIT/strings.xml b/diaconn/src/main/res/values-it-rIT/strings.xml index c4c7b80b16..2aad15a22a 100644 --- a/diaconn/src/main/res/values-it-rIT/strings.xml +++ b/diaconn/src/main/res/values-it-rIT/strings.xml @@ -152,4 +152,6 @@ Stato LGS già su OFF. Comando di disattivazione rifiutato. L\'avvio della basale temporanea viene rifiutato quando è già in esecuzione una basale temporanea Lo stop della basale temporanea viene rifiutato quando non è in esecuzione alcuna basale temporanea + Invia i log del micro a Diaconn Cloud. + Sincronizzazione Diaconn Cloud diff --git a/diaconn/src/main/res/values-nl-rNL/strings.xml b/diaconn/src/main/res/values-nl-rNL/strings.xml index acee82d0a6..ab90c38045 100644 --- a/diaconn/src/main/res/values-nl-rNL/strings.xml +++ b/diaconn/src/main/res/values-nl-rNL/strings.xml @@ -152,4 +152,6 @@ LGS status UIT, UIT Commando is geweigerd. Tijdelijk basaal start geweigerd als tijdelijk basaal wordt uitgevoerd Tijdelijk basaal stop geweigerd als tijdelijk basaal niet wordt uitgevoerd + Stuur pomp logs naar de Diaconn Cloud. + Diaconn Cloud Sync diff --git a/openhumans/src/main/res/values-it-rIT/strings.xml b/openhumans/src/main/res/values-it-rIT/strings.xml index 6ef4309f8e..54f578f9b4 100644 --- a/openhumans/src/main/res/values-it-rIT/strings.xml +++ b/openhumans/src/main/res/values-it-rIT/strings.xml @@ -16,4 +16,42 @@ Sei stato disconnesso da Open Humans Fare click qui per accedere di nuovo. Carica adesso + Avanti + Benvenuto in Open Humans + Per configurare il caricamento dei dati, fai click su \'Avanti\'. + Consenso + Termini d\'uso + Leggi attentamente le seguenti informazioni e accetta i termini d\'uso per procedere. + Questo è uno strumento open source che copierà i tuoi dati su Open Humans. Non ci riserviamo alcun diritto di condividere i tuoi dati con terze parti senza la tua esplicita autorizzazione. I dati che il progetto e l\'app ricevono vengono identificati tramite un ID utente casuale e verranno trasmessi in modo sicuro a un account Open Humans solo con la tua autorizzazione per tale processo. Puoi interrompere il caricamento ed eliminare i dati di caricamento in qualsiasi momento tramite www.openhumans.org. + Dati caricati + Valori glicemia + Boli + Boli estesi + Carboidrati + Eventi Portale (eccetto le note) + Cambi profilo + Dosi giornaliere totali + Velocità basali temporanee + Target temporanei + Impostazioni + Versione applicazione + Modello dispositivo + Dimensioni schermo + Dati di debug dell\'algoritmo + Dati NON caricati + Password + URL di Nightscout + API Secret di Nightscout + Campi di testo libero + Comprendo e accetto. + Accesso a Open Humans + Tocchi finali + Sei a solo un passo dal caricare i tuoi dati su Open Humans. Vuoi procedere? + Annulla + Continua + Completamento... + Potrebbe richiedere alcuni secondi. + Abbiamo fatto! + D\'ora in poi, il tuo telefono caricherà i dati in background di tanto in tanto. + Chiudi diff --git a/openhumans/src/main/res/values-nl-rNL/strings.xml b/openhumans/src/main/res/values-nl-rNL/strings.xml index 39127a1a5e..9a35bba7e0 100644 --- a/openhumans/src/main/res/values-nl-rNL/strings.xml +++ b/openhumans/src/main/res/values-nl-rNL/strings.xml @@ -16,4 +16,42 @@ Je bent uitgelogd van Open Humans Klik hier om opnieuw in te loggen als dit niet opzettelijk was. Nu Uploaden + Volgende + Welkom bij Open Humans + Klik op \'Volgende\' om gegevens te uploaden. + Toestemming + Gebruiksvoorwaarden + Lees zorgvuldig de volgende informatie en accepteer de gebruiksvoorwaarden om verder te gaan. + Dit is een open source tool die jouw gegevens zal kopiëren naar Open Humans. We behouden geen rechten om je gegevens met derden te delen zonder je expliciete toestemming. De gegevens die het project en de app ontvangen worden geïdentificeerd via een willekeurige gebruikers-ID en zullen alleen veilig worden verzonden naar een Open Humans account met uw toestemming voor dat proces. U kunt op elk gewenst moment stoppen met uploaden en uw upload gegevens verwijderen via www.openhumans.org. + Gegevensupload + Glucose waarden + Bolussen + Vertraagde bolus + Koolhydraten + Careportal gebeurtenissen (behalve notities) + Profiel wisselingen + Totaal Dagelijkse Doses + Tijdelijke basaalstanden + Tijdelijke streefdoelen + Instellingen + Applicatie versie + Apparaat model + Scherm afmetingen + Algoritme debug data + Gegevens NIET ge-upload + Wachtwoorden + Nightscout URL + Nightscout API Secret + Vrije tekstvelden + Ik begrijp het en ga akkoord. + Aanmelden bij Open Humans + Laatste details + U bent slechts één stap verwijderd van het uploaden van uw gegevens naar Open Humans. Wilt u doorgaan? + Afbreken + Ga verder + Voltooien... + Dit kan enkele seconden duren. + We zijn klaar! + Voortaan zal je telefoon zo nu en dan op de achtergrond gegevens uploaden. + Sluiten diff --git a/pump-common/src/main/res/values-it-rIT/strings.xml b/pump-common/src/main/res/values-it-rIT/strings.xml index 55baa3f071..37d4766e94 100644 --- a/pump-common/src/main/res/values-it-rIT/strings.xml +++ b/pump-common/src/main/res/values-it-rIT/strings.xml @@ -1,6 +1,27 @@ + Operazione non supportata dal micro e/o dal driver. + Operazione NON ANCORA supportata dal micro. + OK + Mai connesso + Risveglio + Errore nella comunicazione + Timeout della comunicazione + Micro irraggiungibile + Configurazione non valida + Attivo + In sospensione + Basali + Configurazioni + Notifiche + Statistiche + Sconosciuti + Tutto + Boli + Caricamento + Allarmi + Glicemia diff --git a/pump-common/src/main/res/values-nl-rNL/strings.xml b/pump-common/src/main/res/values-nl-rNL/strings.xml index 55baa3f071..98c757c2f2 100644 --- a/pump-common/src/main/res/values-nl-rNL/strings.xml +++ b/pump-common/src/main/res/values-nl-rNL/strings.xml @@ -1,6 +1,27 @@ + Bewerking niet ondersteund door pomp en/of driver. + Operatie NOG niet ondersteund door de pomp. + OK + Nooit verbonden + Actief worden + Communicatiefout + Time-out bij communicatie + Pomp niet beschikbaar + Ongeldige configuratie + Actief + Slapen + Basaalstanden + Instellingen + Meldingen + Statistieken + Onbekend + Alle + Bolussen + Vullen + Alarmen + Glucose diff --git a/shared/src/main/res/values-iw-rIL/strings.xml b/shared/src/main/res/values-iw-rIL/strings.xml index 554d7a16e3..c1a2923953 100644 --- a/shared/src/main/res/values-iw-rIL/strings.xml +++ b/shared/src/main/res/values-iw-rIL/strings.xml @@ -1,4 +1,30 @@ + לפני %1$d דקות + לפני %1$d דקות + לפני %1$.1f שעות + לפני %1$.1f ימים + לפני %1$.0f ימים + בעוד %1$.0f ימים + בעוד %1$.0f ימים + ש\' + ימים + שעות + שניה + דקה + שעה + יום + שבוע + שניות + דקות + שעות + ימים + שבועות + דק\' + י\' + מאוחר יותר היום + מחר + היום + אתמול diff --git a/shared/src/main/res/values-nl-rNL/strings.xml b/shared/src/main/res/values-nl-rNL/strings.xml index 554d7a16e3..b927c43d0b 100644 --- a/shared/src/main/res/values-nl-rNL/strings.xml +++ b/shared/src/main/res/values-nl-rNL/strings.xml @@ -1,4 +1,30 @@ + %1$d m geleden + %1$d minuten geleden + %1$.1f uur geleden + %1$.1f dagen geleden + %1$.0f dagen geleden + over %1$.0f dagen + over %1$.0f dagen + u + dagen + uren + seconde + minuut + uur + dag + week + seconden + minuten + uren + dagen + weken + m + d + Later vandaag + Morgen + Vandaag + Gisteren diff --git a/wear/src/main/res/values-it-rIT/strings.xml b/wear/src/main/res/values-it-rIT/strings.xml index f4a184765a..b6a8e15f35 100644 --- a/wear/src/main/res/values-it-rIT/strings.xml +++ b/wear/src/main/res/values-it-rIT/strings.xml @@ -2,6 +2,15 @@ AAPS AAPS + AAPS + AAPS(Large) + AAPS(BigChart) + AAPS(NoChart) + AAPS(Circle) + AAPS(v2) + AAPS(Cockpit) + AAPS(Steampunk) + AAPS(DigitalStyle) AAPS(azioni) AAPS(Temp Target) AAPS(Quick Wizard) @@ -55,6 +64,7 @@ Complication Tap Action Unicode in Complications Versione: + Più impostazioni watchface Controlla configurazione watchface. TempT Calcolatore @@ -80,6 +90,7 @@ Calcolo richiesto Riempimento richiesto CHO richiesti + Cambio profilo richiesto Target Basso Alto @@ -101,6 +112,7 @@ CANCELLA BOLO Micro Loop + Cambio profilo TDD CHO IOB @@ -156,4 +168,20 @@ Nessuna configurazione disponibile Controlli smartwatch disabilitati Nessun dato disponibile + incremento + decremento + H + L + media + --U + --g + -.--U/h + Caricamento: ---% + S: nessuno stato + -- Minuti fa + --- mg/dl + Nessun stato di loop + 000g + 00,0 + 0,00U diff --git a/wear/src/main/res/values-iw-rIL/strings.xml b/wear/src/main/res/values-iw-rIL/strings.xml index 0fab8bcc3e..d2a3183b5d 100644 --- a/wear/src/main/res/values-iw-rIL/strings.xml +++ b/wear/src/main/res/values-iw-rIL/strings.xml @@ -2,6 +2,15 @@ AAPS AAPS + AAPS + AAPS (גדול) + AAPS (תרשים גדול) + AAPS (ללא תרשים) + AAPS (עיגול) + AAPS (v2) + AAPS (תא טייס) + AAPS (סטימפאנק) + AAPS (דיגיטלי) AAPS (פעולות) AAPS (מטרה זמנית) AAPS (אשף מהיר) @@ -55,6 +64,7 @@ פעולת הקשה על סיבוך יוניקוד בסיבוכים גירסה: + עוד הגדרות פני שעון עיינו בהגדרות פני השעון בבקשה. מטרה זמנית מחשבון @@ -80,6 +90,7 @@ התבקש חישוב התבקש מילוי נדרשו פחמימות + התבקשה החלפת פרופיל ערך מטרה נמוך גבוה @@ -101,6 +112,7 @@ ביטול בולוס משאבה לולאה + החלפת פרופיל סה\"כ מינון אינסולין יומי TDD פחמימות כמות אינסולין פעילה @@ -156,4 +168,20 @@ אין הגדרה שליטה משעון Wear אינה מאופשרת אין נתונים זמינים + תוספת + הפחתה + גב\' + נמ\' + ממוצע + -- יח\' + -- גר\' + -.--יח\' לשעה + מעלה: --- % + אין סטטוס + לפני -- דקות + --- mg/dl + חסר סטטוס לולאה + 000 גר\' + 00,0 + 0,00 יח\' diff --git a/wear/src/main/res/values-nl-rNL/strings.xml b/wear/src/main/res/values-nl-rNL/strings.xml index 56deef316c..47492205a0 100644 --- a/wear/src/main/res/values-nl-rNL/strings.xml +++ b/wear/src/main/res/values-nl-rNL/strings.xml @@ -2,6 +2,15 @@ AAPS AAPS + AAPS + AAPS(Groot) + AAPS(GroteGrafiek) + AAPS(GeenGrafiek) + AAPS(Cirkel) + AAPS(v2) + AAPS(Cockpit) + AAPS(Steampunk) + AAPS(DigitaleStijl) AAPS(Acties) AAPS(Tijdelijk Streefdoel) AAPS(Quick Wizard) @@ -55,6 +64,7 @@ Complicatie tik voor actie Unicode in complicaties Versie: + Meer Watchface instellingen Kijk naar de Watchface configuratie, alsjeblieft. TijdStreefd Calculator @@ -80,6 +90,7 @@ Berekening aangevraagd Vullen aangevraagd Koolhydraten aangevraagd + Profiel wisselen aangevraagd Doel Laag Hoog @@ -101,6 +112,7 @@ BOLUS ANNULEREN Pomp Loop + Profiel wissel TDD Khd IOB @@ -156,4 +168,20 @@ Geen configuratie beschikbaar Wear OS besturing uitgeschakeld Geen data beschikbaar + verhoog + verlaag + H + L + gem + --E + --g + -.--E/uur + Uploader: ---% + S: geen status + -- Minuten geleden + --- mg/dl + Geen Loop Status + 000g + 00,0 + 0,00E diff --git a/wear/src/main/res/values/strings.xml b/wear/src/main/res/values/strings.xml index d5331aa883..2387f2ed94 100644 --- a/wear/src/main/res/values/strings.xml +++ b/wear/src/main/res/values/strings.xml @@ -1,9 +1,7 @@ - AAPS AAPS - AAPS AAPS(Large) AAPS(BigChart) @@ -13,19 +11,15 @@ AAPS(Cockpit) AAPS(Steampunk) AAPS(DigitalStyle) - AAPS(Actions) AAPS(Temp Target) AAPS(Quick Wizard) - No data! Old data! Since %1$s Sync with AAPS! - No data received since %1$s! Check if AAPS on the phone sends data to watch AAPS data is %1$s old! Check your sensor, xDrip+, NS, AAPS config or other! - Vibrate on Bolus Units for Actions Show Date @@ -72,7 +66,6 @@ Version: More Watchface settings Look into Watchface configuration, please. - TempT Calculator Calc @@ -89,7 +82,6 @@ Default Menu XL - Duration Temp Target Requested Quick Wizard Requested @@ -115,20 +107,16 @@ CONFIRM timeshift Bolus - Bolus Progress press to cancel CANCEL BOLUS - Pump Loop Profile switch TDD - Carb IOB no status - red pink purple @@ -153,16 +141,13 @@ multicolor Simplify UI Only show time and BG - Vibrate hourly Show Week number - Your style: no style minimal style shape style full style - Your color: Your color saturation: Your color opacity: @@ -183,7 +168,6 @@ No config available Wear controls disabled No data available - QuickWizard wearcontrol units_mgdl @@ -236,7 +220,6 @@ --- mg/dl No Loop Status 000g - 00,0 + 00,0 0,00U - From 32cb4f02af137606931ccecaaa0d8e1e72dc2d73 Mon Sep 17 00:00:00 2001 From: Philoul Date: Sat, 25 Jun 2022 19:44:12 +0200 Subject: [PATCH 014/154] Add unit test for CategorizeUAM as basal setting true or false --- .../general/autotune/AutotunePrepTest.kt | 106 +- .../test2/aaps-entries.2022-05-21.json | 2882 +++++++++++++++ .../test2/aaps-treatments.2022-05-21.json | 3146 +++++++++++++++++ .../aapsorefautotune_recommendations.log | 53 + .../test2/aapsorefprofile.2022-05-21.json | 147 + .../res/autotune/test2/aapsorefprofile.json | 175 + .../autotune/test2/autotune.2022-05-21.json | 1 + .../test2/autotune.2022-06-25-111214.log | 420 +++ .../test2/newaapsorefprofile.2022-05-21.json | 175 + .../test2/oaps-iobCalc.2022-05-21.json | 286 ++ .../test/res/autotune/test2/profile.pump.json | 147 + .../test3/aaps-entries.2022-05-21.json | 2882 +++++++++++++++ .../test3/aaps-treatments.2022-05-21.json | 3146 +++++++++++++++++ .../aapsorefautotune_recommendations.log | 53 + .../test3/aapsorefprofile.2022-05-21.json | 147 + .../res/autotune/test3/aapsorefprofile.json | 173 + .../autotune/test3/autotune.2022-05-21.json | 1 + .../test3/autotune.2022-06-25-111350.log | 425 +++ .../test3/newaapsorefprofile.2022-05-21.json | 173 + .../test3/oaps-iobCalc.2022-05-21.json | 286 ++ .../test/res/autotune/test3/profile.pump.json | 147 + 21 files changed, 14962 insertions(+), 9 deletions(-) create mode 100644 app/src/test/res/autotune/test2/aaps-entries.2022-05-21.json create mode 100644 app/src/test/res/autotune/test2/aaps-treatments.2022-05-21.json create mode 100644 app/src/test/res/autotune/test2/aapsorefautotune_recommendations.log create mode 100644 app/src/test/res/autotune/test2/aapsorefprofile.2022-05-21.json create mode 100644 app/src/test/res/autotune/test2/aapsorefprofile.json create mode 100644 app/src/test/res/autotune/test2/autotune.2022-05-21.json create mode 100644 app/src/test/res/autotune/test2/autotune.2022-06-25-111214.log create mode 100644 app/src/test/res/autotune/test2/newaapsorefprofile.2022-05-21.json create mode 100644 app/src/test/res/autotune/test2/oaps-iobCalc.2022-05-21.json create mode 100644 app/src/test/res/autotune/test2/profile.pump.json create mode 100644 app/src/test/res/autotune/test3/aaps-entries.2022-05-21.json create mode 100644 app/src/test/res/autotune/test3/aaps-treatments.2022-05-21.json create mode 100644 app/src/test/res/autotune/test3/aapsorefautotune_recommendations.log create mode 100644 app/src/test/res/autotune/test3/aapsorefprofile.2022-05-21.json create mode 100644 app/src/test/res/autotune/test3/aapsorefprofile.json create mode 100644 app/src/test/res/autotune/test3/autotune.2022-05-21.json create mode 100644 app/src/test/res/autotune/test3/autotune.2022-06-25-111350.log create mode 100644 app/src/test/res/autotune/test3/newaapsorefprofile.2022-05-21.json create mode 100644 app/src/test/res/autotune/test3/oaps-iobCalc.2022-05-21.json create mode 100644 app/src/test/res/autotune/test3/profile.pump.json diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt index 74c6ff6e15..e36843b2da 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt @@ -39,7 +39,6 @@ class AutotunePrepTest : TestBaseWithProfile() { @Mock lateinit var repository: AppRepository lateinit var autotunePrep: AutotunePrep lateinit var autotuneIob: TestAutotuneIob - lateinit var inputProfile: ATProfile var min5mCarbImpact = 0.0 var autotuneMin = 0.0 var autotuneMax = 0.0 @@ -49,16 +48,16 @@ class AutotunePrepTest : TestBaseWithProfile() { @Before fun initData() { TimeZone.setDefault(TimeZone.getTimeZone("GMT+2")) - val inputProfileJson = File("src/test/res/autotune/test1/profile.pump.json").readText() - inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! + } + + @Test + fun autotunePrepTest1() { // Test if categorisation with standard treatments with carbs is Ok val inputIobJson = File("src/test/res/autotune/test1/oaps-iobCalc.2022-05-21.json").readText() //json files build with iob/activity calculated by OAPS val iobOapsCalcul = buildIobOaps(JSONArray(inputIobJson)) autotuneIob = TestAutotuneIob(aapsLogger, repository, profileFunction, sp, dateUtil, activePlugin, autotuneFS, iobOapsCalcul) autotunePrep = AutotunePrep(sp, dateUtil, autotuneFS, autotuneIob) - } - - @Test - fun autotunePrepTest() { // Test if load from file of OpenAPS categorisation is Ok + val inputProfileJson = File("src/test/res/autotune/test1/profile.pump.json").readText() + val inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! val prepjson = File("src/test/res/autotune/test1/autotune.2022-05-21.json").readText() val oapsPreppedGlucose = PreppedGlucose(JSONObject(prepjson), dateUtil) //prep data calculated by OpenAPS autotune val oapsEntriesJson = File("src/test/res/autotune/test1/aaps-entries.2022-05-21.json").readText() @@ -67,7 +66,7 @@ class AutotunePrepTest : TestBaseWithProfile() { autotuneIob.meals = buildMeals(JSONArray(oapsTreatmentsJson)) //Only meals is used in unit test, Insulin only used for iob calculation autotuneIob.boluses = buildBoluses(oapsPreppedGlucose) //Values from oapsPrepData because linked to iob calculation method for TBR `when`(sp.getDouble(R.string.key_openapsama_min_5m_carbimpact, 3.0)).thenReturn(min5mCarbImpact) - + `when`(sp.getBoolean(R.string.key_autotune_categorize_uam_as_basal, false)).thenReturn(false) val aapsPreppedGlucose = autotunePrep.categorizeBGDatums(inputProfile, inputProfile.localInsulin, false) try { aapsPreppedGlucose?.let { // compare all categorization calculated by aaps plugin (aapsPreppedGlucose) with categorization calculated by OpenAPS (oapsPreppedGlucose) @@ -75,8 +74,12 @@ class AutotunePrepTest : TestBaseWithProfile() { Assert.assertTrue(oapsPreppedGlucose.crData[i].equals(aapsPreppedGlucose.crData[i])) for (i in aapsPreppedGlucose.csfGlucoseData.indices) Assert.assertTrue(oapsPreppedGlucose.csfGlucoseData[i].equals(aapsPreppedGlucose.csfGlucoseData[i])) + oapsPreppedGlucose.isfGlucoseData = oapsPreppedGlucose.isfGlucoseData.sortedBy { it.date } + aapsPreppedGlucose.isfGlucoseData = aapsPreppedGlucose.isfGlucoseData.sortedBy { it.date } for (i in aapsPreppedGlucose.isfGlucoseData.indices) Assert.assertTrue(oapsPreppedGlucose.isfGlucoseData[i].equals(aapsPreppedGlucose.isfGlucoseData[i])) + oapsPreppedGlucose.basalGlucoseData = oapsPreppedGlucose.basalGlucoseData.sortedBy { it.date } + aapsPreppedGlucose.basalGlucoseData = aapsPreppedGlucose.basalGlucoseData.sortedBy { it.date } for (i in aapsPreppedGlucose.basalGlucoseData.indices) Assert.assertTrue(oapsPreppedGlucose.basalGlucoseData[i].equals(aapsPreppedGlucose.basalGlucoseData[i])) } @@ -87,8 +90,85 @@ class AutotunePrepTest : TestBaseWithProfile() { } + @Test + fun autotunePrepTest2() { // Test if categorisation without carbs (full UAM) and categorize UAM as basal false is Ok + val inputIobJson = File("src/test/res/autotune/test2/oaps-iobCalc.2022-05-21.json").readText() //json files build with iob/activity calculated by OAPS + val iobOapsCalcul = buildIobOaps(JSONArray(inputIobJson)) + autotuneIob = TestAutotuneIob(aapsLogger, repository, profileFunction, sp, dateUtil, activePlugin, autotuneFS, iobOapsCalcul) + autotunePrep = AutotunePrep(sp, dateUtil, autotuneFS, autotuneIob) + val inputProfileJson = File("src/test/res/autotune/test2/profile.pump.json").readText() + val inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! + val prepjson = File("src/test/res/autotune/test2/autotune.2022-05-21.json").readText() + val oapsPreppedGlucose = PreppedGlucose(JSONObject(prepjson), dateUtil) //prep data calculated by OpenAPS autotune + val oapsEntriesJson = File("src/test/res/autotune/test2/aaps-entries.2022-05-21.json").readText() + autotuneIob.glucose = buildGlucose(JSONArray(oapsEntriesJson)) + val oapsTreatmentsJson = File("src/test/res/autotune/test2/aaps-treatments.2022-05-21.json").readText() + autotuneIob.meals = buildMeals(JSONArray(oapsTreatmentsJson)) //Only meals is used in unit test, Insulin only used for iob calculation + autotuneIob.boluses = buildBoluses(oapsPreppedGlucose) //Values from oapsPrepData because linked to iob calculation method for TBR + `when`(sp.getDouble(R.string.key_openapsama_min_5m_carbimpact, 3.0)).thenReturn(min5mCarbImpact) + `when`(sp.getBoolean(R.string.key_autotune_categorize_uam_as_basal, false)).thenReturn(false) // CategorizeUAM as Basal = False + val aapsPreppedGlucose = autotunePrep.categorizeBGDatums(inputProfile, inputProfile.localInsulin, false) + try { + aapsPreppedGlucose?.let { // compare all categorization calculated by aaps plugin (aapsPreppedGlucose) with categorization calculated by OpenAPS (oapsPreppedGlucose) + for (i in aapsPreppedGlucose.crData.indices) + Assert.assertTrue(oapsPreppedGlucose.crData[i].equals(aapsPreppedGlucose.crData[i])) + for (i in aapsPreppedGlucose.csfGlucoseData.indices) + Assert.assertTrue(oapsPreppedGlucose.csfGlucoseData[i].equals(aapsPreppedGlucose.csfGlucoseData[i])) + oapsPreppedGlucose.isfGlucoseData = oapsPreppedGlucose.isfGlucoseData.sortedBy { it.date } + aapsPreppedGlucose.isfGlucoseData = aapsPreppedGlucose.isfGlucoseData.sortedBy { it.date } + for (i in aapsPreppedGlucose.isfGlucoseData.indices) + Assert.assertTrue(oapsPreppedGlucose.isfGlucoseData[i].equals(aapsPreppedGlucose.isfGlucoseData[i])) + oapsPreppedGlucose.basalGlucoseData = oapsPreppedGlucose.basalGlucoseData.sortedBy { it.date } + aapsPreppedGlucose.basalGlucoseData = aapsPreppedGlucose.basalGlucoseData.sortedBy { it.date } + for (i in aapsPreppedGlucose.basalGlucoseData.indices) + Assert.assertTrue(oapsPreppedGlucose.basalGlucoseData[i].equals(aapsPreppedGlucose.basalGlucoseData[i])) + } + ?: Assert.fail() + } catch (e: Exception) { + Assert.fail() + } + } - /** + @Test + fun autotunePrepTest3() { // Test if categorisation without carbs (full UAM) and categorize UAM as basal true is Ok + val inputIobJson = File("src/test/res/autotune/test3/oaps-iobCalc.2022-05-21.json").readText() //json files build with iob/activity calculated by OAPS + val iobOapsCalcul = buildIobOaps(JSONArray(inputIobJson)) + autotuneIob = TestAutotuneIob(aapsLogger, repository, profileFunction, sp, dateUtil, activePlugin, autotuneFS, iobOapsCalcul) + autotunePrep = AutotunePrep(sp, dateUtil, autotuneFS, autotuneIob) + val inputProfileJson = File("src/test/res/autotune/test3/profile.pump.json").readText() + val inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! + val prepjson = File("src/test/res/autotune/test3/autotune.2022-05-21.json").readText() + val oapsPreppedGlucose = PreppedGlucose(JSONObject(prepjson), dateUtil) //prep data calculated by OpenAPS autotune + val oapsEntriesJson = File("src/test/res/autotune/test3/aaps-entries.2022-05-21.json").readText() + autotuneIob.glucose = buildGlucose(JSONArray(oapsEntriesJson)) + val oapsTreatmentsJson = File("src/test/res/autotune/test3/aaps-treatments.2022-05-21.json").readText() + autotuneIob.meals = buildMeals(JSONArray(oapsTreatmentsJson)) //Only meals is used in unit test, Insulin only used for iob calculation + autotuneIob.boluses = buildBoluses(oapsPreppedGlucose) //Values from oapsPrepData because linked to iob calculation method for TBR + `when`(sp.getDouble(R.string.key_openapsama_min_5m_carbimpact, 3.0)).thenReturn(min5mCarbImpact) + `when`(sp.getBoolean(R.string.key_autotune_categorize_uam_as_basal, false)).thenReturn(true) // CategorizeUAM as Basal = True + val aapsPreppedGlucose = autotunePrep.categorizeBGDatums(inputProfile, inputProfile.localInsulin, false) + try { + aapsPreppedGlucose?.let { // compare all categorization calculated by aaps plugin (aapsPreppedGlucose) with categorization calculated by OpenAPS (oapsPreppedGlucose) + for (i in aapsPreppedGlucose.crData.indices) + Assert.assertTrue(oapsPreppedGlucose.crData[i].equals(aapsPreppedGlucose.crData[i])) + for (i in aapsPreppedGlucose.csfGlucoseData.indices) + Assert.assertTrue(oapsPreppedGlucose.csfGlucoseData[i].equals(aapsPreppedGlucose.csfGlucoseData[i])) + oapsPreppedGlucose.isfGlucoseData = oapsPreppedGlucose.isfGlucoseData.sortedBy { it.date } + aapsPreppedGlucose.isfGlucoseData = aapsPreppedGlucose.isfGlucoseData.sortedBy { it.date } + for (i in aapsPreppedGlucose.isfGlucoseData.indices) + Assert.assertTrue(oapsPreppedGlucose.isfGlucoseData[i].equals(aapsPreppedGlucose.isfGlucoseData[i])) + oapsPreppedGlucose.basalGlucoseData = oapsPreppedGlucose.basalGlucoseData.sortedBy { it.date } + aapsPreppedGlucose.basalGlucoseData = aapsPreppedGlucose.basalGlucoseData.sortedBy { it.date } + for (i in aapsPreppedGlucose.basalGlucoseData.indices) + Assert.assertTrue(oapsPreppedGlucose.basalGlucoseData[i].equals(aapsPreppedGlucose.basalGlucoseData[i])) + } + ?: Assert.fail() + } catch (e: Exception) { + Assert.fail() + } + } + + /************************************************************************************************************************************************************************************* * OpenAPS profile for Autotune only have one ISF value and one IC value */ fun atProfileFromOapsJson(jsonObject: JSONObject, dateUtil: DateUtil, defaultUnits: String? = null): ATProfile? { @@ -172,6 +252,14 @@ class AutotunePrepTest : TestBaseWithProfile() { ) } } catch (e: Exception) { } + if (boluses.size == 0) //Add at least one insulin treatment for tests to avoid return null in categorization + boluses.add( + Bolus( + timestamp = startDayTime, + amount = 1.0, + type = Bolus.Type.NORMAL + ) + ) return boluses } diff --git a/app/src/test/res/autotune/test2/aaps-entries.2022-05-21.json b/app/src/test/res/autotune/test2/aaps-entries.2022-05-21.json new file mode 100644 index 0000000000..70c349e9d8 --- /dev/null +++ b/app/src/test/res/autotune/test2/aaps-entries.2022-05-21.json @@ -0,0 +1,2882 @@ +[ + { + "device": "AndroidAPS-DexcomG6", + "date": 1653184750000, + "dateString": "2022-05-22T01:59:10.000Z", + "isValid": true, + "sgv": 80, + "direction": "Flat", + "type": "sgv", + "_id": "6289990761a8290004740388" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653184450000, + "dateString": "2022-05-22T01:54:10.000Z", + "isValid": true, + "sgv": 80, + "direction": "Flat", + "type": "sgv", + "_id": "628997d861a8290004740385" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653184150000, + "dateString": "2022-05-22T01:49:10.000Z", + "isValid": true, + "sgv": 80, + "direction": "Flat", + "type": "sgv", + "_id": "628996a961a8290004740382" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653183850000, + "dateString": "2022-05-22T01:44:10.000Z", + "isValid": true, + "sgv": 79, + "direction": "Flat", + "type": "sgv", + "_id": "6289957b61a829000474037f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653183550000, + "dateString": "2022-05-22T01:39:10.000Z", + "isValid": true, + "sgv": 76, + "direction": "Flat", + "type": "sgv", + "_id": "6289945f50e51d0004429e6d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653183249000, + "dateString": "2022-05-22T01:34:09.000Z", + "isValid": true, + "sgv": 73, + "direction": "Flat", + "type": "sgv", + "_id": "6289933050e51d0004429e6b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653182949000, + "dateString": "2022-05-22T01:29:09.000Z", + "isValid": true, + "sgv": 72, + "direction": "Flat", + "type": "sgv", + "_id": "6289920150e51d0004429e69" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653182650000, + "dateString": "2022-05-22T01:24:10.000Z", + "isValid": true, + "sgv": 74, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "628990d350e51d0004429e67" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653182349000, + "dateString": "2022-05-22T01:19:09.000Z", + "isValid": true, + "sgv": 77, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62898fa550e51d0004429e65" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653182050000, + "dateString": "2022-05-22T01:14:10.000Z", + "isValid": true, + "sgv": 81, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62898e7650e51d0004429e63" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653181750000, + "dateString": "2022-05-22T01:09:10.000Z", + "isValid": true, + "sgv": 87, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62898d4750e51d0004429e5f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653181450000, + "dateString": "2022-05-22T01:04:10.000Z", + "isValid": true, + "sgv": 92, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62898c2fda46aa0004d1e0fc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653181150000, + "dateString": "2022-05-22T00:59:10.000Z", + "isValid": true, + "sgv": 97, + "direction": "SingleDown", + "type": "sgv", + "_id": "62898b01da46aa0004d1e0fa" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653180849000, + "dateString": "2022-05-22T00:54:09.000Z", + "isValid": true, + "sgv": 105, + "direction": "SingleDown", + "type": "sgv", + "_id": "628989d2da46aa0004d1e0f8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653180549000, + "dateString": "2022-05-22T00:49:09.000Z", + "isValid": true, + "sgv": 121, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "628988a3da46aa0004d1e0f5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653180250000, + "dateString": "2022-05-22T00:44:10.000Z", + "isValid": true, + "sgv": 135, + "direction": "Flat", + "type": "sgv", + "_id": "62898774da46aa0004d1e0f1" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653179949000, + "dateString": "2022-05-22T00:39:09.000Z", + "isValid": true, + "sgv": 143, + "direction": "Flat", + "type": "sgv", + "_id": "62898645da46aa0004d1e0ee" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653179649000, + "dateString": "2022-05-22T00:34:09.000Z", + "isValid": true, + "sgv": 143, + "direction": "Flat", + "type": "sgv", + "_id": "62898517da46aa0004d1e0ea" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653179350000, + "dateString": "2022-05-22T00:29:10.000Z", + "isValid": true, + "sgv": 142, + "direction": "Flat", + "type": "sgv", + "_id": "628983f69d6f1800047cd0dd" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653179050000, + "dateString": "2022-05-22T00:24:10.000Z", + "isValid": true, + "sgv": 142, + "direction": "Flat", + "type": "sgv", + "_id": "628982c89d6f1800047cd0db" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653178750000, + "dateString": "2022-05-22T00:19:10.000Z", + "isValid": true, + "sgv": 144, + "direction": "Flat", + "type": "sgv", + "_id": "628981999d6f1800047cd0d8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653178449000, + "dateString": "2022-05-22T00:14:09.000Z", + "isValid": true, + "sgv": 147, + "direction": "Flat", + "type": "sgv", + "_id": "6289806a9d6f1800047cd0d6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653178149000, + "dateString": "2022-05-22T00:09:09.000Z", + "isValid": true, + "sgv": 149, + "direction": "Flat", + "type": "sgv", + "_id": "62897f3b9d6f1800047cd0d3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653177850000, + "dateString": "2022-05-22T00:04:10.000Z", + "isValid": true, + "sgv": 149, + "direction": "Flat", + "type": "sgv", + "_id": "62897e0c9d6f1800047cd0d0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653177550000, + "dateString": "2022-05-21T23:59:10.000Z", + "isValid": true, + "sgv": 147, + "direction": "Flat", + "type": "sgv", + "_id": "62897cde9d6f1800047cd0cc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653177250000, + "dateString": "2022-05-21T23:54:10.000Z", + "isValid": true, + "sgv": 146, + "direction": "Flat", + "type": "sgv", + "_id": "62897bc89d6f1800047cd0c9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653176950000, + "dateString": "2022-05-21T23:49:10.000Z", + "isValid": true, + "sgv": 143, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62897a8771a363000480abca" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653176650000, + "dateString": "2022-05-21T23:44:10.000Z", + "isValid": true, + "sgv": 139, + "direction": "Flat", + "type": "sgv", + "_id": "6289797071a363000480abc7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653176350000, + "dateString": "2022-05-21T23:39:10.000Z", + "isValid": true, + "sgv": 132, + "direction": "Flat", + "type": "sgv", + "_id": "6289784271a363000480abc3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653176050000, + "dateString": "2022-05-21T23:34:10.000Z", + "isValid": true, + "sgv": 127, + "direction": "Flat", + "type": "sgv", + "_id": "6289771371a363000480abc1" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653175750000, + "dateString": "2022-05-21T23:29:10.000Z", + "isValid": true, + "sgv": 124, + "direction": "Flat", + "type": "sgv", + "_id": "628975e471a363000480abbe" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653175450000, + "dateString": "2022-05-21T23:24:10.000Z", + "isValid": true, + "sgv": 123, + "direction": "Flat", + "type": "sgv", + "_id": "628974b671a363000480abbc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653175149000, + "dateString": "2022-05-21T23:19:09.000Z", + "isValid": true, + "sgv": 120, + "direction": "Flat", + "type": "sgv", + "_id": "6289738f37d09a00043f2b26" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653174850000, + "dateString": "2022-05-21T23:14:10.000Z", + "isValid": true, + "sgv": 117, + "direction": "Flat", + "type": "sgv", + "_id": "6289727a37d09a00043f2b22" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653174550000, + "dateString": "2022-05-21T23:09:10.000Z", + "isValid": true, + "sgv": 114, + "direction": "Flat", + "type": "sgv", + "_id": "6289727937d09a00043f2b21" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653174249000, + "dateString": "2022-05-21T23:04:09.000Z", + "isValid": true, + "sgv": 111, + "direction": "Flat", + "type": "sgv", + "_id": "6289726037d09a00043f2b20" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653173949000, + "dateString": "2022-05-21T22:59:09.000Z", + "isValid": true, + "sgv": 108, + "direction": "Flat", + "type": "sgv", + "_id": "6289721437d09a00043f2b1f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653173650000, + "dateString": "2022-05-21T22:54:10.000Z", + "isValid": true, + "sgv": 108, + "direction": "Flat", + "type": "sgv", + "_id": "6289717d37d09a00043f2b1e" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653173350000, + "dateString": "2022-05-21T22:49:10.000Z", + "isValid": true, + "sgv": 110, + "direction": "Flat", + "type": "sgv", + "_id": "62896fb837d09a00043f2b1b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653173050000, + "dateString": "2022-05-21T22:44:10.000Z", + "isValid": true, + "sgv": 115, + "direction": "Flat", + "type": "sgv", + "_id": "62896f8537d09a00043f2b1a" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653172749000, + "dateString": "2022-05-21T22:39:09.000Z", + "isValid": true, + "sgv": 120, + "direction": "Flat", + "type": "sgv", + "_id": "62896e8937d09a00043f2b19" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653172450000, + "dateString": "2022-05-21T22:34:10.000Z", + "isValid": true, + "sgv": 124, + "direction": "Flat", + "type": "sgv", + "_id": "62896d8b37d09a00043f2b17" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653172150000, + "dateString": "2022-05-21T22:29:10.000Z", + "isValid": true, + "sgv": 124, + "direction": "Flat", + "type": "sgv", + "_id": "62896cda37d09a00043f2b16" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653171849000, + "dateString": "2022-05-21T22:24:09.000Z", + "isValid": true, + "sgv": 122, + "direction": "Flat", + "type": "sgv", + "_id": "62896c7537d09a00043f2b14" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653171549000, + "dateString": "2022-05-21T22:19:09.000Z", + "isValid": true, + "sgv": 120, + "direction": "Flat", + "type": "sgv", + "_id": "62896c1037d09a00043f2b13" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653171250000, + "dateString": "2022-05-21T22:14:10.000Z", + "isValid": true, + "sgv": 118, + "direction": "Flat", + "type": "sgv", + "_id": "62896b5f6a5ecf00042d5474" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653170950000, + "dateString": "2022-05-21T22:09:10.000Z", + "isValid": true, + "sgv": 117, + "direction": "Flat", + "type": "sgv", + "_id": "62896ac76a5ecf00042d5472" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653170650000, + "dateString": "2022-05-21T22:04:10.000Z", + "isValid": true, + "sgv": 115, + "direction": "Flat", + "type": "sgv", + "_id": "628969fd6a5ecf00042d5471" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653170350000, + "dateString": "2022-05-21T21:59:10.000Z", + "isValid": true, + "sgv": 112, + "direction": "Flat", + "type": "sgv", + "_id": "628969016a5ecf00042d5470" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653170049000, + "dateString": "2022-05-21T21:54:09.000Z", + "isValid": true, + "sgv": 110, + "direction": "Flat", + "type": "sgv", + "_id": "628967a06a5ecf00042d546e" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653169749000, + "dateString": "2022-05-21T21:49:09.000Z", + "isValid": true, + "sgv": 107, + "direction": "Flat", + "type": "sgv", + "_id": "628964906a5ecf00042d546b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653169449000, + "dateString": "2022-05-21T21:44:09.000Z", + "isValid": true, + "sgv": 105, + "direction": "Flat", + "type": "sgv", + "_id": "628961a4fb144900043c34ea" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653169150000, + "dateString": "2022-05-21T21:39:10.000Z", + "isValid": true, + "sgv": 102, + "direction": "Flat", + "type": "sgv", + "_id": "62895f5ffb144900043c34e8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653168849000, + "dateString": "2022-05-21T21:34:09.000Z", + "isValid": true, + "sgv": 100, + "direction": "Flat", + "type": "sgv", + "_id": "62895d98fb144900043c34e5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653168549000, + "dateString": "2022-05-21T21:29:09.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "62895b9a9bf1e6000482ffa1" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653168250000, + "dateString": "2022-05-21T21:24:10.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "628959ed9bf1e6000482ff9e" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653167949000, + "dateString": "2022-05-21T21:19:09.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "6289583f9bf1e6000482ff9b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653167650000, + "dateString": "2022-05-21T21:14:10.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "628956919bf1e6000482ff96" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653167350000, + "dateString": "2022-05-21T21:09:10.000Z", + "isValid": true, + "sgv": 99, + "direction": "Flat", + "type": "sgv", + "_id": "628955179bf1e6000482ff92" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653167049000, + "dateString": "2022-05-21T21:04:09.000Z", + "isValid": true, + "sgv": 101, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "628953e79bf1e6000482ff90" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653166749000, + "dateString": "2022-05-21T20:59:09.000Z", + "isValid": true, + "sgv": 104, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "628952c680fc7e00041b22a9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653166450000, + "dateString": "2022-05-21T20:54:10.000Z", + "isValid": true, + "sgv": 110, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6289519580fc7e00041b22a7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653166149000, + "dateString": "2022-05-21T20:49:09.000Z", + "isValid": true, + "sgv": 118, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6289506680fc7e00041b22a5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653165850000, + "dateString": "2022-05-21T20:44:10.000Z", + "isValid": true, + "sgv": 128, + "direction": "Flat", + "type": "sgv", + "_id": "62894f3880fc7e00041b22a3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653165550000, + "dateString": "2022-05-21T20:39:10.000Z", + "isValid": true, + "sgv": 139, + "direction": "Flat", + "type": "sgv", + "_id": "62894e0980fc7e00041b22a0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653165249000, + "dateString": "2022-05-21T20:34:09.000Z", + "isValid": true, + "sgv": 145, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62894cdb80fc7e00041b229e" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653164950000, + "dateString": "2022-05-21T20:29:10.000Z", + "isValid": true, + "sgv": 143, + "direction": "SingleUp", + "type": "sgv", + "_id": "62894bab80fc7e00041b229b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653164649000, + "dateString": "2022-05-21T20:24:09.000Z", + "isValid": true, + "sgv": 133, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62894a7e4493460004e63a38" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653164350000, + "dateString": "2022-05-21T20:19:10.000Z", + "isValid": true, + "sgv": 120, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6289496a4493460004e63a34" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653164049000, + "dateString": "2022-05-21T20:14:09.000Z", + "isValid": true, + "sgv": 109, + "direction": "Flat", + "type": "sgv", + "_id": "628948214493460004e63a31" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653163749000, + "dateString": "2022-05-21T20:09:09.000Z", + "isValid": true, + "sgv": 100, + "direction": "Flat", + "type": "sgv", + "_id": "6289470c4493460004e63a2d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653163449000, + "dateString": "2022-05-21T20:04:09.000Z", + "isValid": true, + "sgv": 95, + "direction": "Flat", + "type": "sgv", + "_id": "628945dc4493460004e63a2a" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653163150000, + "dateString": "2022-05-21T19:59:10.000Z", + "isValid": true, + "sgv": 91, + "direction": "Flat", + "type": "sgv", + "_id": "628944ae4493460004e63a27" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653162850000, + "dateString": "2022-05-21T19:54:10.000Z", + "isValid": true, + "sgv": 89, + "direction": "Flat", + "type": "sgv", + "_id": "6289437f4493460004e63a25" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653162549000, + "dateString": "2022-05-21T19:49:09.000Z", + "isValid": true, + "sgv": 88, + "direction": "Flat", + "type": "sgv", + "_id": "6289425f598f780004bb3b30" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653162250000, + "dateString": "2022-05-21T19:44:10.000Z", + "isValid": true, + "sgv": 89, + "direction": "Flat", + "type": "sgv", + "_id": "62894118598f780004bb3b2d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653161950000, + "dateString": "2022-05-21T19:39:10.000Z", + "isValid": true, + "sgv": 91, + "direction": "Flat", + "type": "sgv", + "_id": "62893feb598f780004bb3b2b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653161649000, + "dateString": "2022-05-21T19:34:09.000Z", + "isValid": true, + "sgv": 93, + "direction": "Flat", + "type": "sgv", + "_id": "62893ed7598f780004bb3b29" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653161350000, + "dateString": "2022-05-21T19:29:10.000Z", + "isValid": true, + "sgv": 94, + "direction": "Flat", + "type": "sgv", + "_id": "62893daa598f780004bb3b27" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653161049000, + "dateString": "2022-05-21T19:24:09.000Z", + "isValid": true, + "sgv": 95, + "direction": "Flat", + "type": "sgv", + "_id": "62893c7d598f780004bb3b24" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653160749000, + "dateString": "2022-05-21T19:19:09.000Z", + "isValid": true, + "sgv": 97, + "direction": "Flat", + "type": "sgv", + "_id": "62893b4f598f780004bb3b22" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653160449000, + "dateString": "2022-05-21T19:14:09.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "62893a1222fbc8000495b822" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653160150000, + "dateString": "2022-05-21T19:09:10.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "628938fe22fbc8000495b81f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653159849000, + "dateString": "2022-05-21T19:04:09.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "628937b822fbc8000495b81d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653159549000, + "dateString": "2022-05-21T18:59:09.000Z", + "isValid": true, + "sgv": 99, + "direction": "Flat", + "type": "sgv", + "_id": "628936a422fbc8000495b81a" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653159249000, + "dateString": "2022-05-21T18:54:09.000Z", + "isValid": true, + "sgv": 99, + "direction": "Flat", + "type": "sgv", + "_id": "6289357622fbc8000495b818" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653158949000, + "dateString": "2022-05-21T18:49:09.000Z", + "isValid": true, + "sgv": 100, + "direction": "Flat", + "type": "sgv", + "_id": "6289344a22fbc8000495b815" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653158649000, + "dateString": "2022-05-21T18:44:09.000Z", + "isValid": true, + "sgv": 101, + "direction": "Flat", + "type": "sgv", + "_id": "6289331c22fbc8000495b813" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653158349000, + "dateString": "2022-05-21T18:39:09.000Z", + "isValid": true, + "sgv": 102, + "direction": "Flat", + "type": "sgv", + "_id": "628931e9840d8d0004a20bff" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653158049000, + "dateString": "2022-05-21T18:34:09.000Z", + "isValid": true, + "sgv": 104, + "direction": "Flat", + "type": "sgv", + "_id": "628930bc840d8d0004a20bfd" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653157750000, + "dateString": "2022-05-21T18:29:10.000Z", + "isValid": true, + "sgv": 106, + "direction": "Flat", + "type": "sgv", + "_id": "62892f8f840d8d0004a20bfa" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653157449000, + "dateString": "2022-05-21T18:24:09.000Z", + "isValid": true, + "sgv": 108, + "direction": "Flat", + "type": "sgv", + "_id": "62892e62840d8d0004a20bf8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653157149000, + "dateString": "2022-05-21T18:19:09.000Z", + "isValid": true, + "sgv": 108, + "direction": "Flat", + "type": "sgv", + "_id": "62892d34840d8d0004a20bf5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653156849000, + "dateString": "2022-05-21T18:14:09.000Z", + "isValid": true, + "sgv": 110, + "direction": "Flat", + "type": "sgv", + "_id": "62892c06840d8d0004a20bf2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653156549000, + "dateString": "2022-05-21T18:09:09.000Z", + "isValid": true, + "sgv": 114, + "direction": "Flat", + "type": "sgv", + "_id": "62892af2840d8d0004a20bf0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653156250000, + "dateString": "2022-05-21T18:04:10.000Z", + "isValid": true, + "sgv": 119, + "direction": "Flat", + "type": "sgv", + "_id": "628929ac8809e60004c644e9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653155950000, + "dateString": "2022-05-21T17:59:10.000Z", + "isValid": true, + "sgv": 123, + "direction": "Flat", + "type": "sgv", + "_id": "6289287e8809e60004c644e6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653155649000, + "dateString": "2022-05-21T17:54:09.000Z", + "isValid": true, + "sgv": 124, + "direction": "Flat", + "type": "sgv", + "_id": "6289276a8809e60004c644e3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653155349000, + "dateString": "2022-05-21T17:49:09.000Z", + "isValid": true, + "sgv": 123, + "direction": "NONE", + "type": "sgv", + "_id": "6289263c8809e60004c644e1" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653155049000, + "dateString": "2022-05-21T17:44:09.000Z", + "isValid": true, + "sgv": 116, + "direction": "NONE", + "type": "sgv", + "_id": "6289250d8809e60004c644dd" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653154749000, + "dateString": "2022-05-21T17:39:09.000Z", + "isValid": true, + "sgv": 108, + "direction": "NONE", + "type": "sgv", + "_id": "628923df8809e60004c644d9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653154449000, + "dateString": "2022-05-21T17:34:09.000Z", + "isValid": true, + "sgv": 97, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "628922b18809e60004c644d6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653154149000, + "dateString": "2022-05-21T17:29:09.000Z", + "isValid": true, + "sgv": 93, + "direction": "SingleDown", + "type": "sgv", + "_id": "628921861090500004ca472b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653153849000, + "dateString": "2022-05-21T17:24:09.000Z", + "isValid": true, + "sgv": 96, + "direction": "SingleDown", + "type": "sgv", + "_id": "628920591090500004ca4727" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653153549000, + "dateString": "2022-05-21T17:19:09.000Z", + "isValid": true, + "sgv": 110, + "direction": "SingleDown", + "type": "sgv", + "_id": "62891f2b1090500004ca4724" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653153249000, + "dateString": "2022-05-21T17:14:09.000Z", + "isValid": true, + "sgv": 124, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62891dfd1090500004ca4722" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653152949000, + "dateString": "2022-05-21T17:09:09.000Z", + "isValid": true, + "sgv": 138, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62891cd01090500004ca471f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653152649000, + "dateString": "2022-05-21T17:04:09.000Z", + "isValid": true, + "sgv": 149, + "direction": "Flat", + "type": "sgv", + "_id": "62891ba31090500004ca471d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653152349000, + "dateString": "2022-05-21T16:59:09.000Z", + "isValid": true, + "sgv": 158, + "direction": "Flat", + "type": "sgv", + "_id": "62891a811090500004ca471a" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653152049000, + "dateString": "2022-05-21T16:54:09.000Z", + "isValid": true, + "sgv": 160, + "direction": "Flat", + "type": "sgv", + "_id": "628919531090500004ca4717" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653151749000, + "dateString": "2022-05-21T16:49:09.000Z", + "isValid": true, + "sgv": 159, + "direction": "Flat", + "type": "sgv", + "_id": "628918261090500004ca4714" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653151449000, + "dateString": "2022-05-21T16:44:09.000Z", + "isValid": true, + "sgv": 158, + "direction": "Flat", + "type": "sgv", + "_id": "628916f81090500004ca4710" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653151149000, + "dateString": "2022-05-21T16:39:09.000Z", + "isValid": true, + "sgv": 158, + "direction": "Flat", + "type": "sgv", + "_id": "628915ce1090500004ca470c" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653150849000, + "dateString": "2022-05-21T16:34:09.000Z", + "isValid": true, + "sgv": 161, + "direction": "Flat", + "type": "sgv", + "_id": "628914d01090500004ca4709" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653150549000, + "dateString": "2022-05-21T16:29:09.000Z", + "isValid": true, + "sgv": 165, + "direction": "Flat", + "type": "sgv", + "_id": "628913731090500004ca4706" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653150249000, + "dateString": "2022-05-21T16:24:09.000Z", + "isValid": true, + "sgv": 170, + "direction": "Flat", + "type": "sgv", + "_id": "628913111090500004ca4704" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653149949000, + "dateString": "2022-05-21T16:19:09.000Z", + "isValid": true, + "sgv": 172, + "direction": "Flat", + "type": "sgv", + "_id": "6289130f1090500004ca46ff" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653149650000, + "dateString": "2022-05-21T16:14:10.000Z", + "isValid": true, + "sgv": 173, + "direction": "Flat", + "type": "sgv", + "_id": "62890fff1090500004ca46fd" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653149349000, + "dateString": "2022-05-21T16:09:09.000Z", + "isValid": true, + "sgv": 174, + "direction": "Flat", + "type": "sgv", + "_id": "62890edacf7ee10004a2b1e2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653149049000, + "dateString": "2022-05-21T16:04:09.000Z", + "isValid": true, + "sgv": 176, + "direction": "Flat", + "type": "sgv", + "_id": "62890daccf7ee10004a2b1de" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653148749000, + "dateString": "2022-05-21T15:59:09.000Z", + "isValid": true, + "sgv": 176, + "direction": "Flat", + "type": "sgv", + "_id": "62890c64cf7ee10004a2b1da" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653148450000, + "dateString": "2022-05-21T15:54:10.000Z", + "isValid": true, + "sgv": 176, + "direction": "Flat", + "type": "sgv", + "_id": "62890b36cf7ee10004a2b1d7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653148149000, + "dateString": "2022-05-21T15:49:09.000Z", + "isValid": true, + "sgv": 174, + "direction": "Flat", + "type": "sgv", + "_id": "62890a21cf7ee10004a2b1d3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653147849000, + "dateString": "2022-05-21T15:44:09.000Z", + "isValid": true, + "sgv": 175, + "direction": "Flat", + "type": "sgv", + "_id": "628908f3cf7ee10004a2b1d1" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653147549000, + "dateString": "2022-05-21T15:39:09.000Z", + "isValid": true, + "sgv": 176, + "direction": "Flat", + "type": "sgv", + "_id": "628907c5cf7ee10004a2b1ce" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653147249000, + "dateString": "2022-05-21T15:34:09.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "_id": "6289067fc9346b0004863369" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653146949000, + "dateString": "2022-05-21T15:29:09.000Z", + "isValid": true, + "sgv": 178, + "direction": "Flat", + "type": "sgv", + "_id": "6289056ac9346b0004863366" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653146650000, + "dateString": "2022-05-21T15:24:10.000Z", + "isValid": true, + "sgv": 178, + "direction": "Flat", + "type": "sgv", + "_id": "6289043cc9346b0004863363" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653146349000, + "dateString": "2022-05-21T15:19:09.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "_id": "6289030ec9346b0004863361" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653146050000, + "dateString": "2022-05-21T15:14:10.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "_id": "628901e0c9346b000486335f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653145750000, + "dateString": "2022-05-21T15:09:10.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "_id": "628900b2c9346b000486335d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653145449000, + "dateString": "2022-05-21T15:04:09.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "_id": "6288ff9ec9346b000486335b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653145149000, + "dateString": "2022-05-21T14:59:09.000Z", + "isValid": true, + "sgv": 176, + "direction": "Flat", + "type": "sgv", + "_id": "6288fe56c9346b0004863359" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653144849000, + "dateString": "2022-05-21T14:54:09.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "_id": "6288fd270e0c880004d58de7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653144550000, + "dateString": "2022-05-21T14:49:10.000Z", + "isValid": true, + "sgv": 178, + "direction": "Flat", + "type": "sgv", + "_id": "6288fbf90e0c880004d58de5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653144249000, + "dateString": "2022-05-21T14:44:09.000Z", + "isValid": true, + "sgv": 180, + "direction": "Flat", + "type": "sgv", + "_id": "6288facb0e0c880004d58de3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653143949000, + "dateString": "2022-05-21T14:39:09.000Z", + "isValid": true, + "sgv": 184, + "direction": "Flat", + "type": "sgv", + "_id": "6288f9b60e0c880004d58de0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653143650000, + "dateString": "2022-05-21T14:34:10.000Z", + "isValid": true, + "sgv": 185, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f8880e0c880004d58dde" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653143349000, + "dateString": "2022-05-21T14:29:09.000Z", + "isValid": true, + "sgv": 182, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f75a0e0c880004d58ddb" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653143049000, + "dateString": "2022-05-21T14:24:09.000Z", + "isValid": true, + "sgv": 174, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f62c0e0c880004d58dd8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653142749000, + "dateString": "2022-05-21T14:19:09.000Z", + "isValid": true, + "sgv": 166, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f4f72634cd0004296074" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653142449000, + "dateString": "2022-05-21T14:14:09.000Z", + "isValid": true, + "sgv": 160, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f3c92634cd0004296071" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653142149000, + "dateString": "2022-05-21T14:09:09.000Z", + "isValid": true, + "sgv": 155, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f29b2634cd000429606f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653141849000, + "dateString": "2022-05-21T14:04:09.000Z", + "isValid": true, + "sgv": 147, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f16d2634cd000429606c" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653141548000, + "dateString": "2022-05-21T13:59:08.000Z", + "isValid": true, + "sgv": 139, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f03f2634cd000429606a" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653141249000, + "dateString": "2022-05-21T13:54:09.000Z", + "isValid": true, + "sgv": 131, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288ef2a2634cd0004296067" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653140949000, + "dateString": "2022-05-21T13:49:09.000Z", + "isValid": true, + "sgv": 126, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288edfc2634cd0004296065" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653140648000, + "dateString": "2022-05-21T13:44:08.000Z", + "isValid": true, + "sgv": 121, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288ecca0f1be700041e5a0b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653140349000, + "dateString": "2022-05-21T13:39:09.000Z", + "isValid": true, + "sgv": 114, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288eb9d0f1be700041e5a09" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653140049000, + "dateString": "2022-05-21T13:34:09.000Z", + "isValid": true, + "sgv": 105, + "direction": "Flat", + "type": "sgv", + "_id": "6288ea6e0f1be700041e5a06" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653139749000, + "dateString": "2022-05-21T13:29:09.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "6288e9410f1be700041e5a03" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653139450000, + "dateString": "2022-05-21T13:24:10.000Z", + "isValid": true, + "sgv": 94, + "direction": "Flat", + "type": "sgv", + "_id": "6288e82c0f1be700041e5a00" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653139150000, + "dateString": "2022-05-21T13:19:10.000Z", + "isValid": true, + "sgv": 93, + "direction": "Flat", + "type": "sgv", + "_id": "6288e7030f1be700041e59fd" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653138849000, + "dateString": "2022-05-21T13:14:09.000Z", + "isValid": true, + "sgv": 94, + "direction": "Flat", + "type": "sgv", + "_id": "6288e5d00f1be700041e59fb" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653138549000, + "dateString": "2022-05-21T13:09:09.000Z", + "isValid": true, + "sgv": 95, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288e4900f1be700041e59f8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653138249000, + "dateString": "2022-05-21T13:04:09.000Z", + "isValid": true, + "sgv": 93, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288e3610f1be700041e59f6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653137949000, + "dateString": "2022-05-21T12:59:09.000Z", + "isValid": true, + "sgv": 86, + "direction": "Flat", + "type": "sgv", + "_id": "6288e24c0f1be700041e59f3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653137649000, + "dateString": "2022-05-21T12:54:09.000Z", + "isValid": true, + "sgv": 79, + "direction": "Flat", + "type": "sgv", + "_id": "6288e1040f1be700041e59f0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653137350000, + "dateString": "2022-05-21T12:49:10.000Z", + "isValid": true, + "sgv": 72, + "direction": "Flat", + "type": "sgv", + "_id": "6288dfd60f1be700041e59ee" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653137049000, + "dateString": "2022-05-21T12:44:09.000Z", + "isValid": true, + "sgv": 69, + "direction": "Flat", + "type": "sgv", + "_id": "6288df8a0f1be700041e59ec" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653136749000, + "dateString": "2022-05-21T12:39:09.000Z", + "isValid": true, + "sgv": 68, + "direction": "Flat", + "type": "sgv", + "_id": "6288de580f1be700041e59ea" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653136449000, + "dateString": "2022-05-21T12:34:09.000Z", + "isValid": true, + "sgv": 70, + "direction": "Flat", + "type": "sgv", + "_id": "6288dd270f1be700041e59e8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653136149000, + "dateString": "2022-05-21T12:29:09.000Z", + "isValid": true, + "sgv": 73, + "direction": "Flat", + "type": "sgv", + "_id": "6288db8a0f1be700041e59e5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653135849000, + "dateString": "2022-05-21T12:24:09.000Z", + "isValid": true, + "sgv": 76, + "direction": "Flat", + "type": "sgv", + "_id": "6288d9fb0f1be700041e59e2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653135549000, + "dateString": "2022-05-21T12:19:09.000Z", + "isValid": true, + "sgv": 78, + "direction": "Flat", + "type": "sgv", + "_id": "6288d8e00f1be700041e59e0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653135249000, + "dateString": "2022-05-21T12:14:09.000Z", + "isValid": true, + "sgv": 79, + "direction": "Flat", + "type": "sgv", + "_id": "6288d7ae0f1be700041e59de" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653134949000, + "dateString": "2022-05-21T12:09:09.000Z", + "isValid": true, + "sgv": 78, + "direction": "Flat", + "type": "sgv", + "_id": "6288d67f0f1be700041e59da" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653134649000, + "dateString": "2022-05-21T12:04:09.000Z", + "isValid": true, + "sgv": 77, + "direction": "Flat", + "type": "sgv", + "_id": "6288d5500f1be700041e59d7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653134349000, + "dateString": "2022-05-21T11:59:09.000Z", + "isValid": true, + "sgv": 76, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288d4220f1be700041e59d5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653134049000, + "dateString": "2022-05-21T11:54:09.000Z", + "isValid": true, + "sgv": 79, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288d3060f1be700041e59d2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653133749000, + "dateString": "2022-05-21T11:49:09.000Z", + "isValid": true, + "sgv": 87, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288d1d80f1be700041e59cf" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653133449000, + "dateString": "2022-05-21T11:44:09.000Z", + "isValid": true, + "sgv": 101, + "direction": "Flat", + "type": "sgv", + "_id": "6288d0a80f1be700041e59cb" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653133149000, + "dateString": "2022-05-21T11:39:09.000Z", + "isValid": true, + "sgv": 114, + "direction": "Flat", + "type": "sgv", + "_id": "6288cf770f1be700041e59c8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653132849000, + "dateString": "2022-05-21T11:34:09.000Z", + "isValid": true, + "sgv": 121, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288ce548e9ed800049b39f7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653132549000, + "dateString": "2022-05-21T11:29:09.000Z", + "isValid": true, + "sgv": 118, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288cd278e9ed800049b39f5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653132249000, + "dateString": "2022-05-21T11:24:09.000Z", + "isValid": true, + "sgv": 109, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288cbf98e9ed800049b39f2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653131948000, + "dateString": "2022-05-21T11:19:08.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "6288cacb8e9ed800049b39ec" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653131649000, + "dateString": "2022-05-21T11:14:09.000Z", + "isValid": true, + "sgv": 89, + "direction": "Flat", + "type": "sgv", + "_id": "6288c99e8e9ed800049b39e8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653131349000, + "dateString": "2022-05-21T11:09:09.000Z", + "isValid": true, + "sgv": 82, + "direction": "Flat", + "type": "sgv", + "_id": "6288c86f8e9ed800049b39e5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653131049000, + "dateString": "2022-05-21T11:04:09.000Z", + "isValid": true, + "sgv": 81, + "direction": "Flat", + "type": "sgv", + "_id": "6288c7418e9ed800049b39e3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653130748000, + "dateString": "2022-05-21T10:59:08.000Z", + "isValid": true, + "sgv": 84, + "direction": "Flat", + "type": "sgv", + "_id": "6288c61a1991280004dce468" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653130448000, + "dateString": "2022-05-21T10:54:08.000Z", + "isValid": true, + "sgv": 88, + "direction": "Flat", + "type": "sgv", + "_id": "6288c4ec1991280004dce464" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653130149000, + "dateString": "2022-05-21T10:49:09.000Z", + "isValid": true, + "sgv": 91, + "direction": "Flat", + "type": "sgv", + "_id": "6288c3be1991280004dce461" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653129848000, + "dateString": "2022-05-21T10:44:08.000Z", + "isValid": true, + "sgv": 93, + "direction": "Flat", + "type": "sgv", + "_id": "6288c2911991280004dce45e" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653129548000, + "dateString": "2022-05-21T10:39:08.000Z", + "isValid": true, + "sgv": 94, + "direction": "Flat", + "type": "sgv", + "_id": "6288c1631991280004dce45b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653129249000, + "dateString": "2022-05-21T10:34:09.000Z", + "isValid": true, + "sgv": 96, + "direction": "Flat", + "type": "sgv", + "_id": "6288c0341991280004dce459" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653128948000, + "dateString": "2022-05-21T10:29:08.000Z", + "isValid": true, + "sgv": 99, + "direction": "Flat", + "type": "sgv", + "_id": "6288bf061991280004dce457" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653128649000, + "dateString": "2022-05-21T10:24:09.000Z", + "isValid": true, + "sgv": 101, + "direction": "Flat", + "type": "sgv", + "_id": "6288bde0abbef90004616cf8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653128349000, + "dateString": "2022-05-21T10:19:09.000Z", + "isValid": true, + "sgv": 104, + "direction": "Flat", + "type": "sgv", + "_id": "6288bcb2abbef90004616cf6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653128049000, + "dateString": "2022-05-21T10:14:09.000Z", + "isValid": true, + "sgv": 110, + "direction": "Flat", + "type": "sgv", + "_id": "6288bb84abbef90004616cf4" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653127748000, + "dateString": "2022-05-21T10:09:08.000Z", + "isValid": true, + "sgv": 115, + "direction": "Flat", + "type": "sgv", + "_id": "6288ba56abbef90004616cf2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653127449000, + "dateString": "2022-05-21T10:04:09.000Z", + "isValid": true, + "sgv": 119, + "direction": "Flat", + "type": "sgv", + "_id": "6288b941abbef90004616cf0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653127149000, + "dateString": "2022-05-21T09:59:09.000Z", + "isValid": true, + "sgv": 119, + "direction": "Flat", + "type": "sgv", + "_id": "6288b813abbef90004616ceb" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653126849000, + "dateString": "2022-05-21T09:54:09.000Z", + "isValid": true, + "sgv": 118, + "direction": "Flat", + "type": "sgv", + "_id": "6288b6e9c9c02c00041f7f06" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653126549000, + "dateString": "2022-05-21T09:49:09.000Z", + "isValid": true, + "sgv": 117, + "direction": "Flat", + "type": "sgv", + "_id": "6288b5bbc9c02c00041f7f04" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653126249000, + "dateString": "2022-05-21T09:44:09.000Z", + "isValid": true, + "sgv": 118, + "direction": "Flat", + "type": "sgv", + "_id": "6288b48dc9c02c00041f7f02" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653125948000, + "dateString": "2022-05-21T09:39:08.000Z", + "isValid": true, + "sgv": 118, + "direction": "Flat", + "type": "sgv", + "_id": "6288b35fc9c02c00041f7f00" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653125649000, + "dateString": "2022-05-21T09:34:09.000Z", + "isValid": true, + "sgv": 118, + "direction": "Flat", + "type": "sgv", + "_id": "6288b231c9c02c00041f7efe" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653125349000, + "dateString": "2022-05-21T09:29:09.000Z", + "isValid": true, + "sgv": 120, + "direction": "Flat", + "type": "sgv", + "_id": "6288b103c9c02c00041f7efc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653125048000, + "dateString": "2022-05-21T09:24:08.000Z", + "isValid": true, + "sgv": 122, + "direction": "Flat", + "type": "sgv", + "_id": "6288afd5c9c02c00041f7ef8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653124749000, + "dateString": "2022-05-21T09:19:09.000Z", + "isValid": true, + "sgv": 125, + "direction": "Flat", + "type": "sgv", + "_id": "6288aea799fc930004d6bdfb" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653124448000, + "dateString": "2022-05-21T09:14:08.000Z", + "isValid": true, + "sgv": 124, + "direction": "Flat", + "type": "sgv", + "_id": "6288ad7999fc930004d6bdfa" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653124149000, + "dateString": "2022-05-21T09:09:09.000Z", + "isValid": true, + "sgv": 119, + "direction": "Flat", + "type": "sgv", + "_id": "6288ac4b99fc930004d6bdf8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653123849000, + "dateString": "2022-05-21T09:04:09.000Z", + "isValid": true, + "sgv": 113, + "direction": "Flat", + "type": "sgv", + "_id": "6288ab1d99fc930004d6bdf6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653123549000, + "dateString": "2022-05-21T08:59:09.000Z", + "isValid": true, + "sgv": 109, + "direction": "Flat", + "type": "sgv", + "_id": "6288a9f099fc930004d6bdf4" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653123248000, + "dateString": "2022-05-21T08:54:08.000Z", + "isValid": true, + "sgv": 107, + "direction": "Flat", + "type": "sgv", + "_id": "6288a8db99fc930004d6bdf1" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653122949000, + "dateString": "2022-05-21T08:49:09.000Z", + "isValid": true, + "sgv": 108, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288a7ad99fc930004d6bdef" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653122649000, + "dateString": "2022-05-21T08:44:09.000Z", + "isValid": true, + "sgv": 111, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288a73099fc930004d6bded" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653122349000, + "dateString": "2022-05-21T08:39:09.000Z", + "isValid": true, + "sgv": 118, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288a55199fc930004d6bdeb" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653122049000, + "dateString": "2022-05-21T08:34:09.000Z", + "isValid": true, + "sgv": 128, + "direction": "Flat", + "type": "sgv", + "_id": "6288a42099fc930004d6bde8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653121749000, + "dateString": "2022-05-21T08:29:09.000Z", + "isValid": true, + "sgv": 138, + "direction": "Flat", + "type": "sgv", + "_id": "6288a2fca4cc860004a251d2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653121449000, + "dateString": "2022-05-21T08:24:09.000Z", + "isValid": true, + "sgv": 145, + "direction": "Flat", + "type": "sgv", + "_id": "6288a1cda4cc860004a251d1" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653121149000, + "dateString": "2022-05-21T08:19:09.000Z", + "isValid": true, + "sgv": 147, + "direction": "Flat", + "type": "sgv", + "_id": "6288a09fa4cc860004a251ce" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653120849000, + "dateString": "2022-05-21T08:14:09.000Z", + "isValid": true, + "sgv": 148, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62889f6fa4cc860004a251cc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653120548000, + "dateString": "2022-05-21T08:09:08.000Z", + "isValid": true, + "sgv": 146, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62889e41a4cc860004a251cb" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653120249000, + "dateString": "2022-05-21T08:04:09.000Z", + "isValid": true, + "sgv": 141, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62889d13a4cc860004a251c9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653119949000, + "dateString": "2022-05-21T07:59:09.000Z", + "isValid": true, + "sgv": 132, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62889be4a4cc860004a251c7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653119649000, + "dateString": "2022-05-21T07:54:09.000Z", + "isValid": true, + "sgv": 123, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62889ac27ff1e700040f17dc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653119349000, + "dateString": "2022-05-21T07:49:09.000Z", + "isValid": true, + "sgv": 114, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "628899957ff1e700040f17d7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653119049000, + "dateString": "2022-05-21T07:44:09.000Z", + "isValid": true, + "sgv": 105, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "628898627ff1e700040f17d5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653118748000, + "dateString": "2022-05-21T07:39:08.000Z", + "isValid": true, + "sgv": 97, + "direction": "Flat", + "type": "sgv", + "_id": "628897357ff1e700040f17d3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653118449000, + "dateString": "2022-05-21T07:34:09.000Z", + "isValid": true, + "sgv": 92, + "direction": "Flat", + "type": "sgv", + "_id": "6288961d7ff1e700040f17ce" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653118149000, + "dateString": "2022-05-21T07:29:09.000Z", + "isValid": true, + "sgv": 86, + "direction": "Flat", + "type": "sgv", + "_id": "628894d37ff1e700040f17cd" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653117848000, + "dateString": "2022-05-21T07:24:08.000Z", + "isValid": true, + "sgv": 82, + "direction": "Flat", + "type": "sgv", + "_id": "628893bd7ff1e700040f17c9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653117549000, + "dateString": "2022-05-21T07:19:09.000Z", + "isValid": true, + "sgv": 80, + "direction": "Flat", + "type": "sgv", + "_id": "628892907ff1e700040f17c7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653117249000, + "dateString": "2022-05-21T07:14:09.000Z", + "isValid": true, + "sgv": 79, + "direction": "Flat", + "type": "sgv", + "_id": "628891627ff1e700040f17c6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653116949000, + "dateString": "2022-05-21T07:09:09.000Z", + "isValid": true, + "sgv": 76, + "direction": "Flat", + "type": "sgv", + "_id": "62889024149196000412bf57" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653116649000, + "dateString": "2022-05-21T07:04:09.000Z", + "isValid": true, + "sgv": 74, + "direction": "Flat", + "type": "sgv", + "_id": "62888f0f149196000412bf54" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653116349000, + "dateString": "2022-05-21T06:59:09.000Z", + "isValid": true, + "sgv": 70, + "direction": "Flat", + "type": "sgv", + "_id": "62888de2149196000412bf51" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653116049000, + "dateString": "2022-05-21T06:54:09.000Z", + "isValid": true, + "sgv": 69, + "direction": "Flat", + "type": "sgv", + "_id": "62888ccc149196000412bf4f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653115749000, + "dateString": "2022-05-21T06:49:09.000Z", + "isValid": true, + "sgv": 70, + "direction": "Flat", + "type": "sgv", + "_id": "62888b85149196000412bf4d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653115449000, + "dateString": "2022-05-21T06:44:09.000Z", + "isValid": true, + "sgv": 74, + "direction": "Flat", + "type": "sgv", + "_id": "62888a57149196000412bf4b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653115149000, + "dateString": "2022-05-21T06:39:09.000Z", + "isValid": true, + "sgv": 76, + "direction": "Flat", + "type": "sgv", + "_id": "6288892a149196000412bf49" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653114849000, + "dateString": "2022-05-21T06:34:09.000Z", + "isValid": true, + "sgv": 78, + "direction": "Flat", + "type": "sgv", + "_id": "628888018ff3530004dc6070" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653114549000, + "dateString": "2022-05-21T06:29:09.000Z", + "isValid": true, + "sgv": 80, + "direction": "Flat", + "type": "sgv", + "_id": "628886d28ff3530004dc606b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653114249000, + "dateString": "2022-05-21T06:24:09.000Z", + "isValid": true, + "sgv": 85, + "direction": "Flat", + "type": "sgv", + "_id": "628885a48ff3530004dc6069" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653113949000, + "dateString": "2022-05-21T06:19:09.000Z", + "isValid": true, + "sgv": 89, + "direction": "Flat", + "type": "sgv", + "_id": "628884778ff3530004dc6067" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653113649000, + "dateString": "2022-05-21T06:14:09.000Z", + "isValid": true, + "sgv": 91, + "direction": "Flat", + "type": "sgv", + "_id": "6288834a8ff3530004dc6065" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653113349000, + "dateString": "2022-05-21T06:09:09.000Z", + "isValid": true, + "sgv": 94, + "direction": "Flat", + "type": "sgv", + "_id": "6288821b8ff3530004dc6062" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653113049000, + "dateString": "2022-05-21T06:04:09.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "628880ee8ff3530004dc6060" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653112749000, + "dateString": "2022-05-21T05:59:09.000Z", + "isValid": true, + "sgv": 101, + "direction": "Flat", + "type": "sgv", + "_id": "62887fcee964810004aa5666" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653112449000, + "dateString": "2022-05-21T05:54:09.000Z", + "isValid": true, + "sgv": 102, + "direction": "Flat", + "type": "sgv", + "_id": "62887ea1e964810004aa5664" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653112148000, + "dateString": "2022-05-21T05:49:08.000Z", + "isValid": true, + "sgv": 103, + "direction": "Flat", + "type": "sgv", + "_id": "62887d72e964810004aa5661" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653111849000, + "dateString": "2022-05-21T05:44:09.000Z", + "isValid": true, + "sgv": 102, + "direction": "Flat", + "type": "sgv", + "_id": "62887c44e964810004aa565d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653111549000, + "dateString": "2022-05-21T05:39:09.000Z", + "isValid": true, + "sgv": 100, + "direction": "Flat", + "type": "sgv", + "_id": "62887b17e964810004aa565a" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653111249000, + "dateString": "2022-05-21T05:34:09.000Z", + "isValid": true, + "sgv": 97, + "direction": "Flat", + "type": "sgv", + "_id": "628879e9e964810004aa5657" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653110949000, + "dateString": "2022-05-21T05:29:09.000Z", + "isValid": true, + "sgv": 97, + "direction": "Flat", + "type": "sgv", + "_id": "628878bbe964810004aa5655" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653110649000, + "dateString": "2022-05-21T05:24:09.000Z", + "isValid": true, + "sgv": 98, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "628877a5363e6c0004f710e0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653110348000, + "dateString": "2022-05-21T05:19:08.000Z", + "isValid": true, + "sgv": 102, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62887677363e6c0004f710de" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653110049000, + "dateString": "2022-05-21T05:14:09.000Z", + "isValid": true, + "sgv": 109, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62887549363e6c0004f710dc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653109748000, + "dateString": "2022-05-21T05:09:08.000Z", + "isValid": true, + "sgv": 117, + "direction": "Flat", + "type": "sgv", + "_id": "6288741c363e6c0004f710d9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653109448000, + "dateString": "2022-05-21T05:04:08.000Z", + "isValid": true, + "sgv": 125, + "direction": "Flat", + "type": "sgv", + "_id": "628872ef363e6c0004f710d6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653109148000, + "dateString": "2022-05-21T04:59:08.000Z", + "isValid": true, + "sgv": 129, + "direction": "Flat", + "type": "sgv", + "_id": "628871c1363e6c0004f710d3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653108848000, + "dateString": "2022-05-21T04:54:08.000Z", + "isValid": true, + "sgv": 130, + "direction": "Flat", + "type": "sgv", + "_id": "62887093363e6c0004f710cf" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653108548000, + "dateString": "2022-05-21T04:49:08.000Z", + "isValid": true, + "sgv": 128, + "direction": "Flat", + "type": "sgv", + "_id": "62886f5719e2e60004989bbc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653108249000, + "dateString": "2022-05-21T04:44:09.000Z", + "isValid": true, + "sgv": 123, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62886e2919e2e60004989bba" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653107948000, + "dateString": "2022-05-21T04:39:08.000Z", + "isValid": true, + "sgv": 124, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62886cfc19e2e60004989bb8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653107648000, + "dateString": "2022-05-21T04:34:08.000Z", + "isValid": true, + "sgv": 132, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62886be719e2e60004989bb5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653107348000, + "dateString": "2022-05-21T04:29:08.000Z", + "isValid": true, + "sgv": 144, + "direction": "Flat", + "type": "sgv", + "_id": "62886ab919e2e60004989bb3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653107048000, + "dateString": "2022-05-21T04:24:08.000Z", + "isValid": true, + "sgv": 153, + "direction": "Flat", + "type": "sgv", + "_id": "6288698b19e2e60004989bb0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653106749000, + "dateString": "2022-05-21T04:19:09.000Z", + "isValid": true, + "sgv": 157, + "direction": "Flat", + "type": "sgv", + "_id": "6288685d19e2e60004989bac" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653106449000, + "dateString": "2022-05-21T04:14:09.000Z", + "isValid": true, + "sgv": 155, + "direction": "Flat", + "type": "sgv", + "_id": "6288672f42c1220004f9573a" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653106149000, + "dateString": "2022-05-21T04:09:09.000Z", + "isValid": true, + "sgv": 151, + "direction": "Flat", + "type": "sgv", + "_id": "6288660142c1220004f95736" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653105848000, + "dateString": "2022-05-21T04:04:08.000Z", + "isValid": true, + "sgv": 146, + "direction": "Flat", + "type": "sgv", + "_id": "628864d342c1220004f95733" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653105549000, + "dateString": "2022-05-21T03:59:09.000Z", + "isValid": true, + "sgv": 146, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "628863a542c1220004f95730" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653105248000, + "dateString": "2022-05-21T03:54:08.000Z", + "isValid": true, + "sgv": 149, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288629042c1220004f9572e" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653104949000, + "dateString": "2022-05-21T03:49:09.000Z", + "isValid": true, + "sgv": 155, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288614942c1220004f9572c" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653104648000, + "dateString": "2022-05-21T03:44:08.000Z", + "isValid": true, + "sgv": 162, + "direction": "Flat", + "type": "sgv", + "_id": "6288601b42c1220004f95729" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653104349000, + "dateString": "2022-05-21T03:39:09.000Z", + "isValid": true, + "sgv": 167, + "direction": "Flat", + "type": "sgv", + "_id": "62885ef1293f3e00042c31e2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653104049000, + "dateString": "2022-05-21T03:34:09.000Z", + "isValid": true, + "sgv": 170, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62885dc3293f3e00042c31de" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653103748000, + "dateString": "2022-05-21T03:29:08.000Z", + "isValid": true, + "sgv": 171, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62885c95293f3e00042c31db" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653103448000, + "dateString": "2022-05-21T03:24:08.000Z", + "isValid": true, + "sgv": 174, + "direction": "SingleDown", + "type": "sgv", + "_id": "62885b81293f3e00042c31d9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653103149000, + "dateString": "2022-05-21T03:19:09.000Z", + "isValid": true, + "sgv": 182, + "direction": "SingleDown", + "type": "sgv", + "_id": "62885a52293f3e00042c31d7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653102848000, + "dateString": "2022-05-21T03:14:08.000Z", + "isValid": true, + "sgv": 193, + "direction": "SingleDown", + "type": "sgv", + "_id": "62885924293f3e00042c31d5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653102548000, + "dateString": "2022-05-21T03:09:08.000Z", + "isValid": true, + "sgv": 204, + "direction": "SingleDown", + "type": "sgv", + "_id": "628857f7293f3e00042c31d3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653102249000, + "dateString": "2022-05-21T03:04:09.000Z", + "isValid": true, + "sgv": 216, + "direction": "SingleDown", + "type": "sgv", + "_id": "628856da5151b5000462a1ea" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653101948000, + "dateString": "2022-05-21T02:59:08.000Z", + "isValid": true, + "sgv": 228, + "direction": "SingleDown", + "type": "sgv", + "_id": "628855935151b5000462a1e8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653101648000, + "dateString": "2022-05-21T02:54:08.000Z", + "isValid": true, + "sgv": 241, + "direction": "SingleDown", + "type": "sgv", + "_id": "6288547f5151b5000462a1e6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653101348000, + "dateString": "2022-05-21T02:49:08.000Z", + "isValid": true, + "sgv": 253, + "direction": "SingleDown", + "type": "sgv", + "_id": "628853395151b5000462a1e4" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653101048000, + "dateString": "2022-05-21T02:44:08.000Z", + "isValid": true, + "sgv": 267, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288520b5151b5000462a1e2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653100748000, + "dateString": "2022-05-21T02:39:08.000Z", + "isValid": true, + "sgv": 283, + "direction": "Flat", + "type": "sgv", + "_id": "628850de5151b5000462a1df" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653100449000, + "dateString": "2022-05-21T02:34:09.000Z", + "isValid": true, + "sgv": 297, + "direction": "Flat", + "type": "sgv", + "_id": "62884fb05151b5000462a1dc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653100148000, + "dateString": "2022-05-21T02:29:08.000Z", + "isValid": true, + "sgv": 307, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62884e9493668c0004a30517" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653099848000, + "dateString": "2022-05-21T02:24:08.000Z", + "isValid": true, + "sgv": 308, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62884d6793668c0004a30514" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653099548000, + "dateString": "2022-05-21T02:19:08.000Z", + "isValid": true, + "sgv": 296, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62884c3993668c0004a30510" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653099249000, + "dateString": "2022-05-21T02:14:09.000Z", + "isValid": true, + "sgv": 282, + "direction": "Flat", + "type": "sgv", + "_id": "62884b0c93668c0004a3050d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653098948000, + "dateString": "2022-05-21T02:09:08.000Z", + "isValid": true, + "sgv": 271, + "direction": "Flat", + "type": "sgv", + "_id": "628849de93668c0004a30508" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653098648000, + "dateString": "2022-05-21T02:04:08.000Z", + "isValid": true, + "sgv": 271, + "direction": "Flat", + "type": "sgv", + "_id": "628848b093668c0004a30504" + } +] diff --git a/app/src/test/res/autotune/test2/aaps-treatments.2022-05-21.json b/app/src/test/res/autotune/test2/aaps-treatments.2022-05-21.json new file mode 100644 index 0000000000..b271cc80e4 --- /dev/null +++ b/app/src/test/res/autotune/test2/aaps-treatments.2022-05-21.json @@ -0,0 +1,3146 @@ +[ + { + "created_at": "2022-05-22T02:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 635539, + "type": "NORMAL", + "rate": 0.0742, + "percent": -90, + "pumpId": 454016, + "endId": 454021, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289982461a8290004740387" + }, + { + "created_at": "2022-05-22T01:55:40.718Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 259282, + "type": "NORMAL", + "rate": 0.0824, + "percent": -90, + "pumpId": 454016, + "endId": 454021, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289982461a8290004740387" + }, + { + "created_at": "2022-05-22T01:50:36.118Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 303106, + "type": "NORMAL", + "rate": 0.1648, + "percent": -80, + "pumpId": 454013, + "endId": 454015, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628996f661a8290004740384" + }, + { + "created_at": "2022-05-22T01:45:35.222Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299405, + "type": "NORMAL", + "rate": 0.49439999999999995, + "percent": -40, + "pumpId": 454010, + "endId": 454012, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628995c761a8290004740381" + }, + { + "created_at": "2022-05-22T01:40:51.929Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 281796, + "type": "NORMAL", + "rate": 0.6592, + "percent": -20, + "pumpId": 454007, + "endId": 454009, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628994ab50e51d0004429e6f" + }, + { + "created_at": "2022-05-22T01:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 40, + "durationInMilliseconds": 2449437, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 454003, + "endId": 454006, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628988efda46aa0004d1e0f7" + }, + { + "created_at": "2022-05-22T00:50:32.326Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 567674, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 454003, + "endId": 454006, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628988efda46aa0004d1e0f7" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.1, + "created_at": "2022-05-22T00:45:47.966Z", + "date": 1653180347966, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21574, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628987c0da46aa0004d1e0f3" + }, + { + "created_at": "2022-05-22T00:45:45.232Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 285608, + "type": "NORMAL", + "rate": 1.209, + "percent": 50, + "pumpId": 453998, + "endId": 454002, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628987c0da46aa0004d1e0f4" + }, + { + "created_at": "2022-05-22T00:35:30.702Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 613035, + "type": "NORMAL", + "rate": 1.0478, + "percent": 30, + "pumpId": 453995, + "endId": 453997, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62898563da46aa0004d1e0ec" + }, + { + "created_at": "2022-05-22T00:30:42.142Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 287064, + "type": "NORMAL", + "rate": 0.7254, + "percent": -10, + "pumpId": 453992, + "endId": 453994, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628984439d6f1800047cd0df" + }, + { + "created_at": "2022-05-22T00:20:44.045Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 595609, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453989, + "endId": 453991, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628981e59d6f1800047cd0da" + }, + { + "created_at": "2022-05-22T00:10:28.057Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 614498, + "type": "NORMAL", + "rate": 0.403, + "percent": -50, + "pumpId": 453986, + "endId": 453988, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62897f879d6f1800047cd0d5" + }, + { + "created_at": "2022-05-22T00:06:13.096Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 252465, + "type": "NORMAL", + "rate": 0.403, + "percent": -50, + "pumpId": 453983, + "endId": 453985, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62897e8b9d6f1800047cd0d2" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.1, + "created_at": "2022-05-22T00:00:34.526Z", + "date": 1653177634526, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21573, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62897d299d6f1800047cd0cd" + }, + { + "created_at": "2022-05-22T00:00:31.592Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 340013, + "type": "NORMAL", + "rate": 0.5642, + "percent": -30, + "pumpId": 453978, + "endId": 453982, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62897d299d6f1800047cd0cf" + }, + { + "created_at": "2022-05-22T00:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 30096, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453974, + "endId": 453977, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62897c139d6f1800047cd0ca" + }, + { + "created_at": "2022-05-21T23:55:56.658Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 243342, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453974, + "endId": 453977, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62897c139d6f1800047cd0ca" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.54, + "created_at": "2022-05-21T23:50:30.757Z", + "date": 1653177030757, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21572, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62897ad171a363000480abcb" + }, + { + "created_at": "2022-05-21T23:46:13.228Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 573000, + "type": "FAKE_EXTENDED", + "rate": 2.561162303664922, + "absolute": 2.561162303664922, + "pumpId": 21571, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628979d571a363000480abc9" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.22, + "created_at": "2022-05-21T23:40:59.180Z", + "date": 1653176459180, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21570, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289788d71a363000480abc4" + }, + { + "created_at": "2022-05-21T23:40:57.936Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 304306, + "type": "NORMAL", + "rate": 1.6842000000000001, + "percent": 110, + "pumpId": 453959, + "endId": 453963, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289788e71a363000480abc6" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-21T23:20:51.857Z", + "date": 1653175251857, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21569, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628973eb71a363000480abba" + }, + { + "created_at": "2022-05-21T23:16:23.121Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 24, + "durationInMilliseconds": 1472326, + "type": "NORMAL", + "rate": 1.1228, + "percent": 40, + "pumpId": 453954, + "endId": 453958, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628972de37d09a00043f2b24" + }, + { + "created_at": "2022-05-21T23:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 16, + "durationInMilliseconds": 983121, + "type": "NORMAL", + "rate": 0.802, + "percent": 0, + "_id": "neutral_1653171415806" + }, + { + "created_at": "2022-05-21T22:16:55.806Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 43, + "durationInMilliseconds": 2584194, + "type": "NORMAL", + "rate": 0.795, + "percent": 0, + "_id": "neutral_1653171415806" + }, + { + "created_at": "2022-05-21T22:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 16, + "durationInMilliseconds": 1015806, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453943, + "endId": 453951, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628957129bf1e6000482ff9a" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.28, + "created_at": "2022-05-21T21:24:43.261Z", + "date": 1653168283261, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21568, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628958a49bf1e6000482ff9c" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.2, + "created_at": "2022-05-21T21:17:49.628Z", + "date": 1653167869628, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21567, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628957109bf1e6000482ff99" + }, + { + "created_at": "2022-05-21T21:17:43.507Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 42, + "durationInMilliseconds": 2536493, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453943, + "endId": 453951, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628957129bf1e6000482ff9a" + }, + { + "created_at": "2022-05-21T21:10:55.350Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 6, + "durationInMilliseconds": 406671, + "type": "NORMAL", + "rate": 1.0049000000000001, + "percent": 30, + "pumpId": 453940, + "endId": 453942, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628955629bf1e6000482ff94" + }, + { + "created_at": "2022-05-21T21:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 653862, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453936, + "endId": 453939, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62894e5580fc7e00041b22a2" + }, + { + "created_at": "2022-05-21T20:40:34.976Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 19, + "durationInMilliseconds": 1165024, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453936, + "endId": 453939, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62894e5580fc7e00041b22a2" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.14, + "created_at": "2022-05-21T20:30:40.892Z", + "date": 1653165040892, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21566, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62894bf780fc7e00041b229d" + }, + { + "created_at": "2022-05-21T20:25:40.930Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 891567, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453931, + "endId": 453935, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62894aca4493460004e63a3a" + }, + { + "eventType": "Meal Bolus", + "insulin": 9.4, + "created_at": "2022-05-21T20:19:54.209Z", + "date": 1653164394209, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 21565, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628949824493460004e63a35" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.14, + "created_at": "2022-05-21T20:11:04.953Z", + "date": 1653163864953, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21564, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628947704493460004e63a30" + }, + { + "created_at": "2022-05-21T20:11:03.814Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 874625, + "type": "NORMAL", + "rate": 1.2563, + "percent": 70, + "pumpId": 453924, + "endId": 453930, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628947574493460004e63a2f" + }, + { + "created_at": "2022-05-21T20:00:37.912Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 623413, + "type": "NORMAL", + "rate": 0.9606999999999999, + "percent": 30, + "pumpId": 453921, + "endId": 453923, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628944fa4493460004e63a29" + }, + { + "created_at": "2022-05-21T20:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 35425, + "type": "NORMAL", + "rate": 0.2956, + "percent": -60, + "pumpId": 453917, + "endId": 453920, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62894164598f780004bb3b2f" + }, + { + "created_at": "2022-05-21T19:45:25.759Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 874241, + "type": "NORMAL", + "rate": 0.2888, + "percent": -60, + "pumpId": 453917, + "endId": 453920, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62894164598f780004bb3b2f" + }, + { + "created_at": "2022-05-21T19:25:47.539Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 19, + "durationInMilliseconds": 1175731, + "type": "NORMAL", + "rate": 0.43320000000000003, + "percent": -40, + "pumpId": 453914, + "endId": 453916, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62893cc8598f780004bb3b25" + }, + { + "created_at": "2022-05-21T19:20:54.174Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 293365, + "type": "NORMAL", + "rate": 0.722, + "percent": 0, + "_id": "neutral_1653160854174" + }, + { + "created_at": "2022-05-21T19:10:51.515Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 602659, + "type": "NORMAL", + "rate": 0.7942, + "percent": 10, + "pumpId": 453908, + "endId": 453910, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289394a22fbc8000495b821" + }, + { + "created_at": "2022-05-21T19:01:01.322Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 588703, + "type": "NORMAL", + "rate": 0.2888, + "percent": -60, + "pumpId": 453905, + "endId": 453907, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628936ef22fbc8000495b81c" + }, + { + "created_at": "2022-05-21T19:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 59826, + "type": "NORMAL", + "rate": 0.7942, + "percent": 10, + "pumpId": 453900, + "endId": 453904, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289349522fbc8000495b816" + }, + { + "created_at": "2022-05-21T18:50:58.216Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 541784, + "type": "NORMAL", + "rate": 0.77, + "percent": 10, + "pumpId": 453900, + "endId": 453904, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289349522fbc8000495b816" + }, + { + "created_at": "2022-05-21T18:46:12.499Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 285717, + "type": "NORMAL", + "rate": 0.7, + "percent": 0, + "_id": "neutral_1653158772499" + }, + { + "created_at": "2022-05-21T18:30:30.651Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 15, + "durationInMilliseconds": 941848, + "type": "NORMAL", + "rate": 0.91, + "percent": 30, + "pumpId": 453894, + "endId": 453896, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62892fda840d8d0004a20bfc" + }, + { + "created_at": "2022-05-21T18:20:44.275Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 584884, + "type": "NORMAL", + "rate": 0.28, + "percent": -60, + "pumpId": 453891, + "endId": 453893, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62892d80840d8d0004a20bf7" + }, + { + "created_at": "2022-05-21T18:15:30.389Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 312398, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453888, + "endId": 453890, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62892c52840d8d0004a20bf4" + }, + { + "created_at": "2022-05-21T18:00:33.832Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 895066, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453885, + "endId": 453887, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628928ca8809e60004c644e8" + }, + { + "created_at": "2022-05-21T18:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 32345, + "type": "NORMAL", + "rate": 0.35, + "percent": -50, + "pumpId": 453881, + "endId": 453884, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628927b58809e60004c644e5" + }, + { + "created_at": "2022-05-21T17:55:44.739Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 255261, + "type": "NORMAL", + "rate": 0.3295, + "percent": -50, + "pumpId": 453881, + "endId": 453884, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628927b58809e60004c644e5" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.24, + "created_at": "2022-05-21T17:45:48.032Z", + "date": 1653155148032, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21563, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628925588809e60004c644de" + }, + { + "created_at": "2022-05-21T17:45:45.750Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 597498, + "type": "NORMAL", + "rate": 1.5816, + "percent": 140, + "pumpId": 453876, + "endId": 453880, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628925588809e60004c644e0" + }, + { + "created_at": "2022-05-21T17:40:44.874Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299386, + "type": "NORMAL", + "rate": 0.8567, + "percent": 30, + "pumpId": 453873, + "endId": 453875, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289242b8809e60004c644db" + }, + { + "created_at": "2022-05-21T17:35:46.611Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 295766, + "type": "NORMAL", + "rate": 0.3295, + "percent": -50, + "pumpId": 453870, + "endId": 453872, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628922fe8809e60004c644d8" + }, + { + "created_at": "2022-05-21T17:25:37.912Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 607206, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453867, + "endId": 453869, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628920a41090500004ca4729" + }, + { + "created_at": "2022-05-21T17:20:42.063Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 293355, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453864, + "endId": 453866, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62891f771090500004ca4726" + }, + { + "created_at": "2022-05-21T17:10:30.971Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 608601, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453861, + "endId": 453863, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62891d1b1090500004ca4721" + }, + { + "created_at": "2022-05-21T17:00:45.815Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 582673, + "type": "NORMAL", + "rate": 0.0659, + "percent": -90, + "pumpId": 453858, + "endId": 453860, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62891ac01090500004ca471c" + }, + { + "created_at": "2022-05-21T17:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 43325, + "type": "NORMAL", + "rate": 1.4498000000000002, + "percent": 120, + "pumpId": 453852, + "endId": 453857, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628918711090500004ca4716" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.2, + "created_at": "2022-05-21T16:55:53.346Z", + "date": 1653152153346, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21562, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289199e1090500004ca4718" + }, + { + "created_at": "2022-05-21T16:50:50.998Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 549002, + "type": "NORMAL", + "rate": 1.4322, + "percent": 120, + "pumpId": 453852, + "endId": 453857, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628918711090500004ca4716" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.1, + "created_at": "2022-05-21T16:45:50.105Z", + "date": 1653151550105, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21561, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628917431090500004ca4711" + }, + { + "created_at": "2022-05-21T16:45:47.200Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 300314, + "type": "NORMAL", + "rate": 1.0415999999999999, + "percent": 60, + "pumpId": 453847, + "endId": 453851, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628917431090500004ca4713" + }, + { + "created_at": "2022-05-21T16:40:54.765Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 290944, + "type": "NORMAL", + "rate": 0.8463, + "percent": 30, + "pumpId": 453844, + "endId": 453846, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289161c1090500004ca470e" + }, + { + "created_at": "2022-05-21T16:35:35.684Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 317593, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453841, + "endId": 453843, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628914eb1090500004ca470b" + }, + { + "created_at": "2022-05-21T16:30:39.072Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 295126, + "type": "NORMAL", + "rate": 0.06509999999999999, + "percent": -90, + "pumpId": 453838, + "endId": 453840, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628913c01090500004ca4708" + }, + { + "created_at": "2022-05-21T16:25:35.342Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 301235, + "type": "NORMAL", + "rate": 0.06509999999999999, + "percent": -90, + "pumpId": 453835, + "endId": 453837, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628913141090500004ca4705" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.1, + "created_at": "2022-05-21T16:20:30.382Z", + "date": 1653150030382, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21560, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289130f1090500004ca4700" + }, + { + "created_at": "2022-05-21T16:20:27.375Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 306478, + "type": "NORMAL", + "rate": 1.0415999999999999, + "percent": 60, + "pumpId": 453830, + "endId": 453834, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628913101090500004ca4702" + }, + { + "created_at": "2022-05-21T16:11:20.186Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 545699, + "type": "NORMAL", + "rate": 0.32550000000000007, + "percent": -50, + "pumpId": 453827, + "endId": 453829, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890f811090500004ca46fc" + }, + { + "created_at": "2022-05-21T16:06:52.798Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 265903, + "type": "NORMAL", + "rate": 0.26039999999999996, + "percent": -60, + "pumpId": 453824, + "endId": 453826, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890e29cf7ee10004a2b1e1" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.32, + "created_at": "2022-05-21T16:01:01.819Z", + "date": 1653148861819, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21559, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890cc9cf7ee10004a2b1dc" + }, + { + "created_at": "2022-05-21T16:00:58.172Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 344000, + "type": "FAKE_EXTENDED", + "rate": 1.9068139534883721, + "absolute": 1.9068139534883721, + "pumpId": 21558, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890cc9cf7ee10004a2b1dd" + }, + { + "created_at": "2022-05-21T16:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 46830, + "type": "NORMAL", + "rate": 0.06509999999999999, + "percent": -90, + "pumpId": 453811, + "endId": 453814, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890b82cf7ee10004a2b1d9" + }, + { + "created_at": "2022-05-21T15:55:39.147Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 260853, + "type": "NORMAL", + "rate": 0.0673, + "percent": -90, + "pumpId": 453811, + "endId": 453814, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890b82cf7ee10004a2b1d9" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-21T15:51:00.932Z", + "date": 1653148260932, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21557, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890a6dcf7ee10004a2b1d4" + }, + { + "created_at": "2022-05-21T15:50:58.818Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 278838, + "type": "NORMAL", + "rate": 1.1441000000000001, + "percent": 70, + "pumpId": 453806, + "endId": 453810, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890a6ecf7ee10004a2b1d6" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.14, + "created_at": "2022-05-21T15:40:59.961Z", + "date": 1653147659961, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21556, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890811cf7ee10004a2b1cf" + }, + { + "created_at": "2022-05-21T15:35:20.343Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 15, + "durationInMilliseconds": 935989, + "type": "NORMAL", + "rate": 1.0095, + "percent": 50, + "pumpId": 453800, + "endId": 453805, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628906e3cf7ee10004a2b1cc" + }, + { + "created_at": "2022-05-21T15:31:00.492Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 258353, + "type": "NORMAL", + "rate": 0.0673, + "percent": -90, + "pumpId": 453797, + "endId": 453799, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628905b6c9346b0004863368" + }, + { + "created_at": "2022-05-21T15:25:55.840Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 303154, + "type": "NORMAL", + "rate": 0.3365000000000001, + "percent": -50, + "pumpId": 453794, + "endId": 453796, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890488c9346b0004863365" + }, + { + "created_at": "2022-05-21T15:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 25, + "durationInMilliseconds": 1553350, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453790, + "endId": 453793, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288fa1b0e0c880004d58de2" + }, + { + "created_at": "2022-05-21T14:41:07.802Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 18, + "durationInMilliseconds": 1132198, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453790, + "endId": 453793, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288fa1b0e0c880004d58de2" + }, + { + "created_at": "2022-05-21T14:30:59.772Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 605542, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453787, + "endId": 453789, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288f7a60e0c880004d58ddd" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.28, + "created_at": "2022-05-21T14:25:43.954Z", + "date": 1653143143954, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21555, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288f6770e0c880004d58dd9" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.78, + "created_at": "2022-05-21T14:15:46.926Z", + "date": 1653142546926, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21554, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288f4152634cd0004296072" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.86, + "created_at": "2022-05-21T14:05:34.493Z", + "date": 1653141934493, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21553, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288f1b82634cd000429606d" + }, + { + "created_at": "2022-05-21T14:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 30, + "durationInMilliseconds": 1857281, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453769, + "endId": 453786, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288e8910f1be700041e5a02" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.58, + "created_at": "2022-05-21T13:55:47.615Z", + "date": 1653141347615, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21552, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288ef752634cd0004296068" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.98, + "created_at": "2022-05-21T13:45:57.753Z", + "date": 1653140757753, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21551, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288ed160f1be700041e5a0c" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.6, + "created_at": "2022-05-21T13:36:02.971Z", + "date": 1653140162971, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21550, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288ead30f1be700041e5a08" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.58, + "created_at": "2022-05-21T13:30:42.515Z", + "date": 1653139842515, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21549, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288e98c0f1be700041e5a04" + }, + { + "created_at": "2022-05-21T13:26:18.959Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 33, + "durationInMilliseconds": 2021041, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453769, + "endId": 453786, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288e8910f1be700041e5a02" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.74, + "created_at": "2022-05-21T13:10:43.719Z", + "date": 1653138643719, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21548, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288e5520f1be700041e59f9" + }, + { + "eventType": "Correction Bolus", + "insulin": 1.04, + "created_at": "2022-05-21T13:00:56.399Z", + "date": 1653138056399, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21547, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288e2970f1be700041e59f4" + }, + { + "created_at": "2022-05-21T13:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 26, + "durationInMilliseconds": 1576482, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453759, + "endId": 453768, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288da470f1be700041e59e4" + }, + { + "eventType": "Correction Bolus", + "insulin": 1.24, + "created_at": "2022-05-21T12:55:30.825Z", + "date": 1653137730825, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21546, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288e1500f1be700041e59f1" + }, + { + "created_at": "2022-05-21T12:25:26.042Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 34, + "durationInMilliseconds": 2073958, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453759, + "endId": 453768, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288da470f1be700041e59e4" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-21T12:10:34.513Z", + "date": 1653135034513, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21545, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288d6ca0f1be700041e59db" + }, + { + "created_at": "2022-05-21T12:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 25, + "durationInMilliseconds": 1523557, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453752, + "endId": 453758, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288cc5d8e9ed800049b39f4" + }, + { + "created_at": "2022-05-21T11:26:10.112Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 33, + "durationInMilliseconds": 2029888, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453752, + "endId": 453758, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288cc5d8e9ed800049b39f4" + }, + { + "eventType": "Meal Bolus", + "insulin": 8.22, + "created_at": "2022-05-21T11:23:36.043Z", + "date": 1653132216043, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 21544, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288cbc78e9ed800049b39ef" + }, + { + "created_at": "2022-05-21T11:21:02.281Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299000, + "type": "FAKE_EXTENDED", + "rate": 1.6932107023411371, + "absolute": 1.6932107023411371, + "pumpId": 21543, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288cb308e9ed800049b39ee" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.2, + "created_at": "2022-05-21T11:15:45.765Z", + "date": 1653131745765, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21542, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c9e98e9ed800049b39e9" + }, + { + "created_at": "2022-05-21T11:15:43.070Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 308169, + "type": "NORMAL", + "rate": 1.533, + "percent": 110, + "pumpId": 453738, + "endId": 453742, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c9e98e9ed800049b39eb" + }, + { + "created_at": "2022-05-21T11:10:35.181Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 305390, + "type": "NORMAL", + "rate": 0.073, + "percent": -90, + "pumpId": 453735, + "endId": 453737, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c8bb8e9ed800049b39e7" + }, + { + "created_at": "2022-05-21T11:00:50.721Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 582968, + "type": "NORMAL", + "rate": 0.21899999999999997, + "percent": -70, + "pumpId": 453732, + "endId": 453734, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c6661991280004dce46a" + }, + { + "created_at": "2022-05-21T11:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 49281, + "type": "NORMAL", + "rate": 1.022, + "percent": 40, + "pumpId": 453728, + "endId": 453731, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c5381991280004dce466" + }, + { + "created_at": "2022-05-21T10:55:43.162Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 256838, + "type": "NORMAL", + "rate": 1.0248, + "percent": 40, + "pumpId": 453728, + "endId": 453731, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c5381991280004dce466" + }, + { + "created_at": "2022-05-21T10:50:29.463Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 312203, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453725, + "endId": 453727, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c40a1991280004dce463" + }, + { + "created_at": "2022-05-21T10:45:42.010Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 285961, + "type": "NORMAL", + "rate": 0.0732, + "percent": -90, + "pumpId": 453722, + "endId": 453724, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c2dd1991280004dce460" + }, + { + "created_at": "2022-05-21T10:40:32.888Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 306629, + "type": "NORMAL", + "rate": 0.2928, + "percent": -60, + "pumpId": 453719, + "endId": 453721, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c1ae1991280004dce45d" + }, + { + "created_at": "2022-05-21T10:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 40, + "durationInMilliseconds": 2430396, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453715, + "endId": 453718, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288b09fc9c02c00041f7efb" + }, + { + "created_at": "2022-05-21T09:27:51.738Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 32, + "durationInMilliseconds": 1928262, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453715, + "endId": 453718, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288b09fc9c02c00041f7efb" + }, + { + "created_at": "2022-05-21T09:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 27, + "durationInMilliseconds": 1670246, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453708, + "endId": 453714, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288a50699fc930004d6bdea" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.32, + "created_at": "2022-05-21T08:58:07.216Z", + "date": 1653123487216, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21541, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288a9a499fc930004d6bdf2" + }, + { + "created_at": "2022-05-21T08:38:27.621Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 21, + "durationInMilliseconds": 1292379, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453708, + "endId": 453714, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288a50699fc930004d6bdea" + }, + { + "created_at": "2022-05-21T08:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 38, + "durationInMilliseconds": 2306129, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453704, + "endId": 453707, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62889bb2a4cc860004a251c6" + }, + { + "created_at": "2022-05-21T07:58:04.003Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 1, + "durationInMilliseconds": 115997, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453704, + "endId": 453707, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62889bb2a4cc860004a251c6" + }, + { + "eventType": "Meal Bolus", + "insulin": 13.56, + "created_at": "2022-05-21T07:52:52.394Z", + "date": 1653119572394, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 21540, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62889a5d7ff1e700040f17d9" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.34, + "created_at": "2022-05-21T07:38:42.955Z", + "date": 1653118722955, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21539, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288971c7ff1e700040f17d2" + }, + { + "created_at": "2022-05-21T07:38:40.317Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 19, + "durationInMilliseconds": 1153999, + "type": "FAKE_EXTENDED", + "rate": 2.251401644195532, + "absolute": 2.251401644195532, + "pumpId": 21538, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628897027ff1e700040f17d0" + }, + { + "created_at": "2022-05-21T07:28:33.763Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 595482, + "type": "NORMAL", + "rate": 0.377, + "percent": -50, + "pumpId": 453689, + "endId": 453691, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628894a17ff1e700040f17cc" + }, + { + "created_at": "2022-05-21T07:13:06.679Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 15, + "durationInMilliseconds": 924592, + "type": "NORMAL", + "rate": 0.2262, + "percent": -70, + "pumpId": 453686, + "endId": 453688, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62889106149196000412bf59" + }, + { + "created_at": "2022-05-21T07:08:35.905Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 269284, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453683, + "endId": 453685, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288900b149196000412bf56" + }, + { + "created_at": "2022-05-21T07:03:41.224Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 292184, + "type": "NORMAL", + "rate": 0.0754, + "percent": -90, + "pumpId": 453680, + "endId": 453682, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62888edd149196000412bf53" + }, + { + "created_at": "2022-05-21T07:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 3, + "durationInMilliseconds": 219733, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453676, + "endId": 453679, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628887058ff3530004dc606e" + }, + { + "created_at": "2022-05-21T06:30:07.195Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1792805, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453676, + "endId": 453679, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628887058ff3530004dc606e" + }, + { + "created_at": "2022-05-21T06:12:44.359Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 17, + "durationInMilliseconds": 1041347, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453673, + "endId": 453675, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628882e48ff3530004dc6064" + }, + { + "created_at": "2022-05-21T06:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 12, + "durationInMilliseconds": 762867, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453669, + "endId": 453672, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62887ea0e964810004aa5663" + }, + { + "created_at": "2022-05-21T05:54:16.341Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 343659, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453669, + "endId": 453672, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62887ea0e964810004aa5663" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.44, + "created_at": "2022-05-21T05:47:59.042Z", + "date": 1653112079042, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21537, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62887d27e964810004aa5660" + }, + { + "created_at": "2022-05-21T05:47:56.189Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 6, + "durationInMilliseconds": 371000, + "type": "FAKE_EXTENDED", + "rate": 3.305911051212938, + "absolute": 3.305911051212938, + "pumpId": 21536, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62887d0ee964810004aa565f" + }, + { + "created_at": "2022-05-21T05:42:45.087Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299481, + "type": "NORMAL", + "rate": 0.8613000000000001, + "percent": 10, + "pumpId": 453657, + "endId": 453659, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62887be0e964810004aa565c" + }, + { + "created_at": "2022-05-21T05:37:33.183Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 309411, + "type": "NORMAL", + "rate": 0.0783, + "percent": -90, + "pumpId": 453654, + "endId": 453656, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62887ab2e964810004aa5659" + }, + { + "created_at": "2022-05-21T05:12:51.790Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 24, + "durationInMilliseconds": 1479904, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453651, + "endId": 453653, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628874e5363e6c0004f710db" + }, + { + "created_at": "2022-05-21T05:07:46.012Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 304280, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453648, + "endId": 453650, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628873b8363e6c0004f710d8" + }, + { + "created_at": "2022-05-21T05:02:53.773Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 289742, + "type": "NORMAL", + "rate": 0.1566, + "percent": -80, + "pumpId": 453645, + "endId": 453647, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288728a363e6c0004f710d5" + }, + { + "created_at": "2022-05-21T05:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 2, + "durationInMilliseconds": 171279, + "type": "NORMAL", + "rate": 1.5659999999999998, + "percent": 100, + "pumpId": 453639, + "endId": 453644, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288715d363e6c0004f710d2" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.2, + "created_at": "2022-05-21T04:57:53.298Z", + "date": 1653109073298, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21535, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288715c363e6c0004f710d1" + }, + { + "created_at": "2022-05-21T04:57:50.147Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 2, + "durationInMilliseconds": 129853, + "type": "NORMAL", + "rate": 1.472, + "percent": 100, + "pumpId": 453639, + "endId": 453644, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288715d363e6c0004f710d2" + }, + { + "created_at": "2022-05-21T04:52:45.360Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 303299, + "type": "NORMAL", + "rate": 1.0304, + "percent": 40, + "pumpId": 453636, + "endId": 453638, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288702f363e6c0004f710ce" + }, + { + "created_at": "2022-05-21T04:37:34.478Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 15, + "durationInMilliseconds": 909400, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453633, + "endId": 453635, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62886c9719e2e60004989bb7" + }, + { + "created_at": "2022-05-21T04:27:51.392Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 581589, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453630, + "endId": 453632, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62886a5519e2e60004989bb2" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.14, + "created_at": "2022-05-21T04:23:04.285Z", + "date": 1653106984285, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21534, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288694019e2e60004989baf" + }, + { + "created_at": "2022-05-21T04:23:00.631Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 289268, + "type": "NORMAL", + "rate": 0.4416, + "percent": -40, + "pumpId": 453625, + "endId": 453629, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288692719e2e60004989bae" + }, + { + "created_at": "2022-05-21T04:18:00.399Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 291000, + "type": "FAKE_EXTENDED", + "rate": 3.210226804123711, + "absolute": 3.210226804123711, + "pumpId": 21533, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288681219e2e60004989bab" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.66, + "created_at": "2022-05-21T04:13:03.102Z", + "date": 1653106383102, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21532, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628866e342c1220004f95738" + }, + { + "created_at": "2022-05-21T04:13:00.412Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299987, + "type": "FAKE_EXTENDED", + "rate": 3.3759999999999994, + "absolute": 3.3759999999999994, + "pumpId": 21531, + "endId": 21533, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628866e342c1220004f95739" + }, + { + "created_at": "2022-05-21T04:07:39.846Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 307758, + "type": "NORMAL", + "rate": 1.0304, + "percent": 40, + "pumpId": 453609, + "endId": 453611, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288659d42c1220004f95735" + }, + { + "created_at": "2022-05-21T04:02:57.240Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 280112, + "type": "NORMAL", + "rate": 0.368, + "percent": -50, + "pumpId": 453606, + "endId": 453608, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288648842c1220004f95732" + }, + { + "created_at": "2022-05-21T04:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 2, + "durationInMilliseconds": 175749, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453602, + "endId": 453605, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628860fe42c1220004f9572b" + }, + { + "created_at": "2022-05-21T03:47:49.532Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 12, + "durationInMilliseconds": 730468, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453602, + "endId": 453605, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628860fe42c1220004f9572b" + }, + { + "created_at": "2022-05-21T03:43:04.365Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 283670, + "type": "NORMAL", + "rate": 0.7001999999999999, + "percent": -10, + "pumpId": 453599, + "endId": 453601, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62885fcf42c1220004f95728" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.52, + "created_at": "2022-05-21T03:38:07.812Z", + "date": 1653104287812, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21530, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62885ea5293f3e00042c31e0" + }, + { + "created_at": "2022-05-21T03:38:05.030Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 290000, + "type": "FAKE_EXTENDED", + "rate": 3.2607586206896553, + "absolute": 3.2607586206896553, + "pumpId": 21529, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62885ea5293f3e00042c31e1" + }, + { + "created_at": "2022-05-21T03:32:50.531Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 303634, + "type": "NORMAL", + "rate": 0.2334, + "percent": -70, + "pumpId": 453587, + "endId": 453589, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62885d78293f3e00042c31dd" + }, + { + "created_at": "2022-05-21T03:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 32, + "durationInMilliseconds": 1969040, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453583, + "endId": 453586, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628851a75151b5000462a1e1" + }, + { + "created_at": "2022-05-21T02:42:42.383Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 17, + "durationInMilliseconds": 1037617, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453583, + "endId": 453586, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628851a75151b5000462a1e1" + }, + { + "created_at": "2022-05-21T02:37:54.170Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 286717, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453580, + "endId": 453582, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628850925151b5000462a1de" + }, + { + "created_at": "2022-05-21T02:32:55.252Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 297423, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453577, + "endId": 453579, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62884f645151b5000462a1db" + }, + { + "created_at": "2022-05-21T02:28:10.152Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 283605, + "type": "NORMAL", + "rate": 0.2968, + "percent": -60, + "pumpId": 453574, + "endId": 453576, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62884e4993668c0004a30516" + }, + { + "eventType": "Correction Bolus", + "insulin": 1.5, + "created_at": "2022-05-21T02:23:08.766Z", + "date": 1653099788766, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21528, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62884d1b93668c0004a30512" + }, + { + "created_at": "2022-05-21T02:23:06.229Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 294000, + "type": "FAKE_EXTENDED", + "rate": 7.10934693877551, + "absolute": 7.10934693877551, + "pumpId": 21527, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62884d1b93668c0004a30513" + }, + { + "created_at": "2022-05-21T02:17:55.333Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299966, + "type": "NORMAL", + "rate": 0.5936, + "percent": -20, + "pumpId": 453562, + "endId": 453564, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62884bd493668c0004a3050f" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.92, + "created_at": "2022-05-21T02:13:06.284Z", + "date": 1653099186284, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21526, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62884ac093668c0004a3050b" + }, + { + "created_at": "2022-05-21T02:13:03.301Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 283000, + "type": "FAKE_EXTENDED", + "rate": 3.0317526501766783, + "absolute": 3.0317526501766783, + "pumpId": 21525, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62884ac093668c0004a3050c" + }, + { + "created_at": "2022-05-21T02:02:49.661Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 601864, + "type": "NORMAL", + "rate": 0.5201, + "percent": -30, + "pumpId": 453548, + "endId": 453552, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288484c93668c0004a30503" + }, + { + "created_at": "2022-05-21T02:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 2, + "durationInMilliseconds": 168169, + "type": "NORMAL", + "rate": 0.6687000000000001, + "percent": -10, + "pumpId": 453542, + "endId": 453547, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288473793668c0004a30500" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-21T01:57:52.501Z", + "date": 1653098272501, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21524, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288473793668c0004a304ff" + }, + { + "created_at": "2022-05-21T01:57:50.546Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 2, + "durationInMilliseconds": 129454, + "type": "NORMAL", + "rate": 0.7155, + "percent": -10, + "pumpId": 453542, + "endId": 453547, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288473793668c0004a30500" + }, + { + "created_at": "2022-05-21T01:52:49.925Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 300621, + "type": "NORMAL", + "rate": 0.795, + "percent": 0, + "_id": "neutral_1653097969925" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.46, + "created_at": "2022-05-21T01:47:59.874Z", + "date": 1653097679874, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21523, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628844e49d7ff00004aaf0c0" + }, + { + "created_at": "2022-05-21T01:47:56.925Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 293000, + "type": "FAKE_EXTENDED", + "rate": 3.00660409556314, + "absolute": 3.00660409556314, + "pumpId": 21522, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628844e49d7ff00004aaf0c1" + }, + { + "created_at": "2022-05-21T01:42:53.604Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 292860, + "type": "NORMAL", + "rate": 0.3975, + "percent": -50, + "pumpId": 453530, + "endId": 453532, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628843b79d7ff00004aaf0bd" + }, + { + "created_at": "2022-05-21T01:37:38.923Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 313186, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453527, + "endId": 453529, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628842709d7ff00004aaf0ba" + }, + { + "created_at": "2022-05-21T01:32:51.444Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 284984, + "type": "NORMAL", + "rate": 0.318, + "percent": -60, + "pumpId": 453524, + "endId": 453526, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288415b9d7ff00004aaf0b7" + }, + { + "eventType": "Correction Bolus", + "insulin": 1.5, + "created_at": "2022-05-21T01:27:52.076Z", + "date": 1653096472076, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21521, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288402d9d7ff00004aaf0b4" + }, + { + "eventType": "Correction Bolus", + "insulin": 1.6, + "created_at": "2022-05-21T01:18:07.619Z", + "date": 1653095887619, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21520, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62883de332ad2e0004b68cca" + }, + { + "created_at": "2022-05-21T01:18:05.464Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 876000, + "type": "FAKE_EXTENDED", + "rate": 5.068972602739726, + "absolute": 5.068972602739726, + "pumpId": 21519, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62883de332ad2e0004b68cc9" + }, + { + "created_at": "2022-05-21T01:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 18, + "durationInMilliseconds": 1085464, + "type": "NORMAL", + "rate": 0.795, + "percent": 0, + "_id": "neutral_1653086276443" + }, + { + "created_at": "2022-05-21T00:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 60, + "durationInMilliseconds": 3600000, + "type": "NORMAL", + "rate": 0.76, + "percent": 0, + "_id": "neutral_1653086276443" + }, + { + "created_at": "2022-05-20T23:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 60, + "durationInMilliseconds": 3600000, + "type": "NORMAL", + "rate": 0.738, + "percent": 0, + "_id": "neutral_1653086276443" + }, + { + "created_at": "2022-05-20T22:37:56.443Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 22, + "durationInMilliseconds": 1323557, + "type": "NORMAL", + "rate": 0.7239999999999999, + "percent": 0, + "_id": "neutral_1653086276443" + }, + { + "created_at": "2022-05-20T22:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 37, + "durationInMilliseconds": 2276443, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453504, + "endId": 453510, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62880a6b1664860004cb51ad" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-20T21:38:36.984Z", + "date": 1653082716984, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21518, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62880a6b1664860004cb51ac" + }, + { + "created_at": "2022-05-20T21:38:35.831Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 21, + "durationInMilliseconds": 1284169, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453504, + "endId": 453510, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62880a6b1664860004cb51ad" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-20T21:28:21.755Z", + "date": 1653082101755, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21517, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628807f71664860004cb51a6" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.18, + "created_at": "2022-05-20T21:18:34.069Z", + "date": 1653081514069, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21516, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628805b61664860004cb51a2" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.22, + "created_at": "2022-05-20T21:08:33.702Z", + "date": 1653080913702, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21515, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288035c1664860004cb519c" + }, + { + "created_at": "2022-05-20T21:08:31.728Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 30, + "durationInMilliseconds": 1801610, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453495, + "endId": 453503, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288035c1664860004cb519d" + }, + { + "created_at": "2022-05-20T21:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 8, + "durationInMilliseconds": 510237, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453478, + "endId": 453494, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287ece572b1ae0004593ff0" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.22, + "created_at": "2022-05-20T20:53:24.438Z", + "date": 1653080004438, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21514, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287ffd41664860004cb5195" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.32, + "created_at": "2022-05-20T20:43:26.220Z", + "date": 1653079406220, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21513, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287fd7ba2dcb700046b8728" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.28, + "created_at": "2022-05-20T20:33:38.526Z", + "date": 1653078818526, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21512, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287fb3aa2dcb700046b8724" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.28, + "created_at": "2022-05-20T20:22:54.311Z", + "date": 1653078174311, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21511, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287f8aba2dcb700046b871e" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.34, + "created_at": "2022-05-20T20:17:40.808Z", + "date": 1653077860808, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21510, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287f765a2dcb700046b871b" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-20T20:08:27.325Z", + "date": 1653077307325, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21509, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287f54db2af570004d8c046" + }, + { + "created_at": "2022-05-20T20:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 60, + "durationInMilliseconds": 3600000, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453478, + "endId": 453494, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287ece572b1ae0004593ff0" + }, + { + "created_at": "2022-05-20T19:32:50.116Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 27, + "durationInMilliseconds": 1629884, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453478, + "endId": 453494, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287ece572b1ae0004593ff0" + }, + { + "eventType": "Meal Bolus", + "insulin": 9.58, + "created_at": "2022-05-20T19:27:22.747Z", + "date": 1653074842747, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 21508, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287eb9d72b1ae0004593fea" + }, + { + "created_at": "2022-05-20T19:08:06.145Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 24, + "durationInMilliseconds": 1481495, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453473, + "endId": 453477, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287e73072b1ae0004593fe2" + }, + { + "created_at": "2022-05-20T19:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 8, + "durationInMilliseconds": 484657, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453469, + "endId": 453472, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287dedc72b1ae0004593fd2" + }, + { + "created_at": "2022-05-20T18:33:00.960Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 26, + "durationInMilliseconds": 1619040, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453469, + "endId": 453472, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287dedc72b1ae0004593fd2" + }, + { + "created_at": "2022-05-20T18:17:39.957Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 15, + "durationInMilliseconds": 918518, + "type": "NORMAL", + "rate": 0.5591999999999999, + "percent": -20, + "pumpId": 453466, + "endId": 453468, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287db4963f1e20004e4e5a7" + }, + { + "created_at": "2022-05-20T18:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 17, + "durationInMilliseconds": 1059957, + "type": "NORMAL", + "rate": 0.699, + "percent": 0, + "_id": "neutral_1653069600000" + } +] diff --git a/app/src/test/res/autotune/test2/aapsorefautotune_recommendations.log b/app/src/test/res/autotune/test2/aapsorefautotune_recommendations.log new file mode 100644 index 0000000000..c7d134a614 --- /dev/null +++ b/app/src/test/res/autotune/test2/aapsorefautotune_recommendations.log @@ -0,0 +1,53 @@ +Parameter | Pump | Autotune | Days Missing +--------------------------------------------------------- +ISF [mg/dL/U] | 86.200 | 82.222 | +Carb Ratio[g/U]| 5.750 | 5.750 | +Basals [U/hr] | - | | + 00:00 | 0.966 | 1.009 | 0 + 00:30 | | | + 01:00 | 0.977 | 0.984 | 0 + 01:30 | | | + 02:00 | 0.971 | 0.988 | 0 + 02:30 | | | + 03:00 | 1.111 | 1.158 | 0 + 03:30 | | | + 04:00 | 0.974 | 1.028 | 0 + 04:30 | | | + 05:00 | 0.923 | 0.933 | 0 + 05:30 | | | + 06:00 | 0.823 | 0.824 | 0 + 06:30 | | | + 07:00 | 0.855 | 0.849 | 0 + 07:30 | | | + 08:00 | 0.902 | 0.909 | 0 + 08:30 | | | + 09:00 | 0.934 | 0.954 | 0 + 09:30 | | | + 10:00 | 0.938 | 0.961 | 0 + 10:30 | | | + 11:00 | 0.903 | 0.926 | 0 + 11:30 | | | + 12:00 | 0.882 | 0.885 | 0 + 12:30 | | | + 13:00 | 0.874 | 0.876 | 1 + 13:30 | | | + 14:00 | 0.866 | 0.869 | 1 + 14:30 | | | + 15:00 | 0.848 | 0.881 | 0 + 15:30 | | | + 16:00 | 0.758 | 0.798 | 0 + 16:30 | | | + 17:00 | 0.650 | 0.683 | 0 + 17:30 | | | + 18:00 | 0.648 | 0.634 | 0 + 18:30 | | | + 19:00 | 0.738 | 0.725 | 0 + 19:30 | | | + 20:00 | 0.847 | 0.838 | 0 + 20:30 | | | + 21:00 | 0.861 | 0.881 | 0 + 21:30 | | | + 22:00 | 0.863 | 0.910 | 0 + 22:30 | | | + 23:00 | 0.843 | 0.910 | 0 + 23:30 | | | diff --git a/app/src/test/res/autotune/test2/aapsorefprofile.2022-05-21.json b/app/src/test/res/autotune/test2/aapsorefprofile.2022-05-21.json new file mode 100644 index 0000000000..eefadabacb --- /dev/null +++ b/app/src/test/res/autotune/test2/aapsorefprofile.2022-05-21.json @@ -0,0 +1,147 @@ +{ + "name": "Tuned Dyn2", + "min_5m_carbimpact": 8, + "dia": 6, + "curve": "ultra-rapid", + "useCustomPeakTime": true, + "insulinPeakTime": 45, + "basalprofile": [ + { + "start": "00:00:00", + "minutes": 0, + "rate": 0.966 + }, + { + "start": "01:00:00", + "minutes": 60, + "rate": 0.977 + }, + { + "start": "02:00:00", + "minutes": 120, + "rate": 0.971 + }, + { + "start": "03:00:00", + "minutes": 180, + "rate": 1.111 + }, + { + "start": "04:00:00", + "minutes": 240, + "rate": 0.974 + }, + { + "start": "05:00:00", + "minutes": 300, + "rate": 0.923 + }, + { + "start": "06:00:00", + "minutes": 360, + "rate": 0.823 + }, + { + "start": "07:00:00", + "minutes": 420, + "rate": 0.855 + }, + { + "start": "08:00:00", + "minutes": 480, + "rate": 0.902 + }, + { + "start": "09:00:00", + "minutes": 540, + "rate": 0.934 + }, + { + "start": "10:00:00", + "minutes": 600, + "rate": 0.938 + }, + { + "start": "11:00:00", + "minutes": 660, + "rate": 0.903 + }, + { + "start": "12:00:00", + "minutes": 720, + "rate": 0.882 + }, + { + "start": "13:00:00", + "minutes": 780, + "rate": 0.874 + }, + { + "start": "14:00:00", + "minutes": 840, + "rate": 0.866 + }, + { + "start": "15:00:00", + "minutes": 900, + "rate": 0.848 + }, + { + "start": "16:00:00", + "minutes": 960, + "rate": 0.758 + }, + { + "start": "17:00:00", + "minutes": 1020, + "rate": 0.65 + }, + { + "start": "18:00:00", + "minutes": 1080, + "rate": 0.648 + }, + { + "start": "19:00:00", + "minutes": 1140, + "rate": 0.738 + }, + { + "start": "20:00:00", + "minutes": 1200, + "rate": 0.847 + }, + { + "start": "21:00:00", + "minutes": 1260, + "rate": 0.861 + }, + { + "start": "22:00:00", + "minutes": 1320, + "rate": 0.863 + }, + { + "start": "23:00:00", + "minutes": 1380, + "rate": 0.843 + } + ], + "isfProfile": { + "sensitivities": [ + { + "i": 0, + "start": "00:00:00", + "sensitivity": 86.2, + "offset": 0, + "x": 0, + "endoffset": 1440 + } + ] + }, + "carb_ratio": 5.75, + "autosens_max": 1.3, + "autosens_min": 0.7, + "units": "mg/dl", + "timezone": "Europe/Paris" +} diff --git a/app/src/test/res/autotune/test2/aapsorefprofile.json b/app/src/test/res/autotune/test2/aapsorefprofile.json new file mode 100644 index 0000000000..ad7b75b70c --- /dev/null +++ b/app/src/test/res/autotune/test2/aapsorefprofile.json @@ -0,0 +1,175 @@ +{ + "autosens_max": 1.3, + "autosens_min": 0.7, + "basalprofile": [ + { + "i": 0, + "minutes": 0, + "rate": 1.009, + "start": "00:00:00" + }, + { + "i": 1, + "minutes": 60, + "rate": 0.984, + "start": "01:00:00" + }, + { + "i": 2, + "minutes": 120, + "rate": 0.988, + "start": "02:00:00" + }, + { + "i": 3, + "minutes": 180, + "rate": 1.158, + "start": "03:00:00" + }, + { + "i": 4, + "minutes": 240, + "rate": 1.028, + "start": "04:00:00" + }, + { + "i": 5, + "minutes": 300, + "rate": 0.933, + "start": "05:00:00" + }, + { + "i": 6, + "minutes": 360, + "rate": 0.824, + "start": "06:00:00" + }, + { + "i": 7, + "minutes": 420, + "rate": 0.849, + "start": "07:00:00" + }, + { + "i": 8, + "minutes": 480, + "rate": 0.909, + "start": "08:00:00" + }, + { + "i": 9, + "minutes": 540, + "rate": 0.954, + "start": "09:00:00" + }, + { + "i": 10, + "minutes": 600, + "rate": 0.961, + "start": "10:00:00" + }, + { + "i": 11, + "minutes": 660, + "rate": 0.926, + "start": "11:00:00" + }, + { + "i": 12, + "minutes": 720, + "rate": 0.885, + "start": "12:00:00" + }, + { + "i": 13, + "minutes": 780, + "rate": 0.876, + "start": "13:00:00", + "untuned": 1 + }, + { + "i": 14, + "minutes": 840, + "rate": 0.869, + "start": "14:00:00", + "untuned": 1 + }, + { + "i": 15, + "minutes": 900, + "rate": 0.881, + "start": "15:00:00" + }, + { + "i": 16, + "minutes": 960, + "rate": 0.798, + "start": "16:00:00" + }, + { + "i": 17, + "minutes": 1020, + "rate": 0.683, + "start": "17:00:00" + }, + { + "i": 18, + "minutes": 1080, + "rate": 0.634, + "start": "18:00:00" + }, + { + "i": 19, + "minutes": 1140, + "rate": 0.725, + "start": "19:00:00" + }, + { + "i": 20, + "minutes": 1200, + "rate": 0.838, + "start": "20:00:00" + }, + { + "i": 21, + "minutes": 1260, + "rate": 0.881, + "start": "21:00:00" + }, + { + "i": 22, + "minutes": 1320, + "rate": 0.91, + "start": "22:00:00" + }, + { + "i": 23, + "minutes": 1380, + "rate": 0.91, + "start": "23:00:00" + } + ], + "carb_ratio": 5.75, + "csf": 14.991, + "curve": "ultra-rapid", + "dia": 6, + "insulinPeakTime": 45, + "isfProfile": { + "sensitivities": [ + { + "endoffset": 1440, + "i": 0, + "offset": 0, + "sensitivity": 82.222, + "start": "00:00:00", + "x": 0 + } + ] + }, + "min_5m_carbimpact": 8, + "name": "Tuned Dyn2", + "sens": 82.222, + "timezone": "Europe/Paris", + "units": "mg/dl", + "useCustomPeakTime": true +} diff --git a/app/src/test/res/autotune/test2/autotune.2022-05-21.json b/app/src/test/res/autotune/test2/autotune.2022-05-21.json new file mode 100644 index 0000000000..cfedd0cf9b --- /dev/null +++ b/app/src/test/res/autotune/test2/autotune.2022-05-21.json @@ -0,0 +1 @@ +{"CRData":[],"CSFGlucoseData":[],"ISFGlucoseData":[{"device":"AndroidAPS-DexcomG6","date":1653153849000,"dateString":"2022-05-21T17:24:09.000Z","isValid":true,"sgv":96,"direction":"SingleDown","type":"sgv","_id":"628920591090500004ca4727","glucose":96,"avgDelta":"-13.25","BGI":-3.49,"deviation":"-9.76"},{"device":"AndroidAPS-DexcomG6","date":1653181150000,"dateString":"2022-05-22T00:59:10.000Z","isValid":true,"sgv":97,"direction":"SingleDown","type":"sgv","_id":"62898b01da46aa0004d1e0fa","glucose":97,"avgDelta":"-11.50","BGI":-2.84,"deviation":"-8.66"},{"device":"AndroidAPS-DexcomG6","date":1653181450000,"dateString":"2022-05-22T01:04:10.000Z","isValid":true,"sgv":92,"direction":"FortyFiveDown","type":"sgv","_id":"62898c2fda46aa0004d1e0fc","glucose":92,"avgDelta":"-10.75","BGI":-2.5,"deviation":"-8.25"},{"device":"AndroidAPS-DexcomG6","date":1653153549000,"dateString":"2022-05-21T17:19:09.000Z","isValid":true,"sgv":110,"direction":"SingleDown","type":"sgv","_id":"62891f2b1090500004ca4724","glucose":110,"avgDelta":"-12.00","BGI":-3.79,"deviation":"-8.21"},{"device":"AndroidAPS-DexcomG6","date":1653154149000,"dateString":"2022-05-21T17:29:09.000Z","isValid":true,"sgv":93,"direction":"SingleDown","type":"sgv","_id":"628921861090500004ca472b","glucose":93,"avgDelta":"-11.25","BGI":-3.19,"deviation":"-8.06"},{"device":"AndroidAPS-DexcomG6","date":1653180849000,"dateString":"2022-05-22T00:54:09.000Z","isValid":true,"sgv":105,"direction":"SingleDown","type":"sgv","_id":"628989d2da46aa0004d1e0f8","glucose":105,"avgDelta":"-9.50","BGI":-3.1,"deviation":"-6.40"},{"device":"AndroidAPS-DexcomG6","date":1653181750000,"dateString":"2022-05-22T01:09:10.000Z","isValid":true,"sgv":87,"direction":"FortyFiveDown","type":"sgv","_id":"62898d4750e51d0004429e5f","glucose":87,"avgDelta":"-8.50","BGI":-2.11,"deviation":"-6.39"},{"device":"AndroidAPS-DexcomG6","date":1653153249000,"dateString":"2022-05-21T17:14:09.000Z","isValid":true,"sgv":124,"direction":"FortyFiveDown","type":"sgv","_id":"62891dfd1090500004ca4722","glucose":124,"avgDelta":"-9.00","BGI":-4.05,"deviation":"-4.95"},{"device":"AndroidAPS-DexcomG6","date":1653154449000,"dateString":"2022-05-21T17:34:09.000Z","isValid":true,"sgv":97,"direction":"FortyFiveDown","type":"sgv","_id":"628922b18809e60004c644d6","glucose":97,"avgDelta":"-6.75","BGI":-2.84,"deviation":"-3.91"},{"device":"AndroidAPS-DexcomG6","date":1653110649000,"dateString":"2022-05-21T05:24:09.000Z","isValid":true,"sgv":98,"direction":"FortyFiveDown","type":"sgv","_id":"628877a5363e6c0004f710e0","glucose":98,"avgDelta":"-6.75","BGI":-4.44,"deviation":"-2.31"},{"device":"AndroidAPS-DexcomG6","date":1653180549000,"dateString":"2022-05-22T00:49:09.000Z","isValid":true,"sgv":121,"direction":"FortyFiveDown","type":"sgv","_id":"628988a3da46aa0004d1e0f5","glucose":121,"avgDelta":"-5.25","BGI":-3.32,"deviation":"-1.93"},{"device":"AndroidAPS-DexcomG6","date":1653110348000,"dateString":"2022-05-21T05:19:08.000Z","isValid":true,"sgv":102,"direction":"FortyFiveDown","type":"sgv","_id":"62887677363e6c0004f710de","glucose":102,"avgDelta":"-6.75","BGI":-4.91,"deviation":"-1.84"},{"device":"AndroidAPS-DexcomG6","date":1653156849000,"dateString":"2022-05-21T18:14:09.000Z","isValid":true,"sgv":110,"direction":"Flat","type":"sgv","_id":"62892c06840d8d0004a20bf2","glucose":110,"avgDelta":"-3.50","BGI":-1.72,"deviation":"-1.78"},{"device":"AndroidAPS-DexcomG6","date":1653114249000,"dateString":"2022-05-21T06:24:09.000Z","isValid":true,"sgv":85,"direction":"Flat","type":"sgv","_id":"628885a48ff3530004dc6069","glucose":85,"avgDelta":"-3.25","BGI":-1.77,"deviation":"-1.48"},{"device":"AndroidAPS-DexcomG6","date":1653131049000,"dateString":"2022-05-21T11:04:09.000Z","isValid":true,"sgv":81,"direction":"Flat","type":"sgv","_id":"6288c7418e9ed800049b39e3","glucose":81,"avgDelta":"-3.00","BGI":-1.9,"deviation":"-1.10"},{"device":"AndroidAPS-DexcomG6","date":1653110949000,"dateString":"2022-05-21T05:29:09.000Z","isValid":true,"sgv":97,"direction":"Flat","type":"sgv","_id":"628878bbe964810004aa5655","glucose":97,"avgDelta":"-5.00","BGI":-3.92,"deviation":"-1.08"},{"device":"AndroidAPS-DexcomG6","date":1653152949000,"dateString":"2022-05-21T17:09:09.000Z","isValid":true,"sgv":138,"direction":"FortyFiveDown","type":"sgv","_id":"62891cd01090500004ca471f","glucose":138,"avgDelta":"-5.25","BGI":-4.22,"deviation":"-1.03"},{"device":"AndroidAPS-DexcomG6","date":1653113949000,"dateString":"2022-05-21T06:19:09.000Z","isValid":true,"sgv":89,"direction":"Flat","type":"sgv","_id":"628884778ff3530004dc6067","glucose":89,"avgDelta":"-3.00","BGI":-2.07,"deviation":"-0.93"},{"device":"AndroidAPS-DexcomG6","date":1653113649000,"dateString":"2022-05-21T06:14:09.000Z","isValid":true,"sgv":91,"direction":"Flat","type":"sgv","_id":"6288834a8ff3530004dc6065","glucose":91,"avgDelta":"-2.75","BGI":-2.28,"deviation":"-0.47"},{"device":"AndroidAPS-DexcomG6","date":1653107948000,"dateString":"2022-05-21T04:39:08.000Z","isValid":true,"sgv":124,"direction":"FortyFiveDown","type":"sgv","_id":"62886cfc19e2e60004989bb8","glucose":124,"avgDelta":"-8.25","BGI":-7.89,"deviation":"-0.36"},{"device":"AndroidAPS-DexcomG6","date":1653156549000,"dateString":"2022-05-21T18:09:09.000Z","isValid":true,"sgv":114,"direction":"Flat","type":"sgv","_id":"62892af2840d8d0004a20bf0","glucose":114,"avgDelta":"-2.25","BGI":-1.9,"deviation":"-0.35"},{"device":"AndroidAPS-DexcomG6","date":1653137649000,"dateString":"2022-05-21T12:54:09.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","_id":"6288e1040f1be700041e59f0","glucose":79,"avgDelta":"2.25","BGI":-18.02,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653137350000,"dateString":"2022-05-21T12:49:10.000Z","isValid":true,"sgv":72,"direction":"Flat","type":"sgv","_id":"6288dfd60f1be700041e59ee","glucose":72,"avgDelta":"-0.25","BGI":-19.52,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653137049000,"dateString":"2022-05-21T12:44:09.000Z","isValid":true,"sgv":69,"direction":"Flat","type":"sgv","_id":"6288df8a0f1be700041e59ec","glucose":69,"avgDelta":"-1.75","BGI":-20.95,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653136449000,"dateString":"2022-05-21T12:34:09.000Z","isValid":true,"sgv":70,"direction":"Flat","type":"sgv","_id":"6288dd270f1be700041e59e8","glucose":70,"avgDelta":"-2.25","BGI":-23.7,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653136149000,"dateString":"2022-05-21T12:29:09.000Z","isValid":true,"sgv":73,"direction":"Flat","type":"sgv","_id":"6288db8a0f1be700041e59e5","glucose":73,"avgDelta":"-1.25","BGI":-25,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653135249000,"dateString":"2022-05-21T12:14:09.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","_id":"6288d7ae0f1be700041e59de","glucose":79,"avgDelta":"0.00","BGI":-27.76,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653134949000,"dateString":"2022-05-21T12:09:09.000Z","isValid":true,"sgv":78,"direction":"Flat","type":"sgv","_id":"6288d67f0f1be700041e59da","glucose":78,"avgDelta":"-2.25","BGI":-28.14,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653134649000,"dateString":"2022-05-21T12:04:09.000Z","isValid":true,"sgv":77,"direction":"Flat","type":"sgv","_id":"6288d5500f1be700041e59d7","glucose":77,"avgDelta":"-6.00","BGI":-28.32,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653134349000,"dateString":"2022-05-21T11:59:09.000Z","isValid":true,"sgv":76,"direction":"FortyFiveDown","type":"sgv","_id":"6288d4220f1be700041e59d5","glucose":76,"avgDelta":"-9.50","BGI":-28.06,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653134049000,"dateString":"2022-05-21T11:54:09.000Z","isValid":true,"sgv":79,"direction":"FortyFiveDown","type":"sgv","_id":"6288d3060f1be700041e59d2","glucose":79,"avgDelta":"-10.50","BGI":-27.28,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653135849000,"dateString":"2022-05-21T12:24:09.000Z","isValid":true,"sgv":76,"direction":"Flat","type":"sgv","_id":"6288d9fb0f1be700041e59e2","glucose":76,"avgDelta":"-0.25","BGI":-26.12,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653136749000,"dateString":"2022-05-21T12:39:09.000Z","isValid":true,"sgv":68,"direction":"Flat","type":"sgv","_id":"6288de580f1be700041e59ea","glucose":68,"avgDelta":"-2.50","BGI":-22.37,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653135549000,"dateString":"2022-05-21T12:19:09.000Z","isValid":true,"sgv":78,"direction":"Flat","type":"sgv","_id":"6288d8e00f1be700041e59e0","glucose":78,"avgDelta":"0.50","BGI":-27.02,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653108249000,"dateString":"2022-05-21T04:44:09.000Z","isValid":true,"sgv":123,"direction":"FortyFiveDown","type":"sgv","_id":"62886e2919e2e60004989bba","glucose":123,"avgDelta":"-7.50","BGI":-7.59,"deviation":"0.09"},{"device":"AndroidAPS-DexcomG6","date":1653130748000,"dateString":"2022-05-21T10:59:08.000Z","isValid":true,"sgv":84,"direction":"Flat","type":"sgv","_id":"6288c61a1991280004dce468","glucose":84,"avgDelta":"-2.50","BGI":-2.59,"deviation":"0.09"},{"device":"AndroidAPS-DexcomG6","date":1653110049000,"dateString":"2022-05-21T05:14:09.000Z","isValid":true,"sgv":109,"direction":"FortyFiveDown","type":"sgv","_id":"62887549363e6c0004f710dc","glucose":109,"avgDelta":"-5.25","BGI":-5.34,"deviation":"0.09"},{"device":"AndroidAPS-DexcomG6","date":1653113349000,"dateString":"2022-05-21T06:09:09.000Z","isValid":true,"sgv":94,"direction":"Flat","type":"sgv","_id":"6288821b8ff3530004dc6062","glucose":94,"avgDelta":"-2.25","BGI":-2.46,"deviation":"0.21"},{"device":"AndroidAPS-DexcomG6","date":1653111249000,"dateString":"2022-05-21T05:34:09.000Z","isValid":true,"sgv":97,"direction":"Flat","type":"sgv","_id":"628879e9e964810004aa5657","glucose":97,"avgDelta":"-3.00","BGI":-3.45,"deviation":"0.45"},{"device":"AndroidAPS-DexcomG6","date":1653130448000,"dateString":"2022-05-21T10:54:08.000Z","isValid":true,"sgv":88,"direction":"Flat","type":"sgv","_id":"6288c4ec1991280004dce464","glucose":88,"avgDelta":"-2.00","BGI":-3.36,"deviation":"1.36"},{"device":"AndroidAPS-DexcomG6","date":1653113049000,"dateString":"2022-05-21T06:04:09.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"628880ee8ff3530004dc6060","glucose":98,"avgDelta":"-1.00","BGI":-2.5,"deviation":"1.50"},{"device":"AndroidAPS-DexcomG6","date":1653151149000,"dateString":"2022-05-21T16:39:09.000Z","isValid":true,"sgv":158,"direction":"Flat","type":"sgv","_id":"628915ce1090500004ca470c","glucose":158,"avgDelta":"-3.50","BGI":-5.09,"deviation":"1.59"},{"device":"AndroidAPS-DexcomG6","date":1653180250000,"dateString":"2022-05-22T00:44:10.000Z","isValid":true,"sgv":135,"direction":"Flat","type":"sgv","_id":"62898774da46aa0004d1e0f1","glucose":135,"avgDelta":"-1.75","BGI":-3.49,"deviation":"1.74"},{"device":"AndroidAPS-DexcomG6","date":1653151449000,"dateString":"2022-05-21T16:44:09.000Z","isValid":true,"sgv":158,"direction":"Flat","type":"sgv","_id":"628916f81090500004ca4710","glucose":158,"avgDelta":"-3.00","BGI":-4.74,"deviation":"1.74"},{"device":"AndroidAPS-DexcomG6","date":1653154749000,"dateString":"2022-05-21T17:39:09.000Z","isValid":true,"sgv":108,"direction":"NONE","type":"sgv","_id":"628923df8809e60004c644d9","glucose":108,"avgDelta":"-0.50","BGI":-2.5,"deviation":"2.00"},{"device":"AndroidAPS-DexcomG6","date":1653152649000,"dateString":"2022-05-21T17:04:09.000Z","isValid":true,"sgv":149,"direction":"Flat","type":"sgv","_id":"62891ba31090500004ca471d","glucose":149,"avgDelta":"-2.25","BGI":-4.35,"deviation":"2.10"},{"device":"AndroidAPS-DexcomG6","date":1653130149000,"dateString":"2022-05-21T10:49:09.000Z","isValid":true,"sgv":91,"direction":"Flat","type":"sgv","_id":"6288c3be1991280004dce461","glucose":91,"avgDelta":"-2.00","BGI":-4.27,"deviation":"2.27"},{"device":"AndroidAPS-DexcomG6","date":1653111549000,"dateString":"2022-05-21T05:39:09.000Z","isValid":true,"sgv":100,"direction":"Flat","type":"sgv","_id":"62887b17e964810004aa565a","glucose":100,"avgDelta":"-0.50","BGI":-2.84,"deviation":"2.34"},{"device":"AndroidAPS-DexcomG6","date":1653107648000,"dateString":"2022-05-21T04:34:08.000Z","isValid":true,"sgv":132,"direction":"FortyFiveDown","type":"sgv","_id":"62886be719e2e60004989bb5","glucose":132,"avgDelta":"-5.75","BGI":-8.1,"deviation":"2.35"},{"device":"AndroidAPS-DexcomG6","date":1653150849000,"dateString":"2022-05-21T16:34:09.000Z","isValid":true,"sgv":161,"direction":"Flat","type":"sgv","_id":"628914d01090500004ca4709","glucose":161,"avgDelta":"-3.00","BGI":-5.47,"deviation":"2.47"},{"device":"AndroidAPS-DexcomG6","date":1653179350000,"dateString":"2022-05-22T00:29:10.000Z","isValid":true,"sgv":142,"direction":"Flat","type":"sgv","_id":"628983f69d6f1800047cd0dd","glucose":142,"avgDelta":"-1.75","BGI":-4.27,"deviation":"2.52"},{"device":"AndroidAPS-DexcomG6","date":1653112749000,"dateString":"2022-05-21T05:59:09.000Z","isValid":true,"sgv":101,"direction":"Flat","type":"sgv","_id":"62887fcee964810004aa5666","glucose":101,"avgDelta":"0.25","BGI":-2.46,"deviation":"2.71"},{"device":"AndroidAPS-DexcomG6","date":1653179050000,"dateString":"2022-05-22T00:24:10.000Z","isValid":true,"sgv":142,"direction":"Flat","type":"sgv","_id":"628982c89d6f1800047cd0db","glucose":142,"avgDelta":"-1.75","BGI":-4.48,"deviation":"2.73"},{"device":"AndroidAPS-DexcomG6","date":1653156250000,"dateString":"2022-05-21T18:04:10.000Z","isValid":true,"sgv":119,"direction":"Flat","type":"sgv","_id":"628929ac8809e60004c644e9","glucose":119,"avgDelta":"0.75","BGI":-2.07,"deviation":"2.82"},{"device":"AndroidAPS-DexcomG6","date":1653109748000,"dateString":"2022-05-21T05:09:08.000Z","isValid":true,"sgv":117,"direction":"Flat","type":"sgv","_id":"6288741c363e6c0004f710d9","glucose":117,"avgDelta":"-2.75","BGI":-5.73,"deviation":"2.98"},{"device":"AndroidAPS-DexcomG6","date":1653179649000,"dateString":"2022-05-22T00:34:09.000Z","isValid":true,"sgv":143,"direction":"Flat","type":"sgv","_id":"62898517da46aa0004d1e0ea","glucose":143,"avgDelta":"-1.00","BGI":-4.01,"deviation":"3.01"},{"device":"AndroidAPS-DexcomG6","date":1653151749000,"dateString":"2022-05-21T16:49:09.000Z","isValid":true,"sgv":159,"direction":"Flat","type":"sgv","_id":"628918261090500004ca4714","glucose":159,"avgDelta":"-1.50","BGI":-4.53,"deviation":"3.03"},{"device":"AndroidAPS-DexcomG6","date":1653108548000,"dateString":"2022-05-21T04:49:08.000Z","isValid":true,"sgv":128,"direction":"Flat","type":"sgv","_id":"62886f5719e2e60004989bbc","glucose":128,"avgDelta":"-4.00","BGI":-7.2,"deviation":"3.20"},{"device":"AndroidAPS-DexcomG6","date":1653129848000,"dateString":"2022-05-21T10:44:08.000Z","isValid":true,"sgv":93,"direction":"Flat","type":"sgv","_id":"6288c2911991280004dce45e","glucose":93,"avgDelta":"-2.00","BGI":-5.26,"deviation":"3.26"},{"device":"AndroidAPS-DexcomG6","date":1653173650000,"dateString":"2022-05-21T22:54:10.000Z","isValid":true,"sgv":108,"direction":"Flat","type":"sgv","_id":"6289717d37d09a00043f2b1e","glucose":108,"avgDelta":"-4.00","BGI":-7.28,"deviation":"3.28"},{"device":"AndroidAPS-DexcomG6","date":1653111849000,"dateString":"2022-05-21T05:44:09.000Z","isValid":true,"sgv":102,"direction":"Flat","type":"sgv","_id":"62887c44e964810004aa565d","glucose":102,"avgDelta":"1.00","BGI":-2.37,"deviation":"3.37"},{"device":"AndroidAPS-DexcomG6","date":1653173949000,"dateString":"2022-05-21T22:59:09.000Z","isValid":true,"sgv":108,"direction":"Flat","type":"sgv","_id":"6289721437d09a00043f2b1f","glucose":108,"avgDelta":"-3.00","BGI":-6.42,"deviation":"3.42"},{"device":"AndroidAPS-DexcomG6","date":1653150549000,"dateString":"2022-05-21T16:29:09.000Z","isValid":true,"sgv":165,"direction":"Flat","type":"sgv","_id":"628913731090500004ca4706","glucose":165,"avgDelta":"-2.25","BGI":-5.73,"deviation":"3.48"},{"device":"AndroidAPS-DexcomG6","date":1653179949000,"dateString":"2022-05-22T00:39:09.000Z","isValid":true,"sgv":143,"direction":"Flat","type":"sgv","_id":"62898645da46aa0004d1e0ee","glucose":143,"avgDelta":"-0.25","BGI":-3.75,"deviation":"3.50"},{"device":"AndroidAPS-DexcomG6","date":1653112449000,"dateString":"2022-05-21T05:54:09.000Z","isValid":true,"sgv":102,"direction":"Flat","type":"sgv","_id":"62887ea1e964810004aa5664","glucose":102,"avgDelta":"1.25","BGI":-2.28,"deviation":"3.53"},{"device":"AndroidAPS-DexcomG6","date":1653112148000,"dateString":"2022-05-21T05:49:08.000Z","isValid":true,"sgv":103,"direction":"Flat","type":"sgv","_id":"62887d72e964810004aa5661","glucose":103,"avgDelta":"1.50","BGI":-2.07,"deviation":"3.57"},{"device":"AndroidAPS-DexcomG6","date":1653178750000,"dateString":"2022-05-22T00:19:10.000Z","isValid":true,"sgv":144,"direction":"Flat","type":"sgv","_id":"628981999d6f1800047cd0d8","glucose":144,"avgDelta":"-0.75","BGI":-4.57,"deviation":"3.82"},{"device":"AndroidAPS-DexcomG6","date":1653129548000,"dateString":"2022-05-21T10:39:08.000Z","isValid":true,"sgv":94,"direction":"Flat","type":"sgv","_id":"6288c1631991280004dce45b","glucose":94,"avgDelta":"-2.50","BGI":-6.38,"deviation":"3.88"},{"device":"AndroidAPS-DexcomG6","date":1653129249000,"dateString":"2022-05-21T10:34:09.000Z","isValid":true,"sgv":96,"direction":"Flat","type":"sgv","_id":"6288c0341991280004dce459","glucose":96,"avgDelta":"-3.50","BGI":-7.59,"deviation":"4.09"},{"device":"AndroidAPS-DexcomG6","date":1653152049000,"dateString":"2022-05-21T16:54:09.000Z","isValid":true,"sgv":160,"direction":"Flat","type":"sgv","_id":"628919531090500004ca4717","glucose":160,"avgDelta":"-0.25","BGI":-4.35,"deviation":"4.10"},{"device":"AndroidAPS-DexcomG6","date":1653152349000,"dateString":"2022-05-21T16:59:09.000Z","isValid":true,"sgv":158,"direction":"Flat","type":"sgv","_id":"62891a811090500004ca471a","glucose":158,"avgDelta":"0.00","BGI":-4.35,"deviation":"4.35"},{"device":"AndroidAPS-DexcomG6","date":1653150249000,"dateString":"2022-05-21T16:24:09.000Z","isValid":true,"sgv":170,"direction":"Flat","type":"sgv","_id":"628913111090500004ca4704","glucose":170,"avgDelta":"-1.50","BGI":-5.95,"deviation":"4.45"},{"device":"AndroidAPS-DexcomG6","date":1653105549000,"dateString":"2022-05-21T03:59:09.000Z","isValid":true,"sgv":146,"direction":"FortyFiveDown","type":"sgv","_id":"628863a542c1220004f95730","glucose":146,"avgDelta":"-5.25","BGI":-9.87,"deviation":"4.62"},{"device":"AndroidAPS-DexcomG6","date":1653173350000,"dateString":"2022-05-21T22:49:10.000Z","isValid":true,"sgv":110,"direction":"Flat","type":"sgv","_id":"62896fb837d09a00043f2b1b","glucose":110,"avgDelta":"-3.50","BGI":-8.15,"deviation":"4.65"},{"device":"AndroidAPS-DexcomG6","date":1653174249000,"dateString":"2022-05-21T23:04:09.000Z","isValid":true,"sgv":111,"direction":"Flat","type":"sgv","_id":"6289726037d09a00043f2b20","glucose":111,"avgDelta":"-1.00","BGI":-5.69,"deviation":"4.69"},{"device":"AndroidAPS-DexcomG6","date":1653178449000,"dateString":"2022-05-22T00:14:09.000Z","isValid":true,"sgv":147,"direction":"Flat","type":"sgv","_id":"6289806a9d6f1800047cd0d6","glucose":147,"avgDelta":"0.25","BGI":-4.61,"deviation":"4.86"},{"device":"AndroidAPS-DexcomG6","date":1653128948000,"dateString":"2022-05-21T10:29:08.000Z","isValid":true,"sgv":99,"direction":"Flat","type":"sgv","_id":"6288bf061991280004dce457","glucose":99,"avgDelta":"-4.00","BGI":-8.88,"deviation":"4.88"},{"device":"AndroidAPS-DexcomG6","date":1653103448000,"dateString":"2022-05-21T03:24:08.000Z","isValid":true,"sgv":174,"direction":"SingleDown","type":"sgv","_id":"62885b81293f3e00042c31d9","glucose":174,"avgDelta":"-10.50","BGI":-15.43,"deviation":"4.93"},{"device":"AndroidAPS-DexcomG6","date":1653149949000,"dateString":"2022-05-21T16:19:09.000Z","isValid":true,"sgv":172,"direction":"Flat","type":"sgv","_id":"6289130f1090500004ca46ff","glucose":172,"avgDelta":"-1.00","BGI":-6.12,"deviation":"5.12"},{"device":"AndroidAPS-DexcomG6","date":1653105848000,"dateString":"2022-05-21T04:04:08.000Z","isValid":true,"sgv":146,"direction":"Flat","type":"sgv","_id":"628864d342c1220004f95733","glucose":146,"avgDelta":"-4.00","BGI":-9.14,"deviation":"5.14"},{"device":"AndroidAPS-DexcomG6","date":1653103149000,"dateString":"2022-05-21T03:19:09.000Z","isValid":true,"sgv":182,"direction":"SingleDown","type":"sgv","_id":"62885a52293f3e00042c31d7","glucose":182,"avgDelta":"-11.50","BGI":-16.64,"deviation":"5.14"},{"device":"AndroidAPS-DexcomG6","date":1653105248000,"dateString":"2022-05-21T03:54:08.000Z","isValid":true,"sgv":149,"direction":"FortyFiveDown","type":"sgv","_id":"6288629042c1220004f9572e","glucose":149,"avgDelta":"-5.25","BGI":-10.56,"deviation":"5.31"},{"device":"AndroidAPS-DexcomG6","date":1653176050000,"dateString":"2022-05-21T23:34:10.000Z","isValid":true,"sgv":127,"direction":"Flat","type":"sgv","_id":"6289771371a363000480abc1","glucose":127,"avgDelta":"2.50","BGI":-2.93,"deviation":"5.43"},{"device":"AndroidAPS-DexcomG6","date":1653149650000,"dateString":"2022-05-21T16:14:10.000Z","isValid":true,"sgv":173,"direction":"Flat","type":"sgv","_id":"62890fff1090500004ca46fd","glucose":173,"avgDelta":"-0.75","BGI":-6.42,"deviation":"5.67"},{"device":"AndroidAPS-DexcomG6","date":1653176350000,"dateString":"2022-05-21T23:39:10.000Z","isValid":true,"sgv":132,"direction":"Flat","type":"sgv","_id":"6289784271a363000480abc3","glucose":132,"avgDelta":"3.00","BGI":-2.67,"deviation":"5.67"},{"device":"AndroidAPS-DexcomG6","date":1653175750000,"dateString":"2022-05-21T23:29:10.000Z","isValid":true,"sgv":124,"direction":"Flat","type":"sgv","_id":"628975e471a363000480abbe","glucose":124,"avgDelta":"2.50","BGI":-3.19,"deviation":"5.69"},{"device":"AndroidAPS-DexcomG6","date":1653102848000,"dateString":"2022-05-21T03:14:08.000Z","isValid":true,"sgv":193,"direction":"SingleDown","type":"sgv","_id":"62885924293f3e00042c31d5","glucose":193,"avgDelta":"-12.00","BGI":-17.71,"deviation":"5.71"},{"device":"AndroidAPS-DexcomG6","date":1653128649000,"dateString":"2022-05-21T10:24:09.000Z","isValid":true,"sgv":101,"direction":"Flat","type":"sgv","_id":"6288bde0abbef90004616cf8","glucose":101,"avgDelta":"-4.50","BGI":-10.3,"deviation":"5.80"},{"device":"AndroidAPS-DexcomG6","date":1653155950000,"dateString":"2022-05-21T17:59:10.000Z","isValid":true,"sgv":123,"direction":"Flat","type":"sgv","_id":"6289287e8809e60004c644e6","glucose":123,"avgDelta":"3.75","BGI":-2.16,"deviation":"5.91"},{"device":"AndroidAPS-DexcomG6","date":1653174550000,"dateString":"2022-05-21T23:09:10.000Z","isValid":true,"sgv":114,"direction":"Flat","type":"sgv","_id":"6289727937d09a00043f2b21","glucose":114,"avgDelta":"1.00","BGI":-4.96,"deviation":"5.96"},{"device":"AndroidAPS-DexcomG6","date":1653178149000,"dateString":"2022-05-22T00:09:09.000Z","isValid":true,"sgv":149,"direction":"Flat","type":"sgv","_id":"62897f3b9d6f1800047cd0d3","glucose":149,"avgDelta":"1.50","BGI":-4.48,"deviation":"5.98"},{"device":"AndroidAPS-DexcomG6","date":1653103748000,"dateString":"2022-05-21T03:29:08.000Z","isValid":true,"sgv":171,"direction":"FortyFiveDown","type":"sgv","_id":"62885c95293f3e00042c31db","glucose":171,"avgDelta":"-8.25","BGI":-14.31,"deviation":"6.06"},{"device":"AndroidAPS-DexcomG6","date":1653108848000,"dateString":"2022-05-21T04:54:08.000Z","isValid":true,"sgv":130,"direction":"Flat","type":"sgv","_id":"62887093363e6c0004f710cf","glucose":130,"avgDelta":"-0.50","BGI":-6.72,"deviation":"6.22","uamAbsorption":"start"},{"device":"AndroidAPS-DexcomG6","date":1653175450000,"dateString":"2022-05-21T23:24:10.000Z","isValid":true,"sgv":123,"direction":"Flat","type":"sgv","_id":"628974b671a363000480abbc","glucose":123,"avgDelta":"3.00","BGI":-3.4,"deviation":"6.40"},{"device":"AndroidAPS-DexcomG6","date":1653107348000,"dateString":"2022-05-21T04:29:08.000Z","isValid":true,"sgv":144,"direction":"Flat","type":"sgv","_id":"62886ab919e2e60004989bb3","glucose":144,"avgDelta":"-1.75","BGI":-8.19,"deviation":"6.44"},{"device":"AndroidAPS-DexcomG6","date":1653102548000,"dateString":"2022-05-21T03:09:08.000Z","isValid":true,"sgv":204,"direction":"SingleDown","type":"sgv","_id":"628857f7293f3e00042c31d3","glucose":204,"avgDelta":"-12.25","BGI":-18.79,"deviation":"6.54"},{"device":"AndroidAPS-DexcomG6","date":1653109448000,"dateString":"2022-05-21T05:04:08.000Z","isValid":true,"sgv":125,"direction":"Flat","type":"sgv","_id":"628872ef363e6c0004f710d6","glucose":125,"avgDelta":"0.50","BGI":-6.08,"deviation":"6.58"},{"device":"AndroidAPS-DexcomG6","date":1653176650000,"dateString":"2022-05-21T23:44:10.000Z","isValid":true,"sgv":139,"direction":"Flat","type":"sgv","_id":"6289797071a363000480abc7","glucose":139,"avgDelta":"4.00","BGI":-2.59,"deviation":"6.59"},{"device":"AndroidAPS-DexcomG6","date":1653174850000,"dateString":"2022-05-21T23:14:10.000Z","isValid":true,"sgv":117,"direction":"Flat","type":"sgv","_id":"6289727a37d09a00043f2b22","glucose":117,"avgDelta":"2.25","BGI":-4.35,"deviation":"6.60"},{"device":"AndroidAPS-DexcomG6","date":1653149349000,"dateString":"2022-05-21T16:09:09.000Z","isValid":true,"sgv":174,"direction":"Flat","type":"sgv","_id":"62890edacf7ee10004a2b1e2","glucose":174,"avgDelta":"0.00","BGI":-6.64,"deviation":"6.64"},{"device":"AndroidAPS-DexcomG6","date":1653177850000,"dateString":"2022-05-22T00:04:10.000Z","isValid":true,"sgv":149,"direction":"Flat","type":"sgv","_id":"62897e0c9d6f1800047cd0d0","glucose":149,"avgDelta":"2.50","BGI":-4.22,"deviation":"6.72"},{"device":"AndroidAPS-DexcomG6","date":1653101948000,"dateString":"2022-05-21T02:59:08.000Z","isValid":true,"sgv":228,"direction":"SingleDown","type":"sgv","_id":"628855935151b5000462a1e8","glucose":228,"avgDelta":"-13.75","BGI":-20.52,"deviation":"6.77"},{"device":"AndroidAPS-DexcomG6","date":1653175149000,"dateString":"2022-05-21T23:19:09.000Z","isValid":true,"sgv":120,"direction":"Flat","type":"sgv","_id":"6289738f37d09a00043f2b26","glucose":120,"avgDelta":"3.00","BGI":-3.84,"deviation":"6.84"},{"device":"AndroidAPS-DexcomG6","date":1653148149000,"dateString":"2022-05-21T15:49:09.000Z","isValid":true,"sgv":174,"direction":"Flat","type":"sgv","_id":"62890a21cf7ee10004a2b1d3","glucose":174,"avgDelta":"-1.00","BGI":-7.89,"deviation":"6.89"},{"device":"AndroidAPS-DexcomG6","date":1653148749000,"dateString":"2022-05-21T15:59:09.000Z","isValid":true,"sgv":176,"direction":"Flat","type":"sgv","_id":"62890c64cf7ee10004a2b1da","glucose":176,"avgDelta":"0.00","BGI":-6.94,"deviation":"6.94"},{"device":"AndroidAPS-DexcomG6","date":1653102249000,"dateString":"2022-05-21T03:04:09.000Z","isValid":true,"sgv":216,"direction":"SingleDown","type":"sgv","_id":"628856da5151b5000462a1ea","glucose":216,"avgDelta":"-12.75","BGI":-19.7,"deviation":"6.95"},{"device":"AndroidAPS-DexcomG6","date":1653149049000,"dateString":"2022-05-21T16:04:09.000Z","isValid":true,"sgv":176,"direction":"Flat","type":"sgv","_id":"62890daccf7ee10004a2b1de","glucose":176,"avgDelta":"0.25","BGI":-6.72,"deviation":"6.97"},{"device":"AndroidAPS-DexcomG6","date":1653148450000,"dateString":"2022-05-21T15:54:10.000Z","isValid":true,"sgv":176,"direction":"Flat","type":"sgv","_id":"62890b36cf7ee10004a2b1d7","glucose":176,"avgDelta":"-0.25","BGI":-7.37,"deviation":"7.12"},{"device":"AndroidAPS-DexcomG6","date":1653104949000,"dateString":"2022-05-21T03:49:09.000Z","isValid":true,"sgv":155,"direction":"FortyFiveDown","type":"sgv","_id":"6288614942c1220004f9572c","glucose":155,"avgDelta":"-4.00","BGI":-11.12,"deviation":"7.12"},{"device":"AndroidAPS-DexcomG6","date":1653101648000,"dateString":"2022-05-21T02:54:08.000Z","isValid":true,"sgv":241,"direction":"SingleDown","type":"sgv","_id":"6288547f5151b5000462a1e6","glucose":241,"avgDelta":"-14.00","BGI":-21.16,"deviation":"7.16"},{"device":"AndroidAPS-DexcomG6","date":1653155049000,"dateString":"2022-05-21T17:44:09.000Z","isValid":true,"sgv":116,"direction":"NONE","type":"sgv","_id":"6289250d8809e60004c644dd","glucose":116,"avgDelta":"5.00","BGI":-2.16,"deviation":"7.16","uamAbsorption":"start"},{"device":"AndroidAPS-DexcomG6","date":1653173050000,"dateString":"2022-05-21T22:44:10.000Z","isValid":true,"sgv":115,"direction":"Flat","type":"sgv","_id":"62896f8537d09a00043f2b1a","glucose":115,"avgDelta":"-1.75","BGI":-9.05,"deviation":"7.30"},{"device":"AndroidAPS-DexcomG6","date":1653104049000,"dateString":"2022-05-21T03:34:09.000Z","isValid":true,"sgv":170,"direction":"FortyFiveDown","type":"sgv","_id":"62885dc3293f3e00042c31de","glucose":170,"avgDelta":"-5.75","BGI":-13.1,"deviation":"7.35"},{"device":"AndroidAPS-DexcomG6","date":1653106149000,"dateString":"2022-05-21T04:09:09.000Z","isValid":true,"sgv":151,"direction":"Flat","type":"sgv","_id":"6288660142c1220004f95736","glucose":151,"avgDelta":"-1.00","BGI":-8.36,"deviation":"7.36"}],"basalGlucoseData":[{"device":"AndroidAPS-DexcomG6","date":1653182050000,"dateString":"2022-05-22T01:14:10.000Z","isValid":true,"sgv":81,"direction":"FortyFiveDown","type":"sgv","_id":"62898e7650e51d0004429e63","glucose":81,"avgDelta":"-6.00","BGI":-1.68,"deviation":"-4.32"},{"device":"AndroidAPS-DexcomG6","date":1653182349000,"dateString":"2022-05-22T01:19:09.000Z","isValid":true,"sgv":77,"direction":"FortyFiveDown","type":"sgv","_id":"62898fa550e51d0004429e65","glucose":77,"avgDelta":"-5.00","BGI":-1.25,"deviation":"-3.75"},{"device":"AndroidAPS-DexcomG6","date":1653182650000,"dateString":"2022-05-22T01:24:10.000Z","isValid":true,"sgv":74,"direction":"FortyFiveDown","type":"sgv","_id":"628990d350e51d0004429e67","glucose":74,"avgDelta":"-4.50","BGI":-0.78,"deviation":"-3.72"},{"device":"AndroidAPS-DexcomG6","date":1653182949000,"dateString":"2022-05-22T01:29:09.000Z","isValid":true,"sgv":72,"direction":"Flat","type":"sgv","_id":"6289920150e51d0004429e69","glucose":72,"avgDelta":"-3.75","BGI":-0.3,"deviation":"-3.45"},{"device":"AndroidAPS-DexcomG6","date":1653116049000,"dateString":"2022-05-21T06:54:09.000Z","isValid":true,"sgv":69,"direction":"Flat","type":"sgv","_id":"62888ccc149196000412bf4f","glucose":69,"avgDelta":"-2.25","BGI":0.43,"deviation":"-2.68"},{"device":"AndroidAPS-DexcomG6","date":1653162549000,"dateString":"2022-05-21T19:49:09.000Z","isValid":true,"sgv":88,"direction":"Flat","type":"sgv","_id":"6289425f598f780004bb3b30","glucose":88,"avgDelta":"-1.50","BGI":1.12,"deviation":"-2.62"},{"device":"AndroidAPS-DexcomG6","date":1653115749000,"dateString":"2022-05-21T06:49:09.000Z","isValid":true,"sgv":70,"direction":"Flat","type":"sgv","_id":"62888b85149196000412bf4d","glucose":70,"avgDelta":"-2.50","BGI":0,"deviation":"-2.50"},{"device":"AndroidAPS-DexcomG6","date":1653162250000,"dateString":"2022-05-21T19:44:10.000Z","isValid":true,"sgv":89,"direction":"Flat","type":"sgv","_id":"62894118598f780004bb3b2d","glucose":89,"avgDelta":"-1.50","BGI":0.99,"deviation":"-2.49"},{"device":"AndroidAPS-DexcomG6","date":1653115149000,"dateString":"2022-05-21T06:39:09.000Z","isValid":true,"sgv":76,"direction":"Flat","type":"sgv","_id":"6288892a149196000412bf49","glucose":76,"avgDelta":"-3.25","BGI":-0.78,"deviation":"-2.47"},{"device":"AndroidAPS-DexcomG6","date":1653115449000,"dateString":"2022-05-21T06:44:09.000Z","isValid":true,"sgv":74,"direction":"Flat","type":"sgv","_id":"62888a57149196000412bf4b","glucose":74,"avgDelta":"-2.75","BGI":-0.34,"deviation":"-2.41"},{"device":"AndroidAPS-DexcomG6","date":1653161950000,"dateString":"2022-05-21T19:39:10.000Z","isValid":true,"sgv":91,"direction":"Flat","type":"sgv","_id":"62893feb598f780004bb3b2b","glucose":91,"avgDelta":"-1.50","BGI":0.86,"deviation":"-2.36"},{"device":"AndroidAPS-DexcomG6","date":1653116349000,"dateString":"2022-05-21T06:59:09.000Z","isValid":true,"sgv":70,"direction":"Flat","type":"sgv","_id":"62888de2149196000412bf51","glucose":70,"avgDelta":"-1.50","BGI":0.78,"deviation":"-2.28"},{"device":"AndroidAPS-DexcomG6","date":1653157149000,"dateString":"2022-05-21T18:19:09.000Z","isValid":true,"sgv":108,"direction":"Flat","type":"sgv","_id":"62892d34840d8d0004a20bf5","glucose":108,"avgDelta":"-3.75","BGI":-1.47,"deviation":"-2.28"},{"device":"AndroidAPS-DexcomG6","date":1653162850000,"dateString":"2022-05-21T19:54:10.000Z","isValid":true,"sgv":89,"direction":"Flat","type":"sgv","_id":"6289437f4493460004e63a25","glucose":89,"avgDelta":"-1.00","BGI":1.25,"deviation":"-2.25"},{"device":"AndroidAPS-DexcomG6","date":1653183249000,"dateString":"2022-05-22T01:34:09.000Z","isValid":true,"sgv":73,"direction":"Flat","type":"sgv","_id":"6289933050e51d0004429e6b","glucose":73,"avgDelta":"-2.00","BGI":0.22,"deviation":"-2.22"},{"device":"AndroidAPS-DexcomG6","date":1653114849000,"dateString":"2022-05-21T06:34:09.000Z","isValid":true,"sgv":78,"direction":"Flat","type":"sgv","_id":"628888018ff3530004dc6070","glucose":78,"avgDelta":"-3.25","BGI":-1.12,"deviation":"-2.13"},{"device":"AndroidAPS-DexcomG6","date":1653114549000,"dateString":"2022-05-21T06:29:09.000Z","isValid":true,"sgv":80,"direction":"Flat","type":"sgv","_id":"628886d28ff3530004dc606b","glucose":80,"avgDelta":"-3.50","BGI":-1.47,"deviation":"-2.03"},{"device":"AndroidAPS-DexcomG6","date":1653161649000,"dateString":"2022-05-21T19:34:09.000Z","isValid":true,"sgv":93,"direction":"Flat","type":"sgv","_id":"62893ed7598f780004bb3b29","glucose":93,"avgDelta":"-1.25","BGI":0.73,"deviation":"-1.98"},{"device":"AndroidAPS-DexcomG6","date":1653180549000,"dateString":"2022-05-22T00:49:09.000Z","isValid":true,"sgv":121,"direction":"FortyFiveDown","type":"sgv","_id":"628988a3da46aa0004d1e0f5","glucose":121,"avgDelta":"-5.25","BGI":-3.32,"deviation":"-1.93"},{"device":"AndroidAPS-DexcomG6","date":1653110348000,"dateString":"2022-05-21T05:19:08.000Z","isValid":true,"sgv":102,"direction":"FortyFiveDown","type":"sgv","_id":"62887677363e6c0004f710de","glucose":102,"avgDelta":"-6.75","BGI":-4.91,"deviation":"-1.84"},{"device":"AndroidAPS-DexcomG6","date":1653161350000,"dateString":"2022-05-21T19:29:10.000Z","isValid":true,"sgv":94,"direction":"Flat","type":"sgv","_id":"62893daa598f780004bb3b27","glucose":94,"avgDelta":"-1.00","BGI":0.65,"deviation":"-1.65"},{"device":"AndroidAPS-DexcomG6","date":1653157449000,"dateString":"2022-05-21T18:24:09.000Z","isValid":true,"sgv":108,"direction":"Flat","type":"sgv","_id":"62892e62840d8d0004a20bf8","glucose":108,"avgDelta":"-2.75","BGI":-1.21,"deviation":"-1.54"},{"device":"AndroidAPS-DexcomG6","date":1653158649000,"dateString":"2022-05-21T18:44:09.000Z","isValid":true,"sgv":101,"direction":"Flat","type":"sgv","_id":"6289331c22fbc8000495b813","glucose":101,"avgDelta":"-1.75","BGI":-0.3,"deviation":"-1.45"},{"device":"AndroidAPS-DexcomG6","date":1653163150000,"dateString":"2022-05-21T19:59:10.000Z","isValid":true,"sgv":91,"direction":"Flat","type":"sgv","_id":"628944ae4493460004e63a27","glucose":91,"avgDelta":"0.00","BGI":1.38,"deviation":"-1.38"},{"device":"AndroidAPS-DexcomG6","date":1653161049000,"dateString":"2022-05-21T19:24:09.000Z","isValid":true,"sgv":95,"direction":"Flat","type":"sgv","_id":"62893c7d598f780004bb3b24","glucose":95,"avgDelta":"-0.75","BGI":0.6,"deviation":"-1.35"},{"device":"AndroidAPS-DexcomG6","date":1653158949000,"dateString":"2022-05-21T18:49:09.000Z","isValid":true,"sgv":100,"direction":"Flat","type":"sgv","_id":"6289344a22fbc8000495b815","glucose":100,"avgDelta":"-1.50","BGI":-0.17,"deviation":"-1.33"},{"device":"AndroidAPS-DexcomG6","date":1653159249000,"dateString":"2022-05-21T18:54:09.000Z","isValid":true,"sgv":99,"direction":"Flat","type":"sgv","_id":"6289357622fbc8000495b818","glucose":99,"avgDelta":"-1.25","BGI":-0.04,"deviation":"-1.21"},{"device":"AndroidAPS-DexcomG6","date":1653116649000,"dateString":"2022-05-21T07:04:09.000Z","isValid":true,"sgv":74,"direction":"Flat","type":"sgv","_id":"62888f0f149196000412bf54","glucose":74,"avgDelta":"0.00","BGI":1.12,"deviation":"-1.12"},{"device":"AndroidAPS-DexcomG6","date":1653131049000,"dateString":"2022-05-21T11:04:09.000Z","isValid":true,"sgv":81,"direction":"Flat","type":"sgv","_id":"6288c7418e9ed800049b39e3","glucose":81,"avgDelta":"-3.00","BGI":-1.9,"deviation":"-1.10"},{"device":"AndroidAPS-DexcomG6","date":1653157750000,"dateString":"2022-05-21T18:29:10.000Z","isValid":true,"sgv":106,"direction":"Flat","type":"sgv","_id":"62892f8f840d8d0004a20bfa","glucose":106,"avgDelta":"-2.00","BGI":-0.95,"deviation":"-1.05"},{"device":"AndroidAPS-DexcomG6","date":1653152949000,"dateString":"2022-05-21T17:09:09.000Z","isValid":true,"sgv":138,"direction":"FortyFiveDown","type":"sgv","_id":"62891cd01090500004ca471f","glucose":138,"avgDelta":"-5.25","BGI":-4.22,"deviation":"-1.03"},{"device":"AndroidAPS-DexcomG6","date":1653158349000,"dateString":"2022-05-21T18:39:09.000Z","isValid":true,"sgv":102,"direction":"Flat","type":"sgv","_id":"628931e9840d8d0004a20bff","glucose":102,"avgDelta":"-1.50","BGI":-0.47,"deviation":"-1.03"},{"device":"AndroidAPS-DexcomG6","date":1653160749000,"dateString":"2022-05-21T19:19:09.000Z","isValid":true,"sgv":97,"direction":"Flat","type":"sgv","_id":"62893b4f598f780004bb3b22","glucose":97,"avgDelta":"-0.50","BGI":0.52,"deviation":"-1.02"},{"device":"AndroidAPS-DexcomG6","date":1653131349000,"dateString":"2022-05-21T11:09:09.000Z","isValid":true,"sgv":82,"direction":"Flat","type":"sgv","_id":"6288c86f8e9ed800049b39e5","glucose":82,"avgDelta":"-2.25","BGI":-1.25,"deviation":"-1.00"},{"device":"AndroidAPS-DexcomG6","date":1653183550000,"dateString":"2022-05-22T01:39:10.000Z","isValid":true,"sgv":76,"direction":"Flat","type":"sgv","_id":"6289945f50e51d0004429e6d","glucose":76,"avgDelta":"-0.25","BGI":0.69,"deviation":"-0.94"},{"device":"AndroidAPS-DexcomG6","date":1653159849000,"dateString":"2022-05-21T19:04:09.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"628937b822fbc8000495b81d","glucose":98,"avgDelta":"-0.75","BGI":0.17,"deviation":"-0.92"},{"device":"AndroidAPS-DexcomG6","date":1653158049000,"dateString":"2022-05-21T18:34:09.000Z","isValid":true,"sgv":104,"direction":"Flat","type":"sgv","_id":"628930bc840d8d0004a20bfd","glucose":104,"avgDelta":"-1.50","BGI":-0.69,"deviation":"-0.81"},{"device":"AndroidAPS-DexcomG6","date":1653160150000,"dateString":"2022-05-21T19:09:10.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"628938fe22fbc8000495b81f","glucose":98,"avgDelta":"-0.50","BGI":0.3,"deviation":"-0.80"},{"device":"AndroidAPS-DexcomG6","date":1653159549000,"dateString":"2022-05-21T18:59:09.000Z","isValid":true,"sgv":99,"direction":"Flat","type":"sgv","_id":"628936a422fbc8000495b81a","glucose":99,"avgDelta":"-0.75","BGI":0.04,"deviation":"-0.79"},{"device":"AndroidAPS-DexcomG6","date":1653160449000,"dateString":"2022-05-21T19:14:09.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"62893a1222fbc8000495b822","glucose":98,"avgDelta":"-0.25","BGI":0.43,"deviation":"-0.68"},{"device":"AndroidAPS-DexcomG6","date":1653117848000,"dateString":"2022-05-21T07:24:08.000Z","isValid":true,"sgv":82,"direction":"Flat","type":"sgv","_id":"628893bd7ff1e700040f17c9","glucose":82,"avgDelta":"2.00","BGI":2.37,"deviation":"-0.37"},{"device":"AndroidAPS-DexcomG6","date":1653107948000,"dateString":"2022-05-21T04:39:08.000Z","isValid":true,"sgv":124,"direction":"FortyFiveDown","type":"sgv","_id":"62886cfc19e2e60004989bb8","glucose":124,"avgDelta":"-8.25","BGI":-7.89,"deviation":"-0.36"},{"device":"AndroidAPS-DexcomG6","date":1653156549000,"dateString":"2022-05-21T18:09:09.000Z","isValid":true,"sgv":114,"direction":"Flat","type":"sgv","_id":"62892af2840d8d0004a20bf0","glucose":114,"avgDelta":"-2.25","BGI":-1.9,"deviation":"-0.35"},{"device":"AndroidAPS-DexcomG6","date":1653184450000,"dateString":"2022-05-22T01:54:10.000Z","isValid":true,"sgv":80,"direction":"Flat","type":"sgv","_id":"628997d861a8290004740385","glucose":80,"avgDelta":"1.75","BGI":1.9,"deviation":"-0.15"},{"device":"AndroidAPS-DexcomG6","date":1653118149000,"dateString":"2022-05-21T07:29:09.000Z","isValid":true,"sgv":86,"direction":"Flat","type":"sgv","_id":"628894d37ff1e700040f17cd","glucose":86,"avgDelta":"2.50","BGI":2.63,"deviation":"-0.13"},{"device":"AndroidAPS-DexcomG6","date":1653163449000,"dateString":"2022-05-21T20:04:09.000Z","isValid":true,"sgv":95,"direction":"Flat","type":"sgv","_id":"628945dc4493460004e63a2a","glucose":95,"avgDelta":"1.50","BGI":1.51,"deviation":"-0.01"},{"device":"AndroidAPS-DexcomG6","date":1653183850000,"dateString":"2022-05-22T01:44:10.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","_id":"6289957b61a829000474037f","glucose":79,"avgDelta":"1.25","BGI":1.12,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653116949000,"dateString":"2022-05-21T07:09:09.000Z","isValid":true,"sgv":76,"direction":"Flat","type":"sgv","_id":"62889024149196000412bf57","glucose":76,"avgDelta":"1.50","BGI":1.47,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653135249000,"dateString":"2022-05-21T12:14:09.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","_id":"6288d7ae0f1be700041e59de","glucose":79,"avgDelta":"0.00","BGI":-27.76,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653135549000,"dateString":"2022-05-21T12:19:09.000Z","isValid":true,"sgv":78,"direction":"Flat","type":"sgv","_id":"6288d8e00f1be700041e59e0","glucose":78,"avgDelta":"0.50","BGI":-27.02,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653137049000,"dateString":"2022-05-21T12:44:09.000Z","isValid":true,"sgv":69,"direction":"Flat","type":"sgv","_id":"6288df8a0f1be700041e59ec","glucose":69,"avgDelta":"-1.75","BGI":-20.95,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653134349000,"dateString":"2022-05-21T11:59:09.000Z","isValid":true,"sgv":76,"direction":"FortyFiveDown","type":"sgv","_id":"6288d4220f1be700041e59d5","glucose":76,"avgDelta":"-9.50","BGI":-28.06,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653135849000,"dateString":"2022-05-21T12:24:09.000Z","isValid":true,"sgv":76,"direction":"Flat","type":"sgv","_id":"6288d9fb0f1be700041e59e2","glucose":76,"avgDelta":"-0.25","BGI":-26.12,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653137350000,"dateString":"2022-05-21T12:49:10.000Z","isValid":true,"sgv":72,"direction":"Flat","type":"sgv","_id":"6288dfd60f1be700041e59ee","glucose":72,"avgDelta":"-0.25","BGI":-19.52,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653136149000,"dateString":"2022-05-21T12:29:09.000Z","isValid":true,"sgv":73,"direction":"Flat","type":"sgv","_id":"6288db8a0f1be700041e59e5","glucose":73,"avgDelta":"-1.25","BGI":-25,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653137649000,"dateString":"2022-05-21T12:54:09.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","_id":"6288e1040f1be700041e59f0","glucose":79,"avgDelta":"2.25","BGI":-18.02,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653136449000,"dateString":"2022-05-21T12:34:09.000Z","isValid":true,"sgv":70,"direction":"Flat","type":"sgv","_id":"6288dd270f1be700041e59e8","glucose":70,"avgDelta":"-2.25","BGI":-23.7,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653134649000,"dateString":"2022-05-21T12:04:09.000Z","isValid":true,"sgv":77,"direction":"Flat","type":"sgv","_id":"6288d5500f1be700041e59d7","glucose":77,"avgDelta":"-6.00","BGI":-28.32,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653134949000,"dateString":"2022-05-21T12:09:09.000Z","isValid":true,"sgv":78,"direction":"Flat","type":"sgv","_id":"6288d67f0f1be700041e59da","glucose":78,"avgDelta":"-2.25","BGI":-28.14,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653136749000,"dateString":"2022-05-21T12:39:09.000Z","isValid":true,"sgv":68,"direction":"Flat","type":"sgv","_id":"6288de580f1be700041e59ea","glucose":68,"avgDelta":"-2.50","BGI":-22.37,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653117249000,"dateString":"2022-05-21T07:14:09.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","_id":"628891627ff1e700040f17c6","glucose":79,"avgDelta":"2.50","BGI":1.77,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653134049000,"dateString":"2022-05-21T11:54:09.000Z","isValid":true,"sgv":79,"direction":"FortyFiveDown","type":"sgv","_id":"6288d3060f1be700041e59d2","glucose":79,"avgDelta":"-10.50","BGI":-27.28,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653130748000,"dateString":"2022-05-21T10:59:08.000Z","isValid":true,"sgv":84,"direction":"Flat","type":"sgv","_id":"6288c61a1991280004dce468","glucose":84,"avgDelta":"-2.50","BGI":-2.59,"deviation":"0.09"},{"device":"AndroidAPS-DexcomG6","date":1653110049000,"dateString":"2022-05-21T05:14:09.000Z","isValid":true,"sgv":109,"direction":"FortyFiveDown","type":"sgv","_id":"62887549363e6c0004f710dc","glucose":109,"avgDelta":"-5.25","BGI":-5.34,"deviation":"0.09"},{"device":"AndroidAPS-DexcomG6","date":1653117549000,"dateString":"2022-05-21T07:19:09.000Z","isValid":true,"sgv":80,"direction":"Flat","type":"sgv","_id":"628892907ff1e700040f17c7","glucose":80,"avgDelta":"2.50","BGI":2.11,"deviation":"0.39"},{"device":"AndroidAPS-DexcomG6","date":1653118449000,"dateString":"2022-05-21T07:34:09.000Z","isValid":true,"sgv":92,"direction":"Flat","type":"sgv","_id":"6288961d7ff1e700040f17ce","glucose":92,"avgDelta":"3.25","BGI":2.84,"deviation":"0.41"},{"device":"AndroidAPS-DexcomG6","date":1653184150000,"dateString":"2022-05-22T01:49:10.000Z","isValid":true,"sgv":80,"direction":"Flat","type":"sgv","_id":"628996a961a8290004740382","glucose":80,"avgDelta":"2.00","BGI":1.55,"deviation":"0.45"},{"device":"AndroidAPS-DexcomG6","date":1653131649000,"dateString":"2022-05-21T11:14:09.000Z","isValid":true,"sgv":89,"direction":"Flat","type":"sgv","_id":"6288c99e8e9ed800049b39e8","glucose":89,"avgDelta":"0.25","BGI":-0.65,"deviation":"0.90"},{"device":"AndroidAPS-DexcomG6","date":1653118748000,"dateString":"2022-05-21T07:39:08.000Z","isValid":true,"sgv":97,"direction":"Flat","type":"sgv","_id":"628897357ff1e700040f17d3","glucose":97,"avgDelta":"4.25","BGI":3.06,"deviation":"1.19"},{"device":"AndroidAPS-DexcomG6","date":1653130448000,"dateString":"2022-05-21T10:54:08.000Z","isValid":true,"sgv":88,"direction":"Flat","type":"sgv","_id":"6288c4ec1991280004dce464","glucose":88,"avgDelta":"-2.00","BGI":-3.36,"deviation":"1.36"},{"device":"AndroidAPS-DexcomG6","date":1653163749000,"dateString":"2022-05-21T20:09:09.000Z","isValid":true,"sgv":100,"direction":"Flat","type":"sgv","_id":"6289470c4493460004e63a2d","glucose":100,"avgDelta":"3.00","BGI":1.55,"deviation":"1.45"},{"device":"AndroidAPS-DexcomG6","date":1653151149000,"dateString":"2022-05-21T16:39:09.000Z","isValid":true,"sgv":158,"direction":"Flat","type":"sgv","_id":"628915ce1090500004ca470c","glucose":158,"avgDelta":"-3.50","BGI":-5.09,"deviation":"1.59"},{"device":"AndroidAPS-DexcomG6","date":1653180250000,"dateString":"2022-05-22T00:44:10.000Z","isValid":true,"sgv":135,"direction":"Flat","type":"sgv","_id":"62898774da46aa0004d1e0f1","glucose":135,"avgDelta":"-1.75","BGI":-3.49,"deviation":"1.74"},{"device":"AndroidAPS-DexcomG6","date":1653151449000,"dateString":"2022-05-21T16:44:09.000Z","isValid":true,"sgv":158,"direction":"Flat","type":"sgv","_id":"628916f81090500004ca4710","glucose":158,"avgDelta":"-3.00","BGI":-4.74,"deviation":"1.74"},{"device":"AndroidAPS-DexcomG6","date":1653152649000,"dateString":"2022-05-21T17:04:09.000Z","isValid":true,"sgv":149,"direction":"Flat","type":"sgv","_id":"62891ba31090500004ca471d","glucose":149,"avgDelta":"-2.25","BGI":-4.35,"deviation":"2.10"},{"device":"AndroidAPS-DexcomG6","date":1653130149000,"dateString":"2022-05-21T10:49:09.000Z","isValid":true,"sgv":91,"direction":"Flat","type":"sgv","_id":"6288c3be1991280004dce461","glucose":91,"avgDelta":"-2.00","BGI":-4.27,"deviation":"2.27"},{"device":"AndroidAPS-DexcomG6","date":1653107648000,"dateString":"2022-05-21T04:34:08.000Z","isValid":true,"sgv":132,"direction":"FortyFiveDown","type":"sgv","_id":"62886be719e2e60004989bb5","glucose":132,"avgDelta":"-5.75","BGI":-8.1,"deviation":"2.35"},{"device":"AndroidAPS-DexcomG6","date":1653150849000,"dateString":"2022-05-21T16:34:09.000Z","isValid":true,"sgv":161,"direction":"Flat","type":"sgv","_id":"628914d01090500004ca4709","glucose":161,"avgDelta":"-3.00","BGI":-5.47,"deviation":"2.47"},{"device":"AndroidAPS-DexcomG6","date":1653179350000,"dateString":"2022-05-22T00:29:10.000Z","isValid":true,"sgv":142,"direction":"Flat","type":"sgv","_id":"628983f69d6f1800047cd0dd","glucose":142,"avgDelta":"-1.75","BGI":-4.27,"deviation":"2.52"},{"device":"AndroidAPS-DexcomG6","date":1653179050000,"dateString":"2022-05-22T00:24:10.000Z","isValid":true,"sgv":142,"direction":"Flat","type":"sgv","_id":"628982c89d6f1800047cd0db","glucose":142,"avgDelta":"-1.75","BGI":-4.48,"deviation":"2.73"},{"device":"AndroidAPS-DexcomG6","date":1653156250000,"dateString":"2022-05-21T18:04:10.000Z","isValid":true,"sgv":119,"direction":"Flat","type":"sgv","_id":"628929ac8809e60004c644e9","glucose":119,"avgDelta":"0.75","BGI":-2.07,"deviation":"2.82"},{"device":"AndroidAPS-DexcomG6","date":1653109748000,"dateString":"2022-05-21T05:09:08.000Z","isValid":true,"sgv":117,"direction":"Flat","type":"sgv","_id":"6288741c363e6c0004f710d9","glucose":117,"avgDelta":"-2.75","BGI":-5.73,"deviation":"2.98"},{"device":"AndroidAPS-DexcomG6","date":1653119049000,"dateString":"2022-05-21T07:44:09.000Z","isValid":true,"sgv":105,"direction":"FortyFiveUp","type":"sgv","_id":"628898627ff1e700040f17d5","glucose":105,"avgDelta":"5.75","BGI":2.76,"deviation":"2.99"},{"device":"AndroidAPS-DexcomG6","date":1653179649000,"dateString":"2022-05-22T00:34:09.000Z","isValid":true,"sgv":143,"direction":"Flat","type":"sgv","_id":"62898517da46aa0004d1e0ea","glucose":143,"avgDelta":"-1.00","BGI":-4.01,"deviation":"3.01"},{"device":"AndroidAPS-DexcomG6","date":1653151749000,"dateString":"2022-05-21T16:49:09.000Z","isValid":true,"sgv":159,"direction":"Flat","type":"sgv","_id":"628918261090500004ca4714","glucose":159,"avgDelta":"-1.50","BGI":-4.53,"deviation":"3.03"},{"device":"AndroidAPS-DexcomG6","date":1653129848000,"dateString":"2022-05-21T10:44:08.000Z","isValid":true,"sgv":93,"direction":"Flat","type":"sgv","_id":"6288c2911991280004dce45e","glucose":93,"avgDelta":"-2.00","BGI":-5.26,"deviation":"3.26"},{"device":"AndroidAPS-DexcomG6","date":1653173650000,"dateString":"2022-05-21T22:54:10.000Z","isValid":true,"sgv":108,"direction":"Flat","type":"sgv","_id":"6289717d37d09a00043f2b1e","glucose":108,"avgDelta":"-4.00","BGI":-7.28,"deviation":"3.28"},{"device":"AndroidAPS-DexcomG6","date":1653173949000,"dateString":"2022-05-21T22:59:09.000Z","isValid":true,"sgv":108,"direction":"Flat","type":"sgv","_id":"6289721437d09a00043f2b1f","glucose":108,"avgDelta":"-3.00","BGI":-6.42,"deviation":"3.42"},{"device":"AndroidAPS-DexcomG6","date":1653150549000,"dateString":"2022-05-21T16:29:09.000Z","isValid":true,"sgv":165,"direction":"Flat","type":"sgv","_id":"628913731090500004ca4706","glucose":165,"avgDelta":"-2.25","BGI":-5.73,"deviation":"3.48"},{"device":"AndroidAPS-DexcomG6","date":1653164049000,"dateString":"2022-05-21T20:14:09.000Z","isValid":true,"sgv":109,"direction":"Flat","type":"sgv","_id":"628948214493460004e63a31","glucose":109,"avgDelta":"5.00","BGI":1.51,"deviation":"3.49"},{"device":"AndroidAPS-DexcomG6","date":1653179949000,"dateString":"2022-05-22T00:39:09.000Z","isValid":true,"sgv":143,"direction":"Flat","type":"sgv","_id":"62898645da46aa0004d1e0ee","glucose":143,"avgDelta":"-0.25","BGI":-3.75,"deviation":"3.50"},{"device":"AndroidAPS-DexcomG6","date":1653131948000,"dateString":"2022-05-21T11:19:08.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"6288cacb8e9ed800049b39ec","glucose":98,"avgDelta":"3.50","BGI":-0.3,"deviation":"3.80"},{"device":"AndroidAPS-DexcomG6","date":1653178750000,"dateString":"2022-05-22T00:19:10.000Z","isValid":true,"sgv":144,"direction":"Flat","type":"sgv","_id":"628981999d6f1800047cd0d8","glucose":144,"avgDelta":"-0.75","BGI":-4.57,"deviation":"3.82"},{"device":"AndroidAPS-DexcomG6","date":1653129548000,"dateString":"2022-05-21T10:39:08.000Z","isValid":true,"sgv":94,"direction":"Flat","type":"sgv","_id":"6288c1631991280004dce45b","glucose":94,"avgDelta":"-2.50","BGI":-6.38,"deviation":"3.88"},{"device":"AndroidAPS-DexcomG6","date":1653129249000,"dateString":"2022-05-21T10:34:09.000Z","isValid":true,"sgv":96,"direction":"Flat","type":"sgv","_id":"6288c0341991280004dce459","glucose":96,"avgDelta":"-3.50","BGI":-7.59,"deviation":"4.09"},{"device":"AndroidAPS-DexcomG6","date":1653152049000,"dateString":"2022-05-21T16:54:09.000Z","isValid":true,"sgv":160,"direction":"Flat","type":"sgv","_id":"628919531090500004ca4717","glucose":160,"avgDelta":"-0.25","BGI":-4.35,"deviation":"4.10"},{"device":"AndroidAPS-DexcomG6","date":1653152349000,"dateString":"2022-05-21T16:59:09.000Z","isValid":true,"sgv":158,"direction":"Flat","type":"sgv","_id":"62891a811090500004ca471a","glucose":158,"avgDelta":"0.00","BGI":-4.35,"deviation":"4.35"},{"device":"AndroidAPS-DexcomG6","date":1653150249000,"dateString":"2022-05-21T16:24:09.000Z","isValid":true,"sgv":170,"direction":"Flat","type":"sgv","_id":"628913111090500004ca4704","glucose":170,"avgDelta":"-1.50","BGI":-5.95,"deviation":"4.45"},{"device":"AndroidAPS-DexcomG6","date":1653105549000,"dateString":"2022-05-21T03:59:09.000Z","isValid":true,"sgv":146,"direction":"FortyFiveDown","type":"sgv","_id":"628863a542c1220004f95730","glucose":146,"avgDelta":"-5.25","BGI":-9.87,"deviation":"4.62"},{"device":"AndroidAPS-DexcomG6","date":1653119349000,"dateString":"2022-05-21T07:49:09.000Z","isValid":true,"sgv":114,"direction":"FortyFiveUp","type":"sgv","_id":"628899957ff1e700040f17d7","glucose":114,"avgDelta":"7.00","BGI":2.37,"deviation":"4.63"},{"device":"AndroidAPS-DexcomG6","date":1653173350000,"dateString":"2022-05-21T22:49:10.000Z","isValid":true,"sgv":110,"direction":"Flat","type":"sgv","_id":"62896fb837d09a00043f2b1b","glucose":110,"avgDelta":"-3.50","BGI":-8.15,"deviation":"4.65"},{"device":"AndroidAPS-DexcomG6","date":1653174249000,"dateString":"2022-05-21T23:04:09.000Z","isValid":true,"sgv":111,"direction":"Flat","type":"sgv","_id":"6289726037d09a00043f2b20","glucose":111,"avgDelta":"-1.00","BGI":-5.69,"deviation":"4.69"},{"device":"AndroidAPS-DexcomG6","date":1653178449000,"dateString":"2022-05-22T00:14:09.000Z","isValid":true,"sgv":147,"direction":"Flat","type":"sgv","_id":"6289806a9d6f1800047cd0d6","glucose":147,"avgDelta":"0.25","BGI":-4.61,"deviation":"4.86"},{"device":"AndroidAPS-DexcomG6","date":1653128948000,"dateString":"2022-05-21T10:29:08.000Z","isValid":true,"sgv":99,"direction":"Flat","type":"sgv","_id":"6288bf061991280004dce457","glucose":99,"avgDelta":"-4.00","BGI":-8.88,"deviation":"4.88"},{"device":"AndroidAPS-DexcomG6","date":1653103448000,"dateString":"2022-05-21T03:24:08.000Z","isValid":true,"sgv":174,"direction":"SingleDown","type":"sgv","_id":"62885b81293f3e00042c31d9","glucose":174,"avgDelta":"-10.50","BGI":-15.43,"deviation":"4.93"},{"device":"AndroidAPS-DexcomG6","date":1653149949000,"dateString":"2022-05-21T16:19:09.000Z","isValid":true,"sgv":172,"direction":"Flat","type":"sgv","_id":"6289130f1090500004ca46ff","glucose":172,"avgDelta":"-1.00","BGI":-6.12,"deviation":"5.12"},{"device":"AndroidAPS-DexcomG6","date":1653105848000,"dateString":"2022-05-21T04:04:08.000Z","isValid":true,"sgv":146,"direction":"Flat","type":"sgv","_id":"628864d342c1220004f95733","glucose":146,"avgDelta":"-4.00","BGI":-9.14,"deviation":"5.14"},{"device":"AndroidAPS-DexcomG6","date":1653103149000,"dateString":"2022-05-21T03:19:09.000Z","isValid":true,"sgv":182,"direction":"SingleDown","type":"sgv","_id":"62885a52293f3e00042c31d7","glucose":182,"avgDelta":"-11.50","BGI":-16.64,"deviation":"5.14"},{"device":"AndroidAPS-DexcomG6","date":1653105248000,"dateString":"2022-05-21T03:54:08.000Z","isValid":true,"sgv":149,"direction":"FortyFiveDown","type":"sgv","_id":"6288629042c1220004f9572e","glucose":149,"avgDelta":"-5.25","BGI":-10.56,"deviation":"5.31"},{"device":"AndroidAPS-DexcomG6","date":1653176050000,"dateString":"2022-05-21T23:34:10.000Z","isValid":true,"sgv":127,"direction":"Flat","type":"sgv","_id":"6289771371a363000480abc1","glucose":127,"avgDelta":"2.50","BGI":-2.93,"deviation":"5.43"},{"device":"AndroidAPS-DexcomG6","date":1653176350000,"dateString":"2022-05-21T23:39:10.000Z","isValid":true,"sgv":132,"direction":"Flat","type":"sgv","_id":"6289784271a363000480abc3","glucose":132,"avgDelta":"3.00","BGI":-2.67,"deviation":"5.67"},{"device":"AndroidAPS-DexcomG6","date":1653149650000,"dateString":"2022-05-21T16:14:10.000Z","isValid":true,"sgv":173,"direction":"Flat","type":"sgv","_id":"62890fff1090500004ca46fd","glucose":173,"avgDelta":"-0.75","BGI":-6.42,"deviation":"5.67"},{"device":"AndroidAPS-DexcomG6","date":1653175750000,"dateString":"2022-05-21T23:29:10.000Z","isValid":true,"sgv":124,"direction":"Flat","type":"sgv","_id":"628975e471a363000480abbe","glucose":124,"avgDelta":"2.50","BGI":-3.19,"deviation":"5.69"},{"device":"AndroidAPS-DexcomG6","date":1653102848000,"dateString":"2022-05-21T03:14:08.000Z","isValid":true,"sgv":193,"direction":"SingleDown","type":"sgv","_id":"62885924293f3e00042c31d5","glucose":193,"avgDelta":"-12.00","BGI":-17.71,"deviation":"5.71"},{"device":"AndroidAPS-DexcomG6","date":1653128649000,"dateString":"2022-05-21T10:24:09.000Z","isValid":true,"sgv":101,"direction":"Flat","type":"sgv","_id":"6288bde0abbef90004616cf8","glucose":101,"avgDelta":"-4.50","BGI":-10.3,"deviation":"5.80"},{"device":"AndroidAPS-DexcomG6","date":1653164350000,"dateString":"2022-05-21T20:19:10.000Z","isValid":true,"sgv":120,"direction":"FortyFiveUp","type":"sgv","_id":"6289496a4493460004e63a34","glucose":120,"avgDelta":"7.25","BGI":1.34,"deviation":"5.91"},{"device":"AndroidAPS-DexcomG6","date":1653155950000,"dateString":"2022-05-21T17:59:10.000Z","isValid":true,"sgv":123,"direction":"Flat","type":"sgv","_id":"6289287e8809e60004c644e6","glucose":123,"avgDelta":"3.75","BGI":-2.16,"deviation":"5.91"},{"device":"AndroidAPS-DexcomG6","date":1653174550000,"dateString":"2022-05-21T23:09:10.000Z","isValid":true,"sgv":114,"direction":"Flat","type":"sgv","_id":"6289727937d09a00043f2b21","glucose":114,"avgDelta":"1.00","BGI":-4.96,"deviation":"5.96"},{"device":"AndroidAPS-DexcomG6","date":1653178149000,"dateString":"2022-05-22T00:09:09.000Z","isValid":true,"sgv":149,"direction":"Flat","type":"sgv","_id":"62897f3b9d6f1800047cd0d3","glucose":149,"avgDelta":"1.50","BGI":-4.48,"deviation":"5.98"},{"device":"AndroidAPS-DexcomG6","date":1653103748000,"dateString":"2022-05-21T03:29:08.000Z","isValid":true,"sgv":171,"direction":"FortyFiveDown","type":"sgv","_id":"62885c95293f3e00042c31db","glucose":171,"avgDelta":"-8.25","BGI":-14.31,"deviation":"6.06"},{"device":"AndroidAPS-DexcomG6","date":1653108848000,"dateString":"2022-05-21T04:54:08.000Z","isValid":true,"sgv":130,"direction":"Flat","type":"sgv","_id":"62887093363e6c0004f710cf","glucose":130,"avgDelta":"-0.50","BGI":-6.72,"deviation":"6.22","uamAbsorption":"start"},{"device":"AndroidAPS-DexcomG6","date":1653175450000,"dateString":"2022-05-21T23:24:10.000Z","isValid":true,"sgv":123,"direction":"Flat","type":"sgv","_id":"628974b671a363000480abbc","glucose":123,"avgDelta":"3.00","BGI":-3.4,"deviation":"6.40"},{"device":"AndroidAPS-DexcomG6","date":1653107348000,"dateString":"2022-05-21T04:29:08.000Z","isValid":true,"sgv":144,"direction":"Flat","type":"sgv","_id":"62886ab919e2e60004989bb3","glucose":144,"avgDelta":"-1.75","BGI":-8.19,"deviation":"6.44"},{"device":"AndroidAPS-DexcomG6","date":1653102548000,"dateString":"2022-05-21T03:09:08.000Z","isValid":true,"sgv":204,"direction":"SingleDown","type":"sgv","_id":"628857f7293f3e00042c31d3","glucose":204,"avgDelta":"-12.25","BGI":-18.79,"deviation":"6.54"},{"device":"AndroidAPS-DexcomG6","date":1653109448000,"dateString":"2022-05-21T05:04:08.000Z","isValid":true,"sgv":125,"direction":"Flat","type":"sgv","_id":"628872ef363e6c0004f710d6","glucose":125,"avgDelta":"0.50","BGI":-6.08,"deviation":"6.58"},{"device":"AndroidAPS-DexcomG6","date":1653176650000,"dateString":"2022-05-21T23:44:10.000Z","isValid":true,"sgv":139,"direction":"Flat","type":"sgv","_id":"6289797071a363000480abc7","glucose":139,"avgDelta":"4.00","BGI":-2.59,"deviation":"6.59"},{"device":"AndroidAPS-DexcomG6","date":1653174850000,"dateString":"2022-05-21T23:14:10.000Z","isValid":true,"sgv":117,"direction":"Flat","type":"sgv","_id":"6289727a37d09a00043f2b22","glucose":117,"avgDelta":"2.25","BGI":-4.35,"deviation":"6.60"},{"device":"AndroidAPS-DexcomG6","date":1653149349000,"dateString":"2022-05-21T16:09:09.000Z","isValid":true,"sgv":174,"direction":"Flat","type":"sgv","_id":"62890edacf7ee10004a2b1e2","glucose":174,"avgDelta":"0.00","BGI":-6.64,"deviation":"6.64"}]} diff --git a/app/src/test/res/autotune/test2/autotune.2022-06-25-111214.log b/app/src/test/res/autotune/test2/autotune.2022-06-25-111214.log new file mode 100644 index 0000000000..8fafb15fc4 --- /dev/null +++ b/app/src/test/res/autotune/test2/autotune.2022-06-25-111214.log @@ -0,0 +1,420 @@ +Autotune disk usage: +160K . +Overall disk used/avail: +Filesystem Size Used Avail Use% Mounted on +rootfs 930G 431G 500G 47% / +Grabbing AAPS treatments.json and entries/sgv.json for date range... +oref0-autotune-prep ns-treatments.2022-05-21.json profile.json ns-entries.2022-05-21.json profile.pump.json > autotune.2022-05-21.json +start uannnounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -16.9 IOB: 5.249 Activity: 0.0391 at 04:24:08 dev: 26.10 avgDelta: 9.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -18.9 IOB: 5.292 Activity: 0.0438 at 04:29:08 dev: 27.88 avgDelta: 9.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -20.3 IOB: 4.964 Activity: 0.047 at 04:34:09 dev: 24.01 avgDelta: 3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -21.1 IOB: 4.674 Activity: 0.0489 at 04:39:08 dev: 17.83 avgDelta: -3.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -21.5 IOB: 4.377 Activity: 0.0498 at 04:44:08 dev: 11.21 avgDelta: -10.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -21.5 IOB: 4.077 Activity: 0.0498 at 04:49:08 dev: 7.96 avgDelta: -13.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -21.2 IOB: 3.73 Activity: 0.0491 at 04:54:08 dev: 7.16 avgDelta: -14.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -20.5 IOB: 3.389 Activity: 0.0476 at 04:59:08 dev: 6.77 avgDelta: -13.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -19.7 IOB: 3.055 Activity: 0.0457 at 05:04:09 dev: 6.95 avgDelta: -12.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -18.8 IOB: 2.782 Activity: 0.0436 at 05:09:08 dev: 6.54 avgDelta: -12.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -17.7 IOB: 2.47 Activity: 0.0411 at 05:14:08 dev: 5.71 avgDelta: -12.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -16.6 IOB: 2.22 Activity: 0.0386 at 05:19:09 dev: 5.14 avgDelta: -11.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -15.4 IOB: 1.935 Activity: 0.0358 at 05:24:08 dev: 4.93 avgDelta: -10.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -14.3 IOB: 1.711 Activity: 0.0332 at 05:29:08 dev: 6.06 avgDelta: -8.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -13.1 IOB: 1.452 Activity: 0.0304 at 05:34:09 dev: 7.35 avgDelta: -5.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -12.1 IOB: 1.927 Activity: 0.028 at 05:39:09 dev: 8.32 avgDelta: -3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -11.6 IOB: 1.84 Activity: 0.027 at 05:44:08 dev: 8.64 avgDelta: -3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -11.1 IOB: 1.658 Activity: 0.0258 at 05:49:09 dev: 7.12 avgDelta: -4.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -10.6 IOB: 1.482 Activity: 0.0245 at 05:54:08 dev: 5.31 avgDelta: -5.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -9.9 IOB: 1.264 Activity: 0.0229 at 05:59:09 dev: 4.62 avgDelta: -5.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -9.1 IOB: 1.104 Activity: 0.0212 at 06:04:08 dev: 5.14 avgDelta: -4.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -8.4 IOB: 0.952 Activity: 0.0194 at 06:09:09 dev: 7.36 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -7.8 IOB: 1.619 Activity: 0.0181 at 06:14:09 dev: 9.30 avgDelta: 1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -7.9 IOB: 1.678 Activity: 0.0184 at 06:19:09 dev: 10.68 avgDelta: 2.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -8.1 IOB: 1.775 Activity: 0.0187 at 06:24:08 dev: 9.81 avgDelta: 1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -8.2 IOB: 1.581 Activity: 0.019 at 06:29:08 dev: 6.44 avgDelta: -1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -8.1 IOB: 1.437 Activity: 0.0188 at 06:34:08 dev: 2.35 avgDelta: -5.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -7.9 IOB: 1.294 Activity: 0.0183 at 06:39:08 dev: -0.36 avgDelta: -8.25 uam +end unannounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -7.6 IOB: 1.153 Activity: 0.0176 at 06:44:09 dev: 0.09 avgDelta: -7.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -7.2 IOB: 1.017 Activity: 0.0167 at 06:49:08 dev: 3.20 avgDelta: -4.00 ISF +start uannnounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -6.7 IOB: 0.887 Activity: 0.0156 at 06:54:08 dev: 6.22 avgDelta: -0.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -6.3 IOB: 1.011 Activity: 0.0147 at 06:59:08 dev: 7.59 avgDelta: 1.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -6.1 IOB: 0.889 Activity: 0.0141 at 07:04:08 dev: 6.58 avgDelta: 0.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -5.7 IOB: 0.771 Activity: 0.0133 at 07:09:08 dev: 2.98 avgDelta: -2.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -5.3 IOB: 0.656 Activity: 0.0124 at 07:14:09 dev: 0.09 avgDelta: -5.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -4.9 IOB: 0.547 Activity: 0.0114 at 07:19:08 dev: -1.84 avgDelta: -6.75 uam +end unannounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -4.4 IOB: 0.392 Activity: 0.0103 at 07:24:09 dev: -2.31 avgDelta: -6.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -3.9 IOB: 0.294 Activity: 0.0091 at 07:29:09 dev: -1.08 avgDelta: -5.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -3.5 IOB: 0.2 Activity: 0.008 at 07:34:09 dev: 0.45 avgDelta: -3.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -2.8 IOB: 0.065 Activity: 0.0066 at 07:39:09 dev: 2.34 avgDelta: -0.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -2.4 IOB: 0.034 Activity: 0.0055 at 07:44:09 dev: 3.37 avgDelta: 1.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -2.1 IOB: 0.549 Activity: 0.0048 at 07:49:08 dev: 3.57 avgDelta: 1.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -2.3 IOB: 0.674 Activity: 0.0053 at 07:54:09 dev: 3.53 avgDelta: 1.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -2.5 IOB: 0.597 Activity: 0.0057 at 07:59:09 dev: 2.71 avgDelta: 0.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -2.5 IOB: 0.468 Activity: 0.0058 at 08:04:09 dev: 1.50 avgDelta: -1.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -2.5 IOB: 0.389 Activity: 0.0057 at 08:09:09 dev: 0.21 avgDelta: -2.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -2.3 IOB: 0.262 Activity: 0.0053 at 08:14:09 dev: -0.47 avgDelta: -2.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -2.1 IOB: 0.186 Activity: 0.0048 at 08:19:09 dev: -0.93 avgDelta: -3.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -1.8 IOB: 0.064 Activity: 0.0041 at 08:24:09 dev: -1.48 avgDelta: -3.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -1.5 IOB: -0.005 Activity: 0.0034 at 08:29:09 dev: -2.03 avgDelta: -3.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -1.1 IOB: -0.12 Activity: 0.0026 at 08:34:09 dev: -2.13 avgDelta: -3.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -0.8 IOB: -0.181 Activity: 0.0018 at 08:39:09 dev: -2.47 avgDelta: -3.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -0.3 IOB: -0.287 Activity: 0.0008 at 08:44:09 dev: -2.41 avgDelta: -2.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: 0.0 IOB: -0.34 Activity: 0 at 08:49:09 dev: -2.50 avgDelta: -2.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: 0.4 IOB: -0.436 Activity: -0.001 at 08:54:09 dev: -2.68 avgDelta: -2.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: 0.8 IOB: -0.48 Activity: -0.0018 at 08:59:09 dev: -2.28 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 1.1 IOB: -0.519 Activity: -0.0026 at 09:04:09 dev: -1.12 avgDelta: 0.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 1.5 IOB: -0.554 Activity: -0.0034 at 09:09:09 dev: 0.00 avgDelta: 1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 1.8 IOB: -0.585 Activity: -0.0041 at 09:14:09 dev: 0.00 avgDelta: 2.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 2.1 IOB: -0.662 Activity: -0.0049 at 09:19:09 dev: 0.39 avgDelta: 2.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 2.4 IOB: -0.687 Activity: -0.0055 at 09:24:08 dev: -0.37 avgDelta: 2.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 2.6 IOB: -0.708 Activity: -0.0061 at 09:29:09 dev: -0.13 avgDelta: 2.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 2.8 IOB: -0.726 Activity: -0.0066 at 09:34:09 dev: 0.41 avgDelta: 3.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 3.1 IOB: -0.351 Activity: -0.0071 at 09:39:08 dev: 1.19 avgDelta: 4.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 2.8 IOB: -0.218 Activity: -0.0064 at 09:44:09 dev: 2.99 avgDelta: 5.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 2.4 IOB: -0.088 Activity: -0.0055 at 09:49:09 dev: 4.63 avgDelta: 7.00 basal +start uannnounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -1.0 IOB: 13.594 Activity: 0.0023 at 09:54:09 dev: 8.74 avgDelta: 7.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -14.3 IOB: 13.552 Activity: 0.0331 at 09:59:09 dev: 23.02 avgDelta: 8.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -24.7 IOB: 13.224 Activity: 0.0573 at 10:04:09 dev: 33.70 avgDelta: 9.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -32.8 IOB: 12.838 Activity: 0.076 at 10:09:08 dev: 40.76 avgDelta: 8.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -38.8 IOB: 12.322 Activity: 0.09 at 10:14:09 dev: 45.04 avgDelta: 6.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -43.1 IOB: 11.794 Activity: 0.1001 at 10:19:09 dev: 46.89 avgDelta: 3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -46.0 IOB: 11.177 Activity: 0.1068 at 10:24:09 dev: 47.03 avgDelta: 1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -47.8 IOB: 10.58 Activity: 0.111 at 10:29:09 dev: 45.84 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -48.7 IOB: 9.919 Activity: 0.1129 at 10:34:09 dev: 43.66 avgDelta: -5.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -48.7 IOB: 9.254 Activity: 0.1129 at 10:39:09 dev: 41.41 avgDelta: -7.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -48.0 IOB: 8.643 Activity: 0.1114 at 10:44:09 dev: 39.51 avgDelta: -8.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -46.9 IOB: 7.992 Activity: 0.1088 at 10:49:09 dev: 39.39 avgDelta: -7.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -45.4 IOB: 7.406 Activity: 0.1053 at 10:54:08 dev: 40.13 avgDelta: -5.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -43.6 IOB: 7.111 Activity: 0.1012 at 10:59:09 dev: 41.37 avgDelta: -2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -41.9 IOB: 6.515 Activity: 0.0971 at 11:04:09 dev: 42.35 avgDelta: 0.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -40.0 IOB: 5.99 Activity: 0.0927 at 11:09:09 dev: 42.70 avgDelta: 2.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -37.8 IOB: 5.439 Activity: 0.0878 at 11:14:08 dev: 42.09 avgDelta: 4.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -35.7 IOB: 4.962 Activity: 0.0828 at 11:19:09 dev: 39.69 avgDelta: 4.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -33.4 IOB: 4.462 Activity: 0.0775 at 11:24:08 dev: 35.65 avgDelta: 2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -31.2 IOB: 4.036 Activity: 0.0724 at 11:29:09 dev: 31.45 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -29.0 IOB: 3.638 Activity: 0.0672 at 11:34:09 dev: 27.46 avgDelta: -1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -26.8 IOB: 3.214 Activity: 0.0621 at 11:39:08 dev: 25.02 avgDelta: -1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -24.6 IOB: 2.866 Activity: 0.0571 at 11:44:09 dev: 23.61 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -22.5 IOB: 2.494 Activity: 0.0522 at 11:49:09 dev: 21.75 avgDelta: -0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -20.5 IOB: 2.193 Activity: 0.0476 at 11:54:09 dev: 20.52 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -18.6 IOB: 1.867 Activity: 0.0431 at 11:59:09 dev: 18.83 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -16.7 IOB: 1.563 Activity: 0.0388 at 12:04:09 dev: 16.97 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -15.0 IOB: 1.329 Activity: 0.0347 at 12:09:08 dev: 14.46 avgDelta: -0.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -13.3 IOB: 1.115 Activity: 0.0309 at 12:14:09 dev: 11.32 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -11.7 IOB: 0.87 Activity: 0.0272 at 12:19:09 dev: 7.97 avgDelta: -3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -10.3 IOB: 0.692 Activity: 0.0239 at 12:24:09 dev: 5.80 avgDelta: -4.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -8.9 IOB: 0.482 Activity: 0.0206 at 12:29:08 dev: 4.88 avgDelta: -4.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -7.6 IOB: 0.287 Activity: 0.0176 at 12:34:09 dev: 4.09 avgDelta: -3.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -6.4 IOB: 0.156 Activity: 0.0148 at 12:39:08 dev: 3.88 avgDelta: -2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -5.3 IOB: 0.038 Activity: 0.0122 at 12:44:08 dev: 3.26 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -4.3 IOB: -0.067 Activity: 0.0099 at 12:49:09 dev: 2.27 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -3.4 IOB: -0.161 Activity: 0.0078 at 12:54:08 dev: 1.36 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -2.6 IOB: -0.195 Activity: 0.006 at 12:59:08 dev: 0.09 avgDelta: -2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -1.9 IOB: -0.271 Activity: 0.0044 at 13:04:09 dev: -1.10 avgDelta: -3.00 uam +end unannounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -1.3 IOB: -0.339 Activity: 0.0029 at 13:09:09 dev: -1.00 avgDelta: -2.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -0.7 IOB: -0.4 Activity: 0.0015 at 13:14:09 dev: 0.90 avgDelta: 0.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -0.3 IOB: -0.155 Activity: 0.0007 at 13:19:08 dev: 3.80 avgDelta: 3.50 basal +start uannnounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -1.9 IOB: 8.11 Activity: 0.0045 at 13:24:09 dev: 8.94 avgDelta: 7.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -9.6 IOB: 7.992 Activity: 0.0222 at 13:29:09 dev: 18.57 avgDelta: 9.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -15.5 IOB: 7.745 Activity: 0.0359 at 13:34:09 dev: 23.47 avgDelta: 8.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -20.0 IOB: 7.488 Activity: 0.0465 at 13:39:09 dev: 24.04 avgDelta: 4.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -23.3 IOB: 7.136 Activity: 0.0541 at 13:44:09 dev: 21.32 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -25.7 IOB: 6.8 Activity: 0.0596 at 13:49:09 dev: 17.94 avgDelta: -7.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -27.3 IOB: 6.441 Activity: 0.0633 at 13:54:09 dev: 0.00 avgDelta: -10.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -28.1 IOB: 6.022 Activity: 0.0651 at 13:59:09 dev: 0.00 avgDelta: -9.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -28.3 IOB: 5.644 Activity: 0.0657 at 14:04:09 dev: 0.00 avgDelta: -6.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -28.1 IOB: 5.216 Activity: 0.0653 at 14:09:09 dev: 0.00 avgDelta: -2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -27.8 IOB: 4.962 Activity: 0.0644 at 14:14:09 dev: 0.00 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -27.0 IOB: 4.544 Activity: 0.0627 at 14:19:09 dev: 0.00 avgDelta: 0.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -26.1 IOB: 4.185 Activity: 0.0606 at 14:24:09 dev: 0.00 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -25.0 IOB: 3.839 Activity: 0.058 at 14:29:09 dev: 0.00 avgDelta: -1.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -23.7 IOB: 3.456 Activity: 0.055 at 14:34:09 dev: 0.00 avgDelta: -2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -22.4 IOB: 3.139 Activity: 0.0519 at 14:39:09 dev: 0.00 avgDelta: -2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -20.9 IOB: 2.788 Activity: 0.0486 at 14:44:09 dev: 0.00 avgDelta: -1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -19.5 IOB: 2.503 Activity: 0.0453 at 14:49:10 dev: 0.00 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -18.0 IOB: 2.186 Activity: 0.0418 at 14:54:09 dev: 0.00 avgDelta: 2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -17.5 IOB: 3.17 Activity: 0.0407 at 14:59:09 dev: 22.04 avgDelta: 4.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -17.8 IOB: 3.956 Activity: 0.0413 at 15:04:09 dev: 23.80 avgDelta: 6.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.1 IOB: 3.648 Activity: 0.042 at 15:09:09 dev: 23.85 avgDelta: 5.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.5 IOB: 4.126 Activity: 0.043 at 15:14:09 dev: 22.28 avgDelta: 3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.8 IOB: 3.81 Activity: 0.0437 at 15:19:10 dev: 20.58 avgDelta: 1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.8 IOB: 3.541 Activity: 0.0437 at 15:24:10 dev: 19.08 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.6 IOB: 3.272 Activity: 0.0431 at 15:29:09 dev: 19.33 avgDelta: 0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.4 IOB: 3.588 Activity: 0.0428 at 15:34:09 dev: 21.20 avgDelta: 2.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.6 IOB: 3.875 Activity: 0.0431 at 15:39:09 dev: 23.83 avgDelta: 5.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.7 IOB: 3.608 Activity: 0.0434 at 15:44:08 dev: 25.46 avgDelta: 6.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -19.1 IOB: 4.271 Activity: 0.0442 at 15:49:09 dev: 26.05 avgDelta: 7.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -19.5 IOB: 3.996 Activity: 0.0452 at 15:54:09 dev: 25.98 avgDelta: 6.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -19.9 IOB: 4.298 Activity: 0.0462 at 15:59:08 dev: 26.16 avgDelta: 6.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -20.2 IOB: 4.015 Activity: 0.0468 at 16:04:09 dev: 26.67 avgDelta: 6.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -20.7 IOB: 4.538 Activity: 0.0481 at 16:09:09 dev: 27.98 avgDelta: 7.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -21.1 IOB: 4.245 Activity: 0.0489 at 16:14:09 dev: 28.33 avgDelta: 7.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -21.6 IOB: 4.729 Activity: 0.05 at 16:19:09 dev: 28.30 avgDelta: 6.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -21.9 IOB: 4.426 Activity: 0.0508 at 16:24:09 dev: 28.64 avgDelta: 6.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -22.0 IOB: 4.353 Activity: 0.051 at 16:29:09 dev: 28.73 avgDelta: 6.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -21.9 IOB: 4.049 Activity: 0.0507 at 16:34:10 dev: 28.10 avgDelta: 6.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -21.5 IOB: 3.747 Activity: 0.0498 at 16:39:09 dev: 25.96 avgDelta: 4.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -20.8 IOB: 3.402 Activity: 0.0483 at 16:44:09 dev: 22.32 avgDelta: 1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -20.0 IOB: 3.115 Activity: 0.0464 at 16:49:10 dev: 19.00 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -19.0 IOB: 2.788 Activity: 0.0441 at 16:54:09 dev: 17.01 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -18.0 IOB: 2.524 Activity: 0.0417 at 16:59:09 dev: 15.97 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -16.9 IOB: 2.271 Activity: 0.0391 at 17:04:09 dev: 16.10 avgDelta: -0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -15.7 IOB: 2.033 Activity: 0.0365 at 17:09:10 dev: 15.48 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -14.6 IOB: 1.807 Activity: 0.0338 at 17:14:10 dev: 14.57 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -13.4 IOB: 1.594 Activity: 0.0312 at 17:19:09 dev: 13.70 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -12.3 IOB: 1.395 Activity: 0.0286 at 17:24:10 dev: 12.58 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -11.3 IOB: 1.258 Activity: 0.0262 at 17:29:09 dev: 11.54 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -10.2 IOB: 1.034 Activity: 0.0236 at 17:34:09 dev: 10.17 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -9.3 IOB: 0.971 Activity: 0.0215 at 17:39:09 dev: 9.02 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -8.5 IOB: 1.008 Activity: 0.0197 at 17:44:09 dev: 7.74 avgDelta: -0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -7.9 IOB: 0.963 Activity: 0.0183 at 17:49:09 dev: 6.89 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -7.4 IOB: 1.046 Activity: 0.0171 at 17:54:10 dev: 7.12 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -6.9 IOB: 0.912 Activity: 0.0161 at 17:59:09 dev: 6.94 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -6.7 IOB: 1.254 Activity: 0.0156 at 18:04:09 dev: 6.97 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -6.6 IOB: 1.176 Activity: 0.0154 at 18:09:09 dev: 6.64 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -6.4 IOB: 1.051 Activity: 0.0149 at 18:14:10 dev: 5.67 avgDelta: -0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -6.1 IOB: 0.928 Activity: 0.0142 at 18:19:09 dev: 5.12 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -6.0 IOB: 1.008 Activity: 0.0138 at 18:24:09 dev: 4.45 avgDelta: -1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -5.7 IOB: 0.89 Activity: 0.0133 at 18:29:09 dev: 3.48 avgDelta: -2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -5.5 IOB: 0.775 Activity: 0.0127 at 18:34:09 dev: 2.47 avgDelta: -3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -5.1 IOB: 0.664 Activity: 0.0118 at 18:39:09 dev: 1.59 avgDelta: -3.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -4.7 IOB: 0.606 Activity: 0.011 at 18:44:09 dev: 1.74 avgDelta: -3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -4.5 IOB: 0.703 Activity: 0.0105 at 18:49:09 dev: 3.03 avgDelta: -1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -4.3 IOB: 0.702 Activity: 0.0101 at 18:54:09 dev: 4.10 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -4.3 IOB: 0.902 Activity: 0.0101 at 18:59:09 dev: 4.35 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -4.3 IOB: 0.801 Activity: 0.0101 at 19:04:09 dev: 2.10 avgDelta: -2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -4.2 IOB: 0.701 Activity: 0.0098 at 19:09:09 dev: -1.03 avgDelta: -5.25 uam +end unannounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -4.0 IOB: 0.603 Activity: 0.0094 at 19:14:09 dev: -4.95 avgDelta: -9.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -3.8 IOB: 0.508 Activity: 0.0088 at 19:19:09 dev: -8.21 avgDelta: -12.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -3.5 IOB: 0.415 Activity: 0.0081 at 19:24:09 dev: -9.76 avgDelta: -13.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -3.2 IOB: 0.327 Activity: 0.0074 at 19:29:09 dev: -8.06 avgDelta: -11.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -2.8 IOB: 0.242 Activity: 0.0066 at 19:34:09 dev: -3.91 avgDelta: -6.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -2.5 IOB: 0.161 Activity: 0.0058 at 19:39:09 dev: 2.00 avgDelta: -0.50 ISF +start uannnounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -2.2 IOB: 0.134 Activity: 0.005 at 19:44:09 dev: 7.16 avgDelta: 5.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -2.1 IOB: 0.4 Activity: 0.0048 at 19:49:09 dev: 9.57 avgDelta: 7.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -2.1 IOB: 0.475 Activity: 0.0049 at 19:54:09 dev: 8.86 avgDelta: 6.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -2.2 IOB: 0.401 Activity: 0.005 at 19:59:10 dev: 5.91 avgDelta: 3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -2.1 IOB: 0.327 Activity: 0.0048 at 20:04:10 dev: 2.82 avgDelta: 0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -1.9 IOB: 0.203 Activity: 0.0044 at 20:09:09 dev: -0.35 avgDelta: -2.25 uam +end unannounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -1.7 IOB: 0.132 Activity: 0.004 at 20:14:09 dev: -1.78 avgDelta: -3.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -1.5 IOB: 0.064 Activity: 0.0034 at 20:19:09 dev: -2.28 avgDelta: -3.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -1.2 IOB: -0.002 Activity: 0.0028 at 20:24:09 dev: -1.54 avgDelta: -2.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -0.9 IOB: -0.064 Activity: 0.0022 at 20:29:10 dev: -1.05 avgDelta: -2.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -0.7 IOB: -0.073 Activity: 0.0016 at 20:34:09 dev: -0.81 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -0.5 IOB: -0.08 Activity: 0.0011 at 20:39:09 dev: -1.03 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -0.3 IOB: -0.085 Activity: 0.0007 at 20:44:09 dev: -1.45 avgDelta: -1.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -0.2 IOB: -0.087 Activity: 0.0004 at 20:49:09 dev: -1.33 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -0.0 IOB: -0.088 Activity: 0.0001 at 20:54:09 dev: -1.21 avgDelta: -1.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: 0.0 IOB: -0.088 Activity: -0.0001 at 20:59:09 dev: -0.79 avgDelta: -0.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.2 IOB: -0.137 Activity: -0.0004 at 21:04:09 dev: -0.92 avgDelta: -0.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.3 IOB: -0.184 Activity: -0.0007 at 21:09:10 dev: -0.80 avgDelta: -0.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.4 IOB: -0.18 Activity: -0.001 at 21:14:09 dev: -0.68 avgDelta: -0.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.5 IOB: -0.175 Activity: -0.0012 at 21:19:09 dev: -1.02 avgDelta: -0.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.6 IOB: -0.168 Activity: -0.0014 at 21:24:09 dev: -1.35 avgDelta: -0.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.7 IOB: -0.211 Activity: -0.0015 at 21:29:10 dev: -1.65 avgDelta: -1.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.7 IOB: -0.203 Activity: -0.0017 at 21:34:09 dev: -1.98 avgDelta: -1.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.9 IOB: -0.243 Activity: -0.002 at 21:39:10 dev: -2.36 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.0 IOB: -0.282 Activity: -0.0023 at 21:44:10 dev: -2.49 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.1 IOB: -0.32 Activity: -0.0026 at 21:49:09 dev: -2.62 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.3 IOB: -0.357 Activity: -0.0029 at 21:54:10 dev: -2.25 avgDelta: -1.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.4 IOB: -0.391 Activity: -0.0032 at 21:59:10 dev: -1.38 avgDelta: 0.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.5 IOB: -0.375 Activity: -0.0035 at 22:04:09 dev: -0.01 avgDelta: 1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.6 IOB: -0.357 Activity: -0.0036 at 22:09:09 dev: 1.45 avgDelta: 3.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.5 IOB: -0.149 Activity: -0.0035 at 22:14:09 dev: 3.49 avgDelta: 5.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.3 IOB: -0.132 Activity: -0.0031 at 22:19:10 dev: 5.91 avgDelta: 7.25 basal +start uannnounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -6.5 IOB: 9.296 Activity: 0.015 at 22:24:09 dev: 15.96 avgDelta: 9.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -14.3 IOB: 9.123 Activity: 0.0332 at 22:29:10 dev: 25.06 avgDelta: 10.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -20.4 IOB: 8.96 Activity: 0.0474 at 22:34:09 dev: 29.43 avgDelta: 9.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -25.2 IOB: 8.644 Activity: 0.0584 at 22:39:10 dev: 29.92 avgDelta: 4.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -28.6 IOB: 8.282 Activity: 0.0664 at 22:44:10 dev: 27.37 avgDelta: -1.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -30.9 IOB: 7.835 Activity: 0.0718 at 22:49:09 dev: 24.70 avgDelta: -6.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -32.5 IOB: 7.416 Activity: 0.0753 at 22:54:10 dev: 23.70 avgDelta: -8.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -33.3 IOB: 6.984 Activity: 0.0772 at 22:59:09 dev: 24.52 avgDelta: -8.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -33.5 IOB: 6.547 Activity: 0.0776 at 23:04:09 dev: 26.70 avgDelta: -6.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -33.1 IOB: 6.061 Activity: 0.0769 at 23:09:10 dev: 28.39 avgDelta: -4.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -32.5 IOB: 5.68 Activity: 0.0754 at 23:14:10 dev: 29.50 avgDelta: -3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -31.6 IOB: 5.458 Activity: 0.0734 at 23:19:09 dev: 30.14 avgDelta: -1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -30.7 IOB: 5.046 Activity: 0.0712 at 23:24:10 dev: 29.94 avgDelta: -0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -29.7 IOB: 4.925 Activity: 0.069 at 23:29:09 dev: 29.49 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -28.6 IOB: 4.487 Activity: 0.0663 at 23:34:09 dev: 29.08 avgDelta: 0.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -27.3 IOB: 4.113 Activity: 0.0633 at 23:39:10 dev: 28.28 avgDelta: 1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -25.8 IOB: 3.706 Activity: 0.0599 at 23:44:09 dev: 27.57 avgDelta: 1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -24.4 IOB: 3.363 Activity: 0.0566 at 23:49:09 dev: 26.64 avgDelta: 2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -22.8 IOB: 3.039 Activity: 0.053 at 23:54:09 dev: 25.34 avgDelta: 2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -21.3 IOB: 2.733 Activity: 0.0494 at 23:59:10 dev: 23.79 avgDelta: 2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -19.7 IOB: 2.395 Activity: 0.0457 at 00:04:10 dev: 22.20 avgDelta: 2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -18.1 IOB: 2.126 Activity: 0.0421 at 00:09:10 dev: 20.65 avgDelta: 2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -16.6 IOB: 1.824 Activity: 0.0385 at 00:14:10 dev: 18.59 avgDelta: 2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -15.1 IOB: 1.64 Activity: 0.0351 at 00:19:09 dev: 17.13 avgDelta: 2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -13.8 IOB: 1.473 Activity: 0.0319 at 00:24:09 dev: 15.50 avgDelta: 1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -12.4 IOB: 1.273 Activity: 0.0288 at 00:29:10 dev: 14.16 avgDelta: 1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -11.2 IOB: 1.136 Activity: 0.026 at 00:34:10 dev: 12.71 avgDelta: 1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -10.1 IOB: 1.011 Activity: 0.0235 at 00:39:09 dev: 10.13 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -9.1 IOB: 0.852 Activity: 0.021 at 00:44:10 dev: 7.30 avgDelta: -1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -8.2 IOB: 0.752 Activity: 0.0189 at 00:49:10 dev: 4.65 avgDelta: -3.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -7.3 IOB: 0.662 Activity: 0.0169 at 00:54:10 dev: 3.28 avgDelta: -4.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -6.4 IOB: 0.534 Activity: 0.0149 at 00:59:09 dev: 3.42 avgDelta: -3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -5.7 IOB: 0.463 Activity: 0.0132 at 01:04:09 dev: 4.69 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -5.0 IOB: 0.352 Activity: 0.0115 at 01:09:10 dev: 5.96 avgDelta: 1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.3 IOB: 0.298 Activity: 0.0101 at 01:14:10 dev: 6.60 avgDelta: 2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.8 IOB: 0.25 Activity: 0.0089 at 01:19:09 dev: 6.84 avgDelta: 3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.4 IOB: 0.329 Activity: 0.0079 at 01:24:10 dev: 6.40 avgDelta: 3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.2 IOB: 0.34 Activity: 0.0074 at 01:29:10 dev: 5.69 avgDelta: 2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -2.9 IOB: 0.304 Activity: 0.0068 at 01:34:10 dev: 5.43 avgDelta: 2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -2.7 IOB: 0.272 Activity: 0.0062 at 01:39:10 dev: 5.67 avgDelta: 3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -2.6 IOB: 0.512 Activity: 0.006 at 01:44:10 dev: 6.59 avgDelta: 4.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -2.6 IOB: 0.581 Activity: 0.0061 at 01:49:10 dev: 7.38 avgDelta: 4.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.2 IOB: 1.238 Activity: 0.0075 at 01:54:10 dev: 7.98 avgDelta: 4.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.8 IOB: 1.147 Activity: 0.0088 at 01:59:10 dev: 7.54 avgDelta: 3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.2 IOB: 1.151 Activity: 0.0098 at 02:04:10 dev: 6.72 avgDelta: 2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.5 IOB: 1.05 Activity: 0.0104 at 02:09:09 dev: 5.98 avgDelta: 1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.6 IOB: 0.947 Activity: 0.0107 at 02:14:09 dev: 4.86 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.6 IOB: 0.844 Activity: 0.0106 at 02:19:10 dev: 3.82 avgDelta: -0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.5 IOB: 0.741 Activity: 0.0104 at 02:24:10 dev: 2.73 avgDelta: -1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.3 IOB: 0.59 Activity: 0.0099 at 02:29:10 dev: 2.52 avgDelta: -1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.0 IOB: 0.542 Activity: 0.0093 at 02:34:09 dev: 3.01 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.8 IOB: 0.497 Activity: 0.0087 at 02:39:09 dev: 3.50 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.5 IOB: 0.456 Activity: 0.0081 at 02:44:10 dev: 1.74 avgDelta: -1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.3 IOB: 0.516 Activity: 0.0077 at 02:49:09 dev: -1.93 avgDelta: -5.25 uam +end unannounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.1 IOB: 0.429 Activity: 0.0072 at 02:54:09 dev: -6.40 avgDelta: -9.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -2.8 IOB: 0.294 Activity: 0.0066 at 02:59:10 dev: -8.66 avgDelta: -11.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: -2.5 IOB: 0.163 Activity: 0.0058 at 03:04:10 dev: -8.25 avgDelta: -10.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: -2.1 IOB: 0.037 Activity: 0.0049 at 03:09:10 dev: -6.39 avgDelta: -8.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: -1.7 IOB: -0.085 Activity: 0.0039 at 03:14:10 dev: -4.32 avgDelta: -6.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: -1.3 IOB: -0.153 Activity: 0.0029 at 03:19:09 dev: -3.75 avgDelta: -5.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: -0.8 IOB: -0.265 Activity: 0.0018 at 03:24:10 dev: -3.72 avgDelta: -4.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: -0.3 IOB: -0.371 Activity: 0.0007 at 03:29:09 dev: -3.45 avgDelta: -3.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: 0.2 IOB: -0.471 Activity: -0.0005 at 03:34:09 dev: -2.22 avgDelta: -2.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: 0.7 IOB: -0.566 Activity: -0.0016 at 03:39:10 dev: -0.94 avgDelta: -0.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: 1.1 IOB: -0.606 Activity: -0.0026 at 03:44:10 dev: 0.00 avgDelta: 1.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: 1.6 IOB: -0.64 Activity: -0.0036 at 03:49:10 dev: 0.45 avgDelta: 2.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: 1.9 IOB: -0.67 Activity: -0.0044 at 03:54:10 dev: -0.15 avgDelta: 1.75 basal +Warning: too many deviations categorized as UnAnnounced Meals +Adding 203 UAM deviations to 54 basal ones +and selecting the lowest 50%, leaving 128 basal+UAM ones +Adding 203 UAM deviations to 26 ISF ones +and selecting the lowest 50%, leaving 114 ISF+UAM ones +oref0-autotune-core autotune.2022-05-21.json profile.json profile.pump.json > newprofile.2022-05-21.json +CRTotalCarbs: 0 CRTotalInsulin: 0 totalCR: NaN +Hour 0 total deviations: 11.35 mg/dL +Hour 0 basal adjustment needed: 0.03 U/hr +Hour 1 total deviations: 47.03 mg/dL +Hour 1 basal adjustment needed: 0.11 U/hr +Hour 2 total deviations: 26.23 mg/dL +Hour 2 basal adjustment needed: 0.06 U/hr +Hour 3 total deviations: -18.1 mg/dL +Hour 3 basal adjustment needed: -0.04 U/hr +Hour 4 total deviations: 0 mg/dL +Hour 4 basal adjustment needed: 0 U/hr +Hour 5 total deviations: 38.31 mg/dL +Hour 5 basal adjustment needed: 0.09 U/hr +Hour 6 total deviations: 19.79 mg/dL +Hour 6 basal adjustment needed: 0.05 U/hr +Hour 7 total deviations: 7.81 mg/dL +Hour 7 basal adjustment needed: 0.02 U/hr +Hour 8 total deviations: -16.5 mg/dL +Hour 8 basal adjustment needed: -0.04 U/hr +Hour 9 total deviations: 7.99 mg/dL +Hour 9 basal adjustment needed: 0.02 U/hr +Hour 10 total deviations: 0 mg/dL +Hour 10 basal adjustment needed: 0 U/hr +Hour 11 total deviations: 0 mg/dL +Hour 11 basal adjustment needed: 0 U/hr +Hour 12 total deviations: 25.63 mg/dL +Hour 12 basal adjustment needed: 0.06 U/hr +Hour 13 total deviations: 2.6 mg/dL +Hour 13 basal adjustment needed: 0.01 U/hr +Hour 14 total deviations: 0 mg/dL +Hour 14 basal adjustment needed: 0 U/hr +Hour 15 total deviations: 0 mg/dL +Hour 15 basal adjustment needed: 0 U/hr +Hour 16 total deviations: 0 mg/dL +Hour 16 basal adjustment needed: 0 U/hr +Hour 17 total deviations: 0 mg/dL +Hour 17 basal adjustment needed: 0 U/hr +Hour 18 total deviations: 42.64 mg/dL +Hour 18 basal adjustment needed: 0.1 U/hr +Hour 19 total deviations: 6.98 mg/dL +Hour 19 basal adjustment needed: 0.02 U/hr +Hour 20 total deviations: -9.02 mg/dL +Hour 20 basal adjustment needed: -0.02 U/hr +Hour 21 total deviations: -19.5 mg/dL +Hour 21 basal adjustment needed: -0.05 U/hr +Hour 22 total deviations: 10.84 mg/dL +Hour 22 basal adjustment needed: 0.03 U/hr +Hour 23 total deviations: 0 mg/dL +Hour 23 basal adjustment needed: 0 U/hr +Adjusting hour 13 basal from 0.874 to 0.876 based on hour 12 = 0.885 and hour 15 = 0.881 +Adjusting hour 14 basal from 0.866 to 0.869 based on hour 12 = 0.885 and hour 15 = 0.881 +[ { start: '00:00:00', minutes: 0, rate: 1.009, i: 0 }, + { start: '01:00:00', minutes: 60, rate: 0.984, i: 1 }, + { start: '02:00:00', minutes: 120, rate: 0.988, i: 2 }, + { start: '03:00:00', minutes: 180, rate: 1.158, i: 3 }, + { start: '04:00:00', minutes: 240, rate: 1.028, i: 4 }, + { start: '05:00:00', minutes: 300, rate: 0.933, i: 5 }, + { start: '06:00:00', minutes: 360, rate: 0.824, i: 6 }, + { start: '07:00:00', minutes: 420, rate: 0.849, i: 7 }, + { start: '08:00:00', minutes: 480, rate: 0.909, i: 8 }, + { start: '09:00:00', minutes: 540, rate: 0.954, i: 9 }, + { start: '10:00:00', minutes: 600, rate: 0.961, i: 10 }, + { start: '11:00:00', minutes: 660, rate: 0.926, i: 11 }, + { start: '12:00:00', minutes: 720, rate: 0.885, i: 12 }, + { start: '13:00:00', minutes: 780, rate: 0.876, i: 13, untuned: 1 }, + { start: '14:00:00', minutes: 840, rate: 0.869, i: 14, untuned: 1 }, + { start: '15:00:00', minutes: 900, rate: 0.881, i: 15 }, + { start: '16:00:00', minutes: 960, rate: 0.798, i: 16 }, + { start: '17:00:00', minutes: 1020, rate: 0.683, i: 17 }, + { start: '18:00:00', minutes: 1080, rate: 0.634, i: 18 }, + { start: '19:00:00', minutes: 1140, rate: 0.725, i: 19 }, + { start: '20:00:00', minutes: 1200, rate: 0.838, i: 20 }, + { start: '21:00:00', minutes: 1260, rate: 0.881, i: 21 }, + { start: '22:00:00', minutes: 1320, rate: 0.91, i: 22 }, + { start: '23:00:00', minutes: 1380, rate: 0.91, i: 23 } ] +totalMealCarbs: 0 totalDeviations: 0 oldCSF 14.991 fullNewCSF: 14.991304347826087 newCSF: 14.991 +oldCR: 5.75 fullNewCR: NaN newCR: NaN +Limiting adjusted ISF of 43.19 to 66.31 (which is pump ISF of 86.2 / 1.3 ) +p50deviation: 3.2 p50BGI -4.96 p50ratios: 0.501 Old ISF: 86.2 fullNewISF: 43.186 adjustedISF: 66.308 newISF: 82.222 newDIA: 6 newPeak: 45 + +Autotune pump profile recommendations: +--------------------------------------------------------- +Recommendations Log File: /home/titi/aaps/autotune/aapsorefautotune_recommendations.log + +Parameter | Pump | Autotune | Days Missing +--------------------------------------------------------- +ISF [mg/dL/U] | 86.200 | 82.222 | +Carb Ratio[g/U]| 5.750 | 5.750 | + 00:00 | 0.966 | 1.009 | 0 + 01:00 | 0.977 | 0.984 | 0 + 02:00 | 0.971 | 0.988 | 0 + 03:00 | 1.111 | 1.158 | 0 + 04:00 | 0.974 | 1.028 | 0 + 05:00 | 0.923 | 0.933 | 0 + 06:00 | 0.823 | 0.824 | 0 + 07:00 | 0.855 | 0.849 | 0 + 08:00 | 0.902 | 0.909 | 0 + 09:00 | 0.934 | 0.954 | 0 + 10:00 | 0.938 | 0.961 | 0 + 11:00 | 0.903 | 0.926 | 0 + 12:00 | 0.882 | 0.885 | 0 + 13:00 | 0.874 | 0.876 | 1 + 14:00 | 0.866 | 0.869 | 1 + 15:00 | 0.848 | 0.881 | 0 + 16:00 | 0.758 | 0.798 | 0 + 17:00 | 0.650 | 0.683 | 0 + 18:00 | 0.648 | 0.634 | 0 + 19:00 | 0.738 | 0.725 | 0 + 20:00 | 0.847 | 0.838 | 0 + 21:00 | 0.861 | 0.881 | 0 + 22:00 | 0.863 | 0.910 | 0 + 23:00 | 0.843 | 0.910 | 0 diff --git a/app/src/test/res/autotune/test2/newaapsorefprofile.2022-05-21.json b/app/src/test/res/autotune/test2/newaapsorefprofile.2022-05-21.json new file mode 100644 index 0000000000..ad7b75b70c --- /dev/null +++ b/app/src/test/res/autotune/test2/newaapsorefprofile.2022-05-21.json @@ -0,0 +1,175 @@ +{ + "autosens_max": 1.3, + "autosens_min": 0.7, + "basalprofile": [ + { + "i": 0, + "minutes": 0, + "rate": 1.009, + "start": "00:00:00" + }, + { + "i": 1, + "minutes": 60, + "rate": 0.984, + "start": "01:00:00" + }, + { + "i": 2, + "minutes": 120, + "rate": 0.988, + "start": "02:00:00" + }, + { + "i": 3, + "minutes": 180, + "rate": 1.158, + "start": "03:00:00" + }, + { + "i": 4, + "minutes": 240, + "rate": 1.028, + "start": "04:00:00" + }, + { + "i": 5, + "minutes": 300, + "rate": 0.933, + "start": "05:00:00" + }, + { + "i": 6, + "minutes": 360, + "rate": 0.824, + "start": "06:00:00" + }, + { + "i": 7, + "minutes": 420, + "rate": 0.849, + "start": "07:00:00" + }, + { + "i": 8, + "minutes": 480, + "rate": 0.909, + "start": "08:00:00" + }, + { + "i": 9, + "minutes": 540, + "rate": 0.954, + "start": "09:00:00" + }, + { + "i": 10, + "minutes": 600, + "rate": 0.961, + "start": "10:00:00" + }, + { + "i": 11, + "minutes": 660, + "rate": 0.926, + "start": "11:00:00" + }, + { + "i": 12, + "minutes": 720, + "rate": 0.885, + "start": "12:00:00" + }, + { + "i": 13, + "minutes": 780, + "rate": 0.876, + "start": "13:00:00", + "untuned": 1 + }, + { + "i": 14, + "minutes": 840, + "rate": 0.869, + "start": "14:00:00", + "untuned": 1 + }, + { + "i": 15, + "minutes": 900, + "rate": 0.881, + "start": "15:00:00" + }, + { + "i": 16, + "minutes": 960, + "rate": 0.798, + "start": "16:00:00" + }, + { + "i": 17, + "minutes": 1020, + "rate": 0.683, + "start": "17:00:00" + }, + { + "i": 18, + "minutes": 1080, + "rate": 0.634, + "start": "18:00:00" + }, + { + "i": 19, + "minutes": 1140, + "rate": 0.725, + "start": "19:00:00" + }, + { + "i": 20, + "minutes": 1200, + "rate": 0.838, + "start": "20:00:00" + }, + { + "i": 21, + "minutes": 1260, + "rate": 0.881, + "start": "21:00:00" + }, + { + "i": 22, + "minutes": 1320, + "rate": 0.91, + "start": "22:00:00" + }, + { + "i": 23, + "minutes": 1380, + "rate": 0.91, + "start": "23:00:00" + } + ], + "carb_ratio": 5.75, + "csf": 14.991, + "curve": "ultra-rapid", + "dia": 6, + "insulinPeakTime": 45, + "isfProfile": { + "sensitivities": [ + { + "endoffset": 1440, + "i": 0, + "offset": 0, + "sensitivity": 82.222, + "start": "00:00:00", + "x": 0 + } + ] + }, + "min_5m_carbimpact": 8, + "name": "Tuned Dyn2", + "sens": 82.222, + "timezone": "Europe/Paris", + "units": "mg/dl", + "useCustomPeakTime": true +} diff --git a/app/src/test/res/autotune/test2/oaps-iobCalc.2022-05-21.json b/app/src/test/res/autotune/test2/oaps-iobCalc.2022-05-21.json new file mode 100644 index 0000000000..92304dbf45 --- /dev/null +++ b/app/src/test/res/autotune/test2/oaps-iobCalc.2022-05-21.json @@ -0,0 +1,286 @@ +[ + { "iob": 5.249, "activity": 0.0391, "date": 1653099848000}, + { "iob": 5.292, "activity": 0.0438, "date": 1653100148000}, + { "iob": 4.964, "activity": 0.047, "date": 1653100449000}, + { "iob": 4.674, "activity": 0.0489, "date": 1653100748000}, + { "iob": 4.377, "activity": 0.0498, "date": 1653101048000}, + { "iob": 4.077, "activity": 0.0498, "date": 1653101348000}, + { "iob": 3.73, "activity": 0.0491, "date": 1653101648000}, + { "iob": 3.389, "activity": 0.0476, "date": 1653101948000}, + { "iob": 3.055, "activity": 0.0457, "date": 1653102249000}, + { "iob": 2.782, "activity": 0.0436, "date": 1653102548000}, + { "iob": 2.47, "activity": 0.0411, "date": 1653102848000}, + { "iob": 2.22, "activity": 0.0386, "date": 1653103149000}, + { "iob": 1.935, "activity": 0.0358, "date": 1653103448000}, + { "iob": 1.711, "activity": 0.0332, "date": 1653103748000}, + { "iob": 1.452, "activity": 0.0304, "date": 1653104049000}, + { "iob": 1.927, "activity": 0.028, "date": 1653104349000}, + { "iob": 1.84, "activity": 0.027, "date": 1653104648000}, + { "iob": 1.658, "activity": 0.0258, "date": 1653104949000}, + { "iob": 1.482, "activity": 0.0245, "date": 1653105248000}, + { "iob": 1.264, "activity": 0.0229, "date": 1653105549000}, + { "iob": 1.104, "activity": 0.0212, "date": 1653105848000}, + { "iob": 0.952, "activity": 0.0194, "date": 1653106149000}, + { "iob": 1.619, "activity": 0.0181, "date": 1653106449000}, + { "iob": 1.678, "activity": 0.0184, "date": 1653106749000}, + { "iob": 1.775, "activity": 0.0187, "date": 1653107048000}, + { "iob": 1.581, "activity": 0.019, "date": 1653107348000}, + { "iob": 1.437, "activity": 0.0188, "date": 1653107648000}, + { "iob": 1.294, "activity": 0.0183, "date": 1653107948000}, + { "iob": 1.153, "activity": 0.0176, "date": 1653108249000}, + { "iob": 1.017, "activity": 0.0167, "date": 1653108548000}, + { "iob": 0.887, "activity": 0.0156, "date": 1653108848000}, + { "iob": 1.011, "activity": 0.0147, "date": 1653109148000}, + { "iob": 0.889, "activity": 0.0141, "date": 1653109448000}, + { "iob": 0.771, "activity": 0.0133, "date": 1653109748000}, + { "iob": 0.656, "activity": 0.0124, "date": 1653110049000}, + { "iob": 0.547, "activity": 0.0114, "date": 1653110348000}, + { "iob": 0.392, "activity": 0.0103, "date": 1653110649000}, + { "iob": 0.294, "activity": 0.0091, "date": 1653110949000}, + { "iob": 0.2, "activity": 0.008, "date": 1653111249000}, + { "iob": 0.065, "activity": 0.0066, "date": 1653111549000}, + { "iob": 0.034, "activity": 0.0055, "date": 1653111849000}, + { "iob": 0.549, "activity": 0.0048, "date": 1653112148000}, + { "iob": 0.674, "activity": 0.0053, "date": 1653112449000}, + { "iob": 0.597, "activity": 0.0057, "date": 1653112749000}, + { "iob": 0.468, "activity": 0.0058, "date": 1653113049000}, + { "iob": 0.389, "activity": 0.0057, "date": 1653113349000}, + { "iob": 0.262, "activity": 0.0053, "date": 1653113649000}, + { "iob": 0.186, "activity": 0.0048, "date": 1653113949000}, + { "iob": 0.064, "activity": 0.0041, "date": 1653114249000}, + { "iob": -0.005, "activity": 0.0034, "date": 1653114549000}, + { "iob": -0.12, "activity": 0.0026, "date": 1653114849000}, + { "iob": -0.181, "activity": 0.0018, "date": 1653115149000}, + { "iob": -0.287, "activity": 0.0008, "date": 1653115449000}, + { "iob": -0.34, "activity": 0, "date": 1653115749000}, + { "iob": -0.436, "activity": -0.001, "date": 1653116049000}, + { "iob": -0.48, "activity": -0.0018, "date": 1653116349000}, + { "iob": -0.519, "activity": -0.0026, "date": 1653116649000}, + { "iob": -0.554, "activity": -0.0034, "date": 1653116949000}, + { "iob": -0.585, "activity": -0.0041, "date": 1653117249000}, + { "iob": -0.662, "activity": -0.0049, "date": 1653117549000}, + { "iob": -0.687, "activity": -0.0055, "date": 1653117848000}, + { "iob": -0.708, "activity": -0.0061, "date": 1653118149000}, + { "iob": -0.726, "activity": -0.0066, "date": 1653118449000}, + { "iob": -0.351, "activity": -0.0071, "date": 1653118748000}, + { "iob": -0.218, "activity": -0.0064, "date": 1653119049000}, + { "iob": -0.088, "activity": -0.0055, "date": 1653119349000}, + { "iob": 13.594, "activity": 0.0023, "date": 1653119649000}, + { "iob": 13.552, "activity": 0.0331, "date": 1653119949000}, + { "iob": 13.224, "activity": 0.0573, "date": 1653120249000}, + { "iob": 12.838, "activity": 0.076, "date": 1653120548000}, + { "iob": 12.322, "activity": 0.09, "date": 1653120849000}, + { "iob": 11.794, "activity": 0.1001, "date": 1653121149000}, + { "iob": 11.177, "activity": 0.1068, "date": 1653121449000}, + { "iob": 10.58, "activity": 0.111, "date": 1653121749000}, + { "iob": 9.919, "activity": 0.1129, "date": 1653122049000}, + { "iob": 9.254, "activity": 0.1129, "date": 1653122349000}, + { "iob": 8.643, "activity": 0.1114, "date": 1653122649000}, + { "iob": 7.992, "activity": 0.1088, "date": 1653122949000}, + { "iob": 7.406, "activity": 0.1053, "date": 1653123248000}, + { "iob": 7.111, "activity": 0.1012, "date": 1653123549000}, + { "iob": 6.515, "activity": 0.0971, "date": 1653123849000}, + { "iob": 5.99, "activity": 0.0927, "date": 1653124149000}, + { "iob": 5.439, "activity": 0.0878, "date": 1653124448000}, + { "iob": 4.962, "activity": 0.0828, "date": 1653124749000}, + { "iob": 4.462, "activity": 0.0775, "date": 1653125048000}, + { "iob": 4.036, "activity": 0.0724, "date": 1653125349000}, + { "iob": 3.638, "activity": 0.0672, "date": 1653125649000}, + { "iob": 3.214, "activity": 0.0621, "date": 1653125948000}, + { "iob": 2.866, "activity": 0.0571, "date": 1653126249000}, + { "iob": 2.494, "activity": 0.0522, "date": 1653126549000}, + { "iob": 2.193, "activity": 0.0476, "date": 1653126849000}, + { "iob": 1.867, "activity": 0.0431, "date": 1653127149000}, + { "iob": 1.563, "activity": 0.0388, "date": 1653127449000}, + { "iob": 1.329, "activity": 0.0347, "date": 1653127748000}, + { "iob": 1.115, "activity": 0.0309, "date": 1653128049000}, + { "iob": 0.87, "activity": 0.0272, "date": 1653128349000}, + { "iob": 0.692, "activity": 0.0239, "date": 1653128649000}, + { "iob": 0.482, "activity": 0.0206, "date": 1653128948000}, + { "iob": 0.287, "activity": 0.0176, "date": 1653129249000}, + { "iob": 0.156, "activity": 0.0148, "date": 1653129548000}, + { "iob": 0.038, "activity": 0.0122, "date": 1653129848000}, + { "iob": -0.067, "activity": 0.0099, "date": 1653130149000}, + { "iob": -0.161, "activity": 0.0078, "date": 1653130448000}, + { "iob": -0.195, "activity": 0.006, "date": 1653130748000}, + { "iob": -0.271, "activity": 0.0044, "date": 1653131049000}, + { "iob": -0.339, "activity": 0.0029, "date": 1653131349000}, + { "iob": -0.4, "activity": 0.0015, "date": 1653131649000}, + { "iob": -0.155, "activity": 0.0007, "date": 1653131948000}, + { "iob": 8.11, "activity": 0.0045, "date": 1653132249000}, + { "iob": 7.992, "activity": 0.0222, "date": 1653132549000}, + { "iob": 7.745, "activity": 0.0359, "date": 1653132849000}, + { "iob": 7.488, "activity": 0.0465, "date": 1653133149000}, + { "iob": 7.136, "activity": 0.0541, "date": 1653133449000}, + { "iob": 6.8, "activity": 0.0596, "date": 1653133749000}, + { "iob": 6.441, "activity": 0.0633, "date": 1653134049000}, + { "iob": 6.022, "activity": 0.0651, "date": 1653134349000}, + { "iob": 5.644, "activity": 0.0657, "date": 1653134649000}, + { "iob": 5.216, "activity": 0.0653, "date": 1653134949000}, + { "iob": 4.962, "activity": 0.0644, "date": 1653135249000}, + { "iob": 4.544, "activity": 0.0627, "date": 1653135549000}, + { "iob": 4.185, "activity": 0.0606, "date": 1653135849000}, + { "iob": 3.839, "activity": 0.058, "date": 1653136149000}, + { "iob": 3.456, "activity": 0.055, "date": 1653136449000}, + { "iob": 3.139, "activity": 0.0519, "date": 1653136749000}, + { "iob": 2.788, "activity": 0.0486, "date": 1653137049000}, + { "iob": 2.503, "activity": 0.0453, "date": 1653137350000}, + { "iob": 2.186, "activity": 0.0418, "date": 1653137649000}, + { "iob": 3.17, "activity": 0.0407, "date": 1653137949000}, + { "iob": 3.956, "activity": 0.0413, "date": 1653138249000}, + { "iob": 3.648, "activity": 0.042, "date": 1653138549000}, + { "iob": 4.126, "activity": 0.043, "date": 1653138849000}, + { "iob": 3.81, "activity": 0.0437, "date": 1653139150000}, + { "iob": 3.541, "activity": 0.0437, "date": 1653139450000}, + { "iob": 3.272, "activity": 0.0431, "date": 1653139749000}, + { "iob": 3.588, "activity": 0.0428, "date": 1653140049000}, + { "iob": 3.875, "activity": 0.0431, "date": 1653140349000}, + { "iob": 3.608, "activity": 0.0434, "date": 1653140648000}, + { "iob": 4.271, "activity": 0.0442, "date": 1653140949000}, + { "iob": 3.996, "activity": 0.0452, "date": 1653141249000}, + { "iob": 4.298, "activity": 0.0462, "date": 1653141548000}, + { "iob": 4.015, "activity": 0.0468, "date": 1653141849000}, + { "iob": 4.538, "activity": 0.0481, "date": 1653142149000}, + { "iob": 4.245, "activity": 0.0489, "date": 1653142449000}, + { "iob": 4.729, "activity": 0.05, "date": 1653142749000}, + { "iob": 4.426, "activity": 0.0508, "date": 1653143049000}, + { "iob": 4.353, "activity": 0.051, "date": 1653143349000}, + { "iob": 4.049, "activity": 0.0507, "date": 1653143650000}, + { "iob": 3.747, "activity": 0.0498, "date": 1653143949000}, + { "iob": 3.402, "activity": 0.0483, "date": 1653144249000}, + { "iob": 3.115, "activity": 0.0464, "date": 1653144550000}, + { "iob": 2.788, "activity": 0.0441, "date": 1653144849000}, + { "iob": 2.524, "activity": 0.0417, "date": 1653145149000}, + { "iob": 2.271, "activity": 0.0391, "date": 1653145449000}, + { "iob": 2.033, "activity": 0.0365, "date": 1653145750000}, + { "iob": 1.807, "activity": 0.0338, "date": 1653146050000}, + { "iob": 1.594, "activity": 0.0312, "date": 1653146349000}, + { "iob": 1.395, "activity": 0.0286, "date": 1653146650000}, + { "iob": 1.258, "activity": 0.0262, "date": 1653146949000}, + { "iob": 1.034, "activity": 0.0236, "date": 1653147249000}, + { "iob": 0.971, "activity": 0.0215, "date": 1653147549000}, + { "iob": 1.008, "activity": 0.0197, "date": 1653147849000}, + { "iob": 0.963, "activity": 0.0183, "date": 1653148149000}, + { "iob": 1.046, "activity": 0.0171, "date": 1653148450000}, + { "iob": 0.912, "activity": 0.0161, "date": 1653148749000}, + { "iob": 1.254, "activity": 0.0156, "date": 1653149049000}, + { "iob": 1.176, "activity": 0.0154, "date": 1653149349000}, + { "iob": 1.051, "activity": 0.0149, "date": 1653149650000}, + { "iob": 0.928, "activity": 0.0142, "date": 1653149949000}, + { "iob": 1.008, "activity": 0.0138, "date": 1653150249000}, + { "iob": 0.89, "activity": 0.0133, "date": 1653150549000}, + { "iob": 0.775, "activity": 0.0127, "date": 1653150849000}, + { "iob": 0.664, "activity": 0.0118, "date": 1653151149000}, + { "iob": 0.606, "activity": 0.011, "date": 1653151449000}, + { "iob": 0.703, "activity": 0.0105, "date": 1653151749000}, + { "iob": 0.702, "activity": 0.0101, "date": 1653152049000}, + { "iob": 0.902, "activity": 0.0101, "date": 1653152349000}, + { "iob": 0.801, "activity": 0.0101, "date": 1653152649000}, + { "iob": 0.701, "activity": 0.0098, "date": 1653152949000}, + { "iob": 0.603, "activity": 0.0094, "date": 1653153249000}, + { "iob": 0.508, "activity": 0.0088, "date": 1653153549000}, + { "iob": 0.415, "activity": 0.0081, "date": 1653153849000}, + { "iob": 0.327, "activity": 0.0074, "date": 1653154149000}, + { "iob": 0.242, "activity": 0.0066, "date": 1653154449000}, + { "iob": 0.161, "activity": 0.0058, "date": 1653154749000}, + { "iob": 0.134, "activity": 0.005, "date": 1653155049000}, + { "iob": 0.4, "activity": 0.0048, "date": 1653155349000}, + { "iob": 0.475, "activity": 0.0049, "date": 1653155649000}, + { "iob": 0.401, "activity": 0.005, "date": 1653155950000}, + { "iob": 0.327, "activity": 0.0048, "date": 1653156250000}, + { "iob": 0.203, "activity": 0.0044, "date": 1653156549000}, + { "iob": 0.132, "activity": 0.004, "date": 1653156849000}, + { "iob": 0.064, "activity": 0.0034, "date": 1653157149000}, + { "iob": -0.002, "activity": 0.0028, "date": 1653157449000}, + { "iob": -0.064, "activity": 0.0022, "date": 1653157750000}, + { "iob": -0.073, "activity": 0.0016, "date": 1653158049000}, + { "iob": -0.08, "activity": 0.0011, "date": 1653158349000}, + { "iob": -0.085, "activity": 0.0007, "date": 1653158649000}, + { "iob": -0.087, "activity": 0.0004, "date": 1653158949000}, + { "iob": -0.088, "activity": 0.0001, "date": 1653159249000}, + { "iob": -0.088, "activity": -0.0001, "date": 1653159549000}, + { "iob": -0.137, "activity": -0.0004, "date": 1653159849000}, + { "iob": -0.184, "activity": -0.0007, "date": 1653160150000}, + { "iob": -0.18, "activity": -0.001, "date": 1653160449000}, + { "iob": -0.175, "activity": -0.0012, "date": 1653160749000}, + { "iob": -0.168, "activity": -0.0014, "date": 1653161049000}, + { "iob": -0.211, "activity": -0.0015, "date": 1653161350000}, + { "iob": -0.203, "activity": -0.0017, "date": 1653161649000}, + { "iob": -0.243, "activity": -0.002, "date": 1653161950000}, + { "iob": -0.282, "activity": -0.0023, "date": 1653162250000}, + { "iob": -0.32, "activity": -0.0026, "date": 1653162549000}, + { "iob": -0.357, "activity": -0.0029, "date": 1653162850000}, + { "iob": -0.391, "activity": -0.0032, "date": 1653163150000}, + { "iob": -0.375, "activity": -0.0035, "date": 1653163449000}, + { "iob": -0.357, "activity": -0.0036, "date": 1653163749000}, + { "iob": -0.149, "activity": -0.0035, "date": 1653164049000}, + { "iob": -0.132, "activity": -0.0031, "date": 1653164350000}, + { "iob": 9.296, "activity": 0.015, "date": 1653164649000}, + { "iob": 9.123, "activity": 0.0332, "date": 1653164950000}, + { "iob": 8.96, "activity": 0.0474, "date": 1653165249000}, + { "iob": 8.644, "activity": 0.0584, "date": 1653165550000}, + { "iob": 8.282, "activity": 0.0664, "date": 1653165850000}, + { "iob": 7.835, "activity": 0.0718, "date": 1653166149000}, + { "iob": 7.416, "activity": 0.0753, "date": 1653166450000}, + { "iob": 6.984, "activity": 0.0772, "date": 1653166749000}, + { "iob": 6.547, "activity": 0.0776, "date": 1653167049000}, + { "iob": 6.061, "activity": 0.0769, "date": 1653167350000}, + { "iob": 5.68, "activity": 0.0754, "date": 1653167650000}, + { "iob": 5.458, "activity": 0.0734, "date": 1653167949000}, + { "iob": 5.046, "activity": 0.0712, "date": 1653168250000}, + { "iob": 4.925, "activity": 0.069, "date": 1653168549000}, + { "iob": 4.487, "activity": 0.0663, "date": 1653168849000}, + { "iob": 4.113, "activity": 0.0633, "date": 1653169150000}, + { "iob": 3.706, "activity": 0.0599, "date": 1653169449000}, + { "iob": 3.363, "activity": 0.0566, "date": 1653169749000}, + { "iob": 3.039, "activity": 0.053, "date": 1653170049000}, + { "iob": 2.733, "activity": 0.0494, "date": 1653170350000}, + { "iob": 2.395, "activity": 0.0457, "date": 1653170650000}, + { "iob": 2.126, "activity": 0.0421, "date": 1653170950000}, + { "iob": 1.824, "activity": 0.0385, "date": 1653171250000}, + { "iob": 1.64, "activity": 0.0351, "date": 1653171549000}, + { "iob": 1.473, "activity": 0.0319, "date": 1653171849000}, + { "iob": 1.273, "activity": 0.0288, "date": 1653172150000}, + { "iob": 1.136, "activity": 0.026, "date": 1653172450000}, + { "iob": 1.011, "activity": 0.0235, "date": 1653172749000}, + { "iob": 0.852, "activity": 0.021, "date": 1653173050000}, + { "iob": 0.752, "activity": 0.0189, "date": 1653173350000}, + { "iob": 0.662, "activity": 0.0169, "date": 1653173650000}, + { "iob": 0.534, "activity": 0.0149, "date": 1653173949000}, + { "iob": 0.463, "activity": 0.0132, "date": 1653174249000}, + { "iob": 0.352, "activity": 0.0115, "date": 1653174550000}, + { "iob": 0.298, "activity": 0.0101, "date": 1653174850000}, + { "iob": 0.25, "activity": 0.0089, "date": 1653175149000}, + { "iob": 0.329, "activity": 0.0079, "date": 1653175450000}, + { "iob": 0.34, "activity": 0.0074, "date": 1653175750000}, + { "iob": 0.304, "activity": 0.0068, "date": 1653176050000}, + { "iob": 0.272, "activity": 0.0062, "date": 1653176350000}, + { "iob": 0.512, "activity": 0.006, "date": 1653176650000}, + { "iob": 0.581, "activity": 0.0061, "date": 1653176950000}, + { "iob": 1.238, "activity": 0.0075, "date": 1653177250000}, + { "iob": 1.147, "activity": 0.0088, "date": 1653177550000}, + { "iob": 1.151, "activity": 0.0098, "date": 1653177850000}, + { "iob": 1.05, "activity": 0.0104, "date": 1653178149000}, + { "iob": 0.947, "activity": 0.0107, "date": 1653178449000}, + { "iob": 0.844, "activity": 0.0106, "date": 1653178750000}, + { "iob": 0.741, "activity": 0.0104, "date": 1653179050000}, + { "iob": 0.59, "activity": 0.0099, "date": 1653179350000}, + { "iob": 0.542, "activity": 0.0093, "date": 1653179649000}, + { "iob": 0.497, "activity": 0.0087, "date": 1653179949000}, + { "iob": 0.456, "activity": 0.0081, "date": 1653180250000}, + { "iob": 0.516, "activity": 0.0077, "date": 1653180549000}, + { "iob": 0.429, "activity": 0.0072, "date": 1653180849000}, + { "iob": 0.294, "activity": 0.0066, "date": 1653181150000}, + { "iob": 0.163, "activity": 0.0058, "date": 1653181450000}, + { "iob": 0.037, "activity": 0.0049, "date": 1653181750000}, + { "iob": -0.085, "activity": 0.0039, "date": 1653182050000}, + { "iob": -0.153, "activity": 0.0029, "date": 1653182349000}, + { "iob": -0.265, "activity": 0.0018, "date": 1653182650000}, + { "iob": -0.371, "activity": 0.0007, "date": 1653182949000}, + { "iob": -0.471, "activity": -0.0005, "date": 1653183249000}, + { "iob": -0.566, "activity": -0.0016, "date": 1653183550000}, + { "iob": -0.606, "activity": -0.0026, "date": 1653183850000}, + { "iob": -0.64, "activity": -0.0036, "date": 1653184150000}, + { "iob": -0.67, "activity": -0.0044, "date": 1653184450000} +] + diff --git a/app/src/test/res/autotune/test2/profile.pump.json b/app/src/test/res/autotune/test2/profile.pump.json new file mode 100644 index 0000000000..eefadabacb --- /dev/null +++ b/app/src/test/res/autotune/test2/profile.pump.json @@ -0,0 +1,147 @@ +{ + "name": "Tuned Dyn2", + "min_5m_carbimpact": 8, + "dia": 6, + "curve": "ultra-rapid", + "useCustomPeakTime": true, + "insulinPeakTime": 45, + "basalprofile": [ + { + "start": "00:00:00", + "minutes": 0, + "rate": 0.966 + }, + { + "start": "01:00:00", + "minutes": 60, + "rate": 0.977 + }, + { + "start": "02:00:00", + "minutes": 120, + "rate": 0.971 + }, + { + "start": "03:00:00", + "minutes": 180, + "rate": 1.111 + }, + { + "start": "04:00:00", + "minutes": 240, + "rate": 0.974 + }, + { + "start": "05:00:00", + "minutes": 300, + "rate": 0.923 + }, + { + "start": "06:00:00", + "minutes": 360, + "rate": 0.823 + }, + { + "start": "07:00:00", + "minutes": 420, + "rate": 0.855 + }, + { + "start": "08:00:00", + "minutes": 480, + "rate": 0.902 + }, + { + "start": "09:00:00", + "minutes": 540, + "rate": 0.934 + }, + { + "start": "10:00:00", + "minutes": 600, + "rate": 0.938 + }, + { + "start": "11:00:00", + "minutes": 660, + "rate": 0.903 + }, + { + "start": "12:00:00", + "minutes": 720, + "rate": 0.882 + }, + { + "start": "13:00:00", + "minutes": 780, + "rate": 0.874 + }, + { + "start": "14:00:00", + "minutes": 840, + "rate": 0.866 + }, + { + "start": "15:00:00", + "minutes": 900, + "rate": 0.848 + }, + { + "start": "16:00:00", + "minutes": 960, + "rate": 0.758 + }, + { + "start": "17:00:00", + "minutes": 1020, + "rate": 0.65 + }, + { + "start": "18:00:00", + "minutes": 1080, + "rate": 0.648 + }, + { + "start": "19:00:00", + "minutes": 1140, + "rate": 0.738 + }, + { + "start": "20:00:00", + "minutes": 1200, + "rate": 0.847 + }, + { + "start": "21:00:00", + "minutes": 1260, + "rate": 0.861 + }, + { + "start": "22:00:00", + "minutes": 1320, + "rate": 0.863 + }, + { + "start": "23:00:00", + "minutes": 1380, + "rate": 0.843 + } + ], + "isfProfile": { + "sensitivities": [ + { + "i": 0, + "start": "00:00:00", + "sensitivity": 86.2, + "offset": 0, + "x": 0, + "endoffset": 1440 + } + ] + }, + "carb_ratio": 5.75, + "autosens_max": 1.3, + "autosens_min": 0.7, + "units": "mg/dl", + "timezone": "Europe/Paris" +} diff --git a/app/src/test/res/autotune/test3/aaps-entries.2022-05-21.json b/app/src/test/res/autotune/test3/aaps-entries.2022-05-21.json new file mode 100644 index 0000000000..70c349e9d8 --- /dev/null +++ b/app/src/test/res/autotune/test3/aaps-entries.2022-05-21.json @@ -0,0 +1,2882 @@ +[ + { + "device": "AndroidAPS-DexcomG6", + "date": 1653184750000, + "dateString": "2022-05-22T01:59:10.000Z", + "isValid": true, + "sgv": 80, + "direction": "Flat", + "type": "sgv", + "_id": "6289990761a8290004740388" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653184450000, + "dateString": "2022-05-22T01:54:10.000Z", + "isValid": true, + "sgv": 80, + "direction": "Flat", + "type": "sgv", + "_id": "628997d861a8290004740385" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653184150000, + "dateString": "2022-05-22T01:49:10.000Z", + "isValid": true, + "sgv": 80, + "direction": "Flat", + "type": "sgv", + "_id": "628996a961a8290004740382" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653183850000, + "dateString": "2022-05-22T01:44:10.000Z", + "isValid": true, + "sgv": 79, + "direction": "Flat", + "type": "sgv", + "_id": "6289957b61a829000474037f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653183550000, + "dateString": "2022-05-22T01:39:10.000Z", + "isValid": true, + "sgv": 76, + "direction": "Flat", + "type": "sgv", + "_id": "6289945f50e51d0004429e6d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653183249000, + "dateString": "2022-05-22T01:34:09.000Z", + "isValid": true, + "sgv": 73, + "direction": "Flat", + "type": "sgv", + "_id": "6289933050e51d0004429e6b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653182949000, + "dateString": "2022-05-22T01:29:09.000Z", + "isValid": true, + "sgv": 72, + "direction": "Flat", + "type": "sgv", + "_id": "6289920150e51d0004429e69" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653182650000, + "dateString": "2022-05-22T01:24:10.000Z", + "isValid": true, + "sgv": 74, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "628990d350e51d0004429e67" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653182349000, + "dateString": "2022-05-22T01:19:09.000Z", + "isValid": true, + "sgv": 77, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62898fa550e51d0004429e65" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653182050000, + "dateString": "2022-05-22T01:14:10.000Z", + "isValid": true, + "sgv": 81, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62898e7650e51d0004429e63" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653181750000, + "dateString": "2022-05-22T01:09:10.000Z", + "isValid": true, + "sgv": 87, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62898d4750e51d0004429e5f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653181450000, + "dateString": "2022-05-22T01:04:10.000Z", + "isValid": true, + "sgv": 92, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62898c2fda46aa0004d1e0fc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653181150000, + "dateString": "2022-05-22T00:59:10.000Z", + "isValid": true, + "sgv": 97, + "direction": "SingleDown", + "type": "sgv", + "_id": "62898b01da46aa0004d1e0fa" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653180849000, + "dateString": "2022-05-22T00:54:09.000Z", + "isValid": true, + "sgv": 105, + "direction": "SingleDown", + "type": "sgv", + "_id": "628989d2da46aa0004d1e0f8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653180549000, + "dateString": "2022-05-22T00:49:09.000Z", + "isValid": true, + "sgv": 121, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "628988a3da46aa0004d1e0f5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653180250000, + "dateString": "2022-05-22T00:44:10.000Z", + "isValid": true, + "sgv": 135, + "direction": "Flat", + "type": "sgv", + "_id": "62898774da46aa0004d1e0f1" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653179949000, + "dateString": "2022-05-22T00:39:09.000Z", + "isValid": true, + "sgv": 143, + "direction": "Flat", + "type": "sgv", + "_id": "62898645da46aa0004d1e0ee" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653179649000, + "dateString": "2022-05-22T00:34:09.000Z", + "isValid": true, + "sgv": 143, + "direction": "Flat", + "type": "sgv", + "_id": "62898517da46aa0004d1e0ea" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653179350000, + "dateString": "2022-05-22T00:29:10.000Z", + "isValid": true, + "sgv": 142, + "direction": "Flat", + "type": "sgv", + "_id": "628983f69d6f1800047cd0dd" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653179050000, + "dateString": "2022-05-22T00:24:10.000Z", + "isValid": true, + "sgv": 142, + "direction": "Flat", + "type": "sgv", + "_id": "628982c89d6f1800047cd0db" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653178750000, + "dateString": "2022-05-22T00:19:10.000Z", + "isValid": true, + "sgv": 144, + "direction": "Flat", + "type": "sgv", + "_id": "628981999d6f1800047cd0d8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653178449000, + "dateString": "2022-05-22T00:14:09.000Z", + "isValid": true, + "sgv": 147, + "direction": "Flat", + "type": "sgv", + "_id": "6289806a9d6f1800047cd0d6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653178149000, + "dateString": "2022-05-22T00:09:09.000Z", + "isValid": true, + "sgv": 149, + "direction": "Flat", + "type": "sgv", + "_id": "62897f3b9d6f1800047cd0d3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653177850000, + "dateString": "2022-05-22T00:04:10.000Z", + "isValid": true, + "sgv": 149, + "direction": "Flat", + "type": "sgv", + "_id": "62897e0c9d6f1800047cd0d0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653177550000, + "dateString": "2022-05-21T23:59:10.000Z", + "isValid": true, + "sgv": 147, + "direction": "Flat", + "type": "sgv", + "_id": "62897cde9d6f1800047cd0cc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653177250000, + "dateString": "2022-05-21T23:54:10.000Z", + "isValid": true, + "sgv": 146, + "direction": "Flat", + "type": "sgv", + "_id": "62897bc89d6f1800047cd0c9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653176950000, + "dateString": "2022-05-21T23:49:10.000Z", + "isValid": true, + "sgv": 143, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62897a8771a363000480abca" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653176650000, + "dateString": "2022-05-21T23:44:10.000Z", + "isValid": true, + "sgv": 139, + "direction": "Flat", + "type": "sgv", + "_id": "6289797071a363000480abc7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653176350000, + "dateString": "2022-05-21T23:39:10.000Z", + "isValid": true, + "sgv": 132, + "direction": "Flat", + "type": "sgv", + "_id": "6289784271a363000480abc3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653176050000, + "dateString": "2022-05-21T23:34:10.000Z", + "isValid": true, + "sgv": 127, + "direction": "Flat", + "type": "sgv", + "_id": "6289771371a363000480abc1" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653175750000, + "dateString": "2022-05-21T23:29:10.000Z", + "isValid": true, + "sgv": 124, + "direction": "Flat", + "type": "sgv", + "_id": "628975e471a363000480abbe" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653175450000, + "dateString": "2022-05-21T23:24:10.000Z", + "isValid": true, + "sgv": 123, + "direction": "Flat", + "type": "sgv", + "_id": "628974b671a363000480abbc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653175149000, + "dateString": "2022-05-21T23:19:09.000Z", + "isValid": true, + "sgv": 120, + "direction": "Flat", + "type": "sgv", + "_id": "6289738f37d09a00043f2b26" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653174850000, + "dateString": "2022-05-21T23:14:10.000Z", + "isValid": true, + "sgv": 117, + "direction": "Flat", + "type": "sgv", + "_id": "6289727a37d09a00043f2b22" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653174550000, + "dateString": "2022-05-21T23:09:10.000Z", + "isValid": true, + "sgv": 114, + "direction": "Flat", + "type": "sgv", + "_id": "6289727937d09a00043f2b21" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653174249000, + "dateString": "2022-05-21T23:04:09.000Z", + "isValid": true, + "sgv": 111, + "direction": "Flat", + "type": "sgv", + "_id": "6289726037d09a00043f2b20" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653173949000, + "dateString": "2022-05-21T22:59:09.000Z", + "isValid": true, + "sgv": 108, + "direction": "Flat", + "type": "sgv", + "_id": "6289721437d09a00043f2b1f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653173650000, + "dateString": "2022-05-21T22:54:10.000Z", + "isValid": true, + "sgv": 108, + "direction": "Flat", + "type": "sgv", + "_id": "6289717d37d09a00043f2b1e" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653173350000, + "dateString": "2022-05-21T22:49:10.000Z", + "isValid": true, + "sgv": 110, + "direction": "Flat", + "type": "sgv", + "_id": "62896fb837d09a00043f2b1b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653173050000, + "dateString": "2022-05-21T22:44:10.000Z", + "isValid": true, + "sgv": 115, + "direction": "Flat", + "type": "sgv", + "_id": "62896f8537d09a00043f2b1a" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653172749000, + "dateString": "2022-05-21T22:39:09.000Z", + "isValid": true, + "sgv": 120, + "direction": "Flat", + "type": "sgv", + "_id": "62896e8937d09a00043f2b19" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653172450000, + "dateString": "2022-05-21T22:34:10.000Z", + "isValid": true, + "sgv": 124, + "direction": "Flat", + "type": "sgv", + "_id": "62896d8b37d09a00043f2b17" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653172150000, + "dateString": "2022-05-21T22:29:10.000Z", + "isValid": true, + "sgv": 124, + "direction": "Flat", + "type": "sgv", + "_id": "62896cda37d09a00043f2b16" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653171849000, + "dateString": "2022-05-21T22:24:09.000Z", + "isValid": true, + "sgv": 122, + "direction": "Flat", + "type": "sgv", + "_id": "62896c7537d09a00043f2b14" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653171549000, + "dateString": "2022-05-21T22:19:09.000Z", + "isValid": true, + "sgv": 120, + "direction": "Flat", + "type": "sgv", + "_id": "62896c1037d09a00043f2b13" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653171250000, + "dateString": "2022-05-21T22:14:10.000Z", + "isValid": true, + "sgv": 118, + "direction": "Flat", + "type": "sgv", + "_id": "62896b5f6a5ecf00042d5474" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653170950000, + "dateString": "2022-05-21T22:09:10.000Z", + "isValid": true, + "sgv": 117, + "direction": "Flat", + "type": "sgv", + "_id": "62896ac76a5ecf00042d5472" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653170650000, + "dateString": "2022-05-21T22:04:10.000Z", + "isValid": true, + "sgv": 115, + "direction": "Flat", + "type": "sgv", + "_id": "628969fd6a5ecf00042d5471" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653170350000, + "dateString": "2022-05-21T21:59:10.000Z", + "isValid": true, + "sgv": 112, + "direction": "Flat", + "type": "sgv", + "_id": "628969016a5ecf00042d5470" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653170049000, + "dateString": "2022-05-21T21:54:09.000Z", + "isValid": true, + "sgv": 110, + "direction": "Flat", + "type": "sgv", + "_id": "628967a06a5ecf00042d546e" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653169749000, + "dateString": "2022-05-21T21:49:09.000Z", + "isValid": true, + "sgv": 107, + "direction": "Flat", + "type": "sgv", + "_id": "628964906a5ecf00042d546b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653169449000, + "dateString": "2022-05-21T21:44:09.000Z", + "isValid": true, + "sgv": 105, + "direction": "Flat", + "type": "sgv", + "_id": "628961a4fb144900043c34ea" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653169150000, + "dateString": "2022-05-21T21:39:10.000Z", + "isValid": true, + "sgv": 102, + "direction": "Flat", + "type": "sgv", + "_id": "62895f5ffb144900043c34e8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653168849000, + "dateString": "2022-05-21T21:34:09.000Z", + "isValid": true, + "sgv": 100, + "direction": "Flat", + "type": "sgv", + "_id": "62895d98fb144900043c34e5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653168549000, + "dateString": "2022-05-21T21:29:09.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "62895b9a9bf1e6000482ffa1" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653168250000, + "dateString": "2022-05-21T21:24:10.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "628959ed9bf1e6000482ff9e" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653167949000, + "dateString": "2022-05-21T21:19:09.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "6289583f9bf1e6000482ff9b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653167650000, + "dateString": "2022-05-21T21:14:10.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "628956919bf1e6000482ff96" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653167350000, + "dateString": "2022-05-21T21:09:10.000Z", + "isValid": true, + "sgv": 99, + "direction": "Flat", + "type": "sgv", + "_id": "628955179bf1e6000482ff92" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653167049000, + "dateString": "2022-05-21T21:04:09.000Z", + "isValid": true, + "sgv": 101, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "628953e79bf1e6000482ff90" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653166749000, + "dateString": "2022-05-21T20:59:09.000Z", + "isValid": true, + "sgv": 104, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "628952c680fc7e00041b22a9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653166450000, + "dateString": "2022-05-21T20:54:10.000Z", + "isValid": true, + "sgv": 110, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6289519580fc7e00041b22a7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653166149000, + "dateString": "2022-05-21T20:49:09.000Z", + "isValid": true, + "sgv": 118, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6289506680fc7e00041b22a5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653165850000, + "dateString": "2022-05-21T20:44:10.000Z", + "isValid": true, + "sgv": 128, + "direction": "Flat", + "type": "sgv", + "_id": "62894f3880fc7e00041b22a3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653165550000, + "dateString": "2022-05-21T20:39:10.000Z", + "isValid": true, + "sgv": 139, + "direction": "Flat", + "type": "sgv", + "_id": "62894e0980fc7e00041b22a0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653165249000, + "dateString": "2022-05-21T20:34:09.000Z", + "isValid": true, + "sgv": 145, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62894cdb80fc7e00041b229e" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653164950000, + "dateString": "2022-05-21T20:29:10.000Z", + "isValid": true, + "sgv": 143, + "direction": "SingleUp", + "type": "sgv", + "_id": "62894bab80fc7e00041b229b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653164649000, + "dateString": "2022-05-21T20:24:09.000Z", + "isValid": true, + "sgv": 133, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62894a7e4493460004e63a38" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653164350000, + "dateString": "2022-05-21T20:19:10.000Z", + "isValid": true, + "sgv": 120, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6289496a4493460004e63a34" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653164049000, + "dateString": "2022-05-21T20:14:09.000Z", + "isValid": true, + "sgv": 109, + "direction": "Flat", + "type": "sgv", + "_id": "628948214493460004e63a31" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653163749000, + "dateString": "2022-05-21T20:09:09.000Z", + "isValid": true, + "sgv": 100, + "direction": "Flat", + "type": "sgv", + "_id": "6289470c4493460004e63a2d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653163449000, + "dateString": "2022-05-21T20:04:09.000Z", + "isValid": true, + "sgv": 95, + "direction": "Flat", + "type": "sgv", + "_id": "628945dc4493460004e63a2a" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653163150000, + "dateString": "2022-05-21T19:59:10.000Z", + "isValid": true, + "sgv": 91, + "direction": "Flat", + "type": "sgv", + "_id": "628944ae4493460004e63a27" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653162850000, + "dateString": "2022-05-21T19:54:10.000Z", + "isValid": true, + "sgv": 89, + "direction": "Flat", + "type": "sgv", + "_id": "6289437f4493460004e63a25" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653162549000, + "dateString": "2022-05-21T19:49:09.000Z", + "isValid": true, + "sgv": 88, + "direction": "Flat", + "type": "sgv", + "_id": "6289425f598f780004bb3b30" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653162250000, + "dateString": "2022-05-21T19:44:10.000Z", + "isValid": true, + "sgv": 89, + "direction": "Flat", + "type": "sgv", + "_id": "62894118598f780004bb3b2d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653161950000, + "dateString": "2022-05-21T19:39:10.000Z", + "isValid": true, + "sgv": 91, + "direction": "Flat", + "type": "sgv", + "_id": "62893feb598f780004bb3b2b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653161649000, + "dateString": "2022-05-21T19:34:09.000Z", + "isValid": true, + "sgv": 93, + "direction": "Flat", + "type": "sgv", + "_id": "62893ed7598f780004bb3b29" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653161350000, + "dateString": "2022-05-21T19:29:10.000Z", + "isValid": true, + "sgv": 94, + "direction": "Flat", + "type": "sgv", + "_id": "62893daa598f780004bb3b27" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653161049000, + "dateString": "2022-05-21T19:24:09.000Z", + "isValid": true, + "sgv": 95, + "direction": "Flat", + "type": "sgv", + "_id": "62893c7d598f780004bb3b24" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653160749000, + "dateString": "2022-05-21T19:19:09.000Z", + "isValid": true, + "sgv": 97, + "direction": "Flat", + "type": "sgv", + "_id": "62893b4f598f780004bb3b22" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653160449000, + "dateString": "2022-05-21T19:14:09.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "62893a1222fbc8000495b822" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653160150000, + "dateString": "2022-05-21T19:09:10.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "628938fe22fbc8000495b81f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653159849000, + "dateString": "2022-05-21T19:04:09.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "628937b822fbc8000495b81d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653159549000, + "dateString": "2022-05-21T18:59:09.000Z", + "isValid": true, + "sgv": 99, + "direction": "Flat", + "type": "sgv", + "_id": "628936a422fbc8000495b81a" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653159249000, + "dateString": "2022-05-21T18:54:09.000Z", + "isValid": true, + "sgv": 99, + "direction": "Flat", + "type": "sgv", + "_id": "6289357622fbc8000495b818" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653158949000, + "dateString": "2022-05-21T18:49:09.000Z", + "isValid": true, + "sgv": 100, + "direction": "Flat", + "type": "sgv", + "_id": "6289344a22fbc8000495b815" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653158649000, + "dateString": "2022-05-21T18:44:09.000Z", + "isValid": true, + "sgv": 101, + "direction": "Flat", + "type": "sgv", + "_id": "6289331c22fbc8000495b813" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653158349000, + "dateString": "2022-05-21T18:39:09.000Z", + "isValid": true, + "sgv": 102, + "direction": "Flat", + "type": "sgv", + "_id": "628931e9840d8d0004a20bff" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653158049000, + "dateString": "2022-05-21T18:34:09.000Z", + "isValid": true, + "sgv": 104, + "direction": "Flat", + "type": "sgv", + "_id": "628930bc840d8d0004a20bfd" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653157750000, + "dateString": "2022-05-21T18:29:10.000Z", + "isValid": true, + "sgv": 106, + "direction": "Flat", + "type": "sgv", + "_id": "62892f8f840d8d0004a20bfa" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653157449000, + "dateString": "2022-05-21T18:24:09.000Z", + "isValid": true, + "sgv": 108, + "direction": "Flat", + "type": "sgv", + "_id": "62892e62840d8d0004a20bf8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653157149000, + "dateString": "2022-05-21T18:19:09.000Z", + "isValid": true, + "sgv": 108, + "direction": "Flat", + "type": "sgv", + "_id": "62892d34840d8d0004a20bf5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653156849000, + "dateString": "2022-05-21T18:14:09.000Z", + "isValid": true, + "sgv": 110, + "direction": "Flat", + "type": "sgv", + "_id": "62892c06840d8d0004a20bf2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653156549000, + "dateString": "2022-05-21T18:09:09.000Z", + "isValid": true, + "sgv": 114, + "direction": "Flat", + "type": "sgv", + "_id": "62892af2840d8d0004a20bf0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653156250000, + "dateString": "2022-05-21T18:04:10.000Z", + "isValid": true, + "sgv": 119, + "direction": "Flat", + "type": "sgv", + "_id": "628929ac8809e60004c644e9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653155950000, + "dateString": "2022-05-21T17:59:10.000Z", + "isValid": true, + "sgv": 123, + "direction": "Flat", + "type": "sgv", + "_id": "6289287e8809e60004c644e6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653155649000, + "dateString": "2022-05-21T17:54:09.000Z", + "isValid": true, + "sgv": 124, + "direction": "Flat", + "type": "sgv", + "_id": "6289276a8809e60004c644e3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653155349000, + "dateString": "2022-05-21T17:49:09.000Z", + "isValid": true, + "sgv": 123, + "direction": "NONE", + "type": "sgv", + "_id": "6289263c8809e60004c644e1" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653155049000, + "dateString": "2022-05-21T17:44:09.000Z", + "isValid": true, + "sgv": 116, + "direction": "NONE", + "type": "sgv", + "_id": "6289250d8809e60004c644dd" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653154749000, + "dateString": "2022-05-21T17:39:09.000Z", + "isValid": true, + "sgv": 108, + "direction": "NONE", + "type": "sgv", + "_id": "628923df8809e60004c644d9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653154449000, + "dateString": "2022-05-21T17:34:09.000Z", + "isValid": true, + "sgv": 97, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "628922b18809e60004c644d6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653154149000, + "dateString": "2022-05-21T17:29:09.000Z", + "isValid": true, + "sgv": 93, + "direction": "SingleDown", + "type": "sgv", + "_id": "628921861090500004ca472b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653153849000, + "dateString": "2022-05-21T17:24:09.000Z", + "isValid": true, + "sgv": 96, + "direction": "SingleDown", + "type": "sgv", + "_id": "628920591090500004ca4727" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653153549000, + "dateString": "2022-05-21T17:19:09.000Z", + "isValid": true, + "sgv": 110, + "direction": "SingleDown", + "type": "sgv", + "_id": "62891f2b1090500004ca4724" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653153249000, + "dateString": "2022-05-21T17:14:09.000Z", + "isValid": true, + "sgv": 124, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62891dfd1090500004ca4722" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653152949000, + "dateString": "2022-05-21T17:09:09.000Z", + "isValid": true, + "sgv": 138, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62891cd01090500004ca471f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653152649000, + "dateString": "2022-05-21T17:04:09.000Z", + "isValid": true, + "sgv": 149, + "direction": "Flat", + "type": "sgv", + "_id": "62891ba31090500004ca471d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653152349000, + "dateString": "2022-05-21T16:59:09.000Z", + "isValid": true, + "sgv": 158, + "direction": "Flat", + "type": "sgv", + "_id": "62891a811090500004ca471a" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653152049000, + "dateString": "2022-05-21T16:54:09.000Z", + "isValid": true, + "sgv": 160, + "direction": "Flat", + "type": "sgv", + "_id": "628919531090500004ca4717" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653151749000, + "dateString": "2022-05-21T16:49:09.000Z", + "isValid": true, + "sgv": 159, + "direction": "Flat", + "type": "sgv", + "_id": "628918261090500004ca4714" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653151449000, + "dateString": "2022-05-21T16:44:09.000Z", + "isValid": true, + "sgv": 158, + "direction": "Flat", + "type": "sgv", + "_id": "628916f81090500004ca4710" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653151149000, + "dateString": "2022-05-21T16:39:09.000Z", + "isValid": true, + "sgv": 158, + "direction": "Flat", + "type": "sgv", + "_id": "628915ce1090500004ca470c" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653150849000, + "dateString": "2022-05-21T16:34:09.000Z", + "isValid": true, + "sgv": 161, + "direction": "Flat", + "type": "sgv", + "_id": "628914d01090500004ca4709" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653150549000, + "dateString": "2022-05-21T16:29:09.000Z", + "isValid": true, + "sgv": 165, + "direction": "Flat", + "type": "sgv", + "_id": "628913731090500004ca4706" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653150249000, + "dateString": "2022-05-21T16:24:09.000Z", + "isValid": true, + "sgv": 170, + "direction": "Flat", + "type": "sgv", + "_id": "628913111090500004ca4704" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653149949000, + "dateString": "2022-05-21T16:19:09.000Z", + "isValid": true, + "sgv": 172, + "direction": "Flat", + "type": "sgv", + "_id": "6289130f1090500004ca46ff" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653149650000, + "dateString": "2022-05-21T16:14:10.000Z", + "isValid": true, + "sgv": 173, + "direction": "Flat", + "type": "sgv", + "_id": "62890fff1090500004ca46fd" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653149349000, + "dateString": "2022-05-21T16:09:09.000Z", + "isValid": true, + "sgv": 174, + "direction": "Flat", + "type": "sgv", + "_id": "62890edacf7ee10004a2b1e2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653149049000, + "dateString": "2022-05-21T16:04:09.000Z", + "isValid": true, + "sgv": 176, + "direction": "Flat", + "type": "sgv", + "_id": "62890daccf7ee10004a2b1de" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653148749000, + "dateString": "2022-05-21T15:59:09.000Z", + "isValid": true, + "sgv": 176, + "direction": "Flat", + "type": "sgv", + "_id": "62890c64cf7ee10004a2b1da" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653148450000, + "dateString": "2022-05-21T15:54:10.000Z", + "isValid": true, + "sgv": 176, + "direction": "Flat", + "type": "sgv", + "_id": "62890b36cf7ee10004a2b1d7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653148149000, + "dateString": "2022-05-21T15:49:09.000Z", + "isValid": true, + "sgv": 174, + "direction": "Flat", + "type": "sgv", + "_id": "62890a21cf7ee10004a2b1d3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653147849000, + "dateString": "2022-05-21T15:44:09.000Z", + "isValid": true, + "sgv": 175, + "direction": "Flat", + "type": "sgv", + "_id": "628908f3cf7ee10004a2b1d1" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653147549000, + "dateString": "2022-05-21T15:39:09.000Z", + "isValid": true, + "sgv": 176, + "direction": "Flat", + "type": "sgv", + "_id": "628907c5cf7ee10004a2b1ce" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653147249000, + "dateString": "2022-05-21T15:34:09.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "_id": "6289067fc9346b0004863369" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653146949000, + "dateString": "2022-05-21T15:29:09.000Z", + "isValid": true, + "sgv": 178, + "direction": "Flat", + "type": "sgv", + "_id": "6289056ac9346b0004863366" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653146650000, + "dateString": "2022-05-21T15:24:10.000Z", + "isValid": true, + "sgv": 178, + "direction": "Flat", + "type": "sgv", + "_id": "6289043cc9346b0004863363" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653146349000, + "dateString": "2022-05-21T15:19:09.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "_id": "6289030ec9346b0004863361" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653146050000, + "dateString": "2022-05-21T15:14:10.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "_id": "628901e0c9346b000486335f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653145750000, + "dateString": "2022-05-21T15:09:10.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "_id": "628900b2c9346b000486335d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653145449000, + "dateString": "2022-05-21T15:04:09.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "_id": "6288ff9ec9346b000486335b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653145149000, + "dateString": "2022-05-21T14:59:09.000Z", + "isValid": true, + "sgv": 176, + "direction": "Flat", + "type": "sgv", + "_id": "6288fe56c9346b0004863359" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653144849000, + "dateString": "2022-05-21T14:54:09.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "_id": "6288fd270e0c880004d58de7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653144550000, + "dateString": "2022-05-21T14:49:10.000Z", + "isValid": true, + "sgv": 178, + "direction": "Flat", + "type": "sgv", + "_id": "6288fbf90e0c880004d58de5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653144249000, + "dateString": "2022-05-21T14:44:09.000Z", + "isValid": true, + "sgv": 180, + "direction": "Flat", + "type": "sgv", + "_id": "6288facb0e0c880004d58de3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653143949000, + "dateString": "2022-05-21T14:39:09.000Z", + "isValid": true, + "sgv": 184, + "direction": "Flat", + "type": "sgv", + "_id": "6288f9b60e0c880004d58de0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653143650000, + "dateString": "2022-05-21T14:34:10.000Z", + "isValid": true, + "sgv": 185, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f8880e0c880004d58dde" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653143349000, + "dateString": "2022-05-21T14:29:09.000Z", + "isValid": true, + "sgv": 182, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f75a0e0c880004d58ddb" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653143049000, + "dateString": "2022-05-21T14:24:09.000Z", + "isValid": true, + "sgv": 174, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f62c0e0c880004d58dd8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653142749000, + "dateString": "2022-05-21T14:19:09.000Z", + "isValid": true, + "sgv": 166, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f4f72634cd0004296074" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653142449000, + "dateString": "2022-05-21T14:14:09.000Z", + "isValid": true, + "sgv": 160, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f3c92634cd0004296071" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653142149000, + "dateString": "2022-05-21T14:09:09.000Z", + "isValid": true, + "sgv": 155, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f29b2634cd000429606f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653141849000, + "dateString": "2022-05-21T14:04:09.000Z", + "isValid": true, + "sgv": 147, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f16d2634cd000429606c" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653141548000, + "dateString": "2022-05-21T13:59:08.000Z", + "isValid": true, + "sgv": 139, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288f03f2634cd000429606a" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653141249000, + "dateString": "2022-05-21T13:54:09.000Z", + "isValid": true, + "sgv": 131, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288ef2a2634cd0004296067" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653140949000, + "dateString": "2022-05-21T13:49:09.000Z", + "isValid": true, + "sgv": 126, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288edfc2634cd0004296065" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653140648000, + "dateString": "2022-05-21T13:44:08.000Z", + "isValid": true, + "sgv": 121, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288ecca0f1be700041e5a0b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653140349000, + "dateString": "2022-05-21T13:39:09.000Z", + "isValid": true, + "sgv": 114, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288eb9d0f1be700041e5a09" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653140049000, + "dateString": "2022-05-21T13:34:09.000Z", + "isValid": true, + "sgv": 105, + "direction": "Flat", + "type": "sgv", + "_id": "6288ea6e0f1be700041e5a06" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653139749000, + "dateString": "2022-05-21T13:29:09.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "6288e9410f1be700041e5a03" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653139450000, + "dateString": "2022-05-21T13:24:10.000Z", + "isValid": true, + "sgv": 94, + "direction": "Flat", + "type": "sgv", + "_id": "6288e82c0f1be700041e5a00" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653139150000, + "dateString": "2022-05-21T13:19:10.000Z", + "isValid": true, + "sgv": 93, + "direction": "Flat", + "type": "sgv", + "_id": "6288e7030f1be700041e59fd" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653138849000, + "dateString": "2022-05-21T13:14:09.000Z", + "isValid": true, + "sgv": 94, + "direction": "Flat", + "type": "sgv", + "_id": "6288e5d00f1be700041e59fb" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653138549000, + "dateString": "2022-05-21T13:09:09.000Z", + "isValid": true, + "sgv": 95, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288e4900f1be700041e59f8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653138249000, + "dateString": "2022-05-21T13:04:09.000Z", + "isValid": true, + "sgv": 93, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288e3610f1be700041e59f6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653137949000, + "dateString": "2022-05-21T12:59:09.000Z", + "isValid": true, + "sgv": 86, + "direction": "Flat", + "type": "sgv", + "_id": "6288e24c0f1be700041e59f3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653137649000, + "dateString": "2022-05-21T12:54:09.000Z", + "isValid": true, + "sgv": 79, + "direction": "Flat", + "type": "sgv", + "_id": "6288e1040f1be700041e59f0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653137350000, + "dateString": "2022-05-21T12:49:10.000Z", + "isValid": true, + "sgv": 72, + "direction": "Flat", + "type": "sgv", + "_id": "6288dfd60f1be700041e59ee" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653137049000, + "dateString": "2022-05-21T12:44:09.000Z", + "isValid": true, + "sgv": 69, + "direction": "Flat", + "type": "sgv", + "_id": "6288df8a0f1be700041e59ec" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653136749000, + "dateString": "2022-05-21T12:39:09.000Z", + "isValid": true, + "sgv": 68, + "direction": "Flat", + "type": "sgv", + "_id": "6288de580f1be700041e59ea" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653136449000, + "dateString": "2022-05-21T12:34:09.000Z", + "isValid": true, + "sgv": 70, + "direction": "Flat", + "type": "sgv", + "_id": "6288dd270f1be700041e59e8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653136149000, + "dateString": "2022-05-21T12:29:09.000Z", + "isValid": true, + "sgv": 73, + "direction": "Flat", + "type": "sgv", + "_id": "6288db8a0f1be700041e59e5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653135849000, + "dateString": "2022-05-21T12:24:09.000Z", + "isValid": true, + "sgv": 76, + "direction": "Flat", + "type": "sgv", + "_id": "6288d9fb0f1be700041e59e2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653135549000, + "dateString": "2022-05-21T12:19:09.000Z", + "isValid": true, + "sgv": 78, + "direction": "Flat", + "type": "sgv", + "_id": "6288d8e00f1be700041e59e0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653135249000, + "dateString": "2022-05-21T12:14:09.000Z", + "isValid": true, + "sgv": 79, + "direction": "Flat", + "type": "sgv", + "_id": "6288d7ae0f1be700041e59de" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653134949000, + "dateString": "2022-05-21T12:09:09.000Z", + "isValid": true, + "sgv": 78, + "direction": "Flat", + "type": "sgv", + "_id": "6288d67f0f1be700041e59da" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653134649000, + "dateString": "2022-05-21T12:04:09.000Z", + "isValid": true, + "sgv": 77, + "direction": "Flat", + "type": "sgv", + "_id": "6288d5500f1be700041e59d7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653134349000, + "dateString": "2022-05-21T11:59:09.000Z", + "isValid": true, + "sgv": 76, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288d4220f1be700041e59d5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653134049000, + "dateString": "2022-05-21T11:54:09.000Z", + "isValid": true, + "sgv": 79, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288d3060f1be700041e59d2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653133749000, + "dateString": "2022-05-21T11:49:09.000Z", + "isValid": true, + "sgv": 87, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288d1d80f1be700041e59cf" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653133449000, + "dateString": "2022-05-21T11:44:09.000Z", + "isValid": true, + "sgv": 101, + "direction": "Flat", + "type": "sgv", + "_id": "6288d0a80f1be700041e59cb" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653133149000, + "dateString": "2022-05-21T11:39:09.000Z", + "isValid": true, + "sgv": 114, + "direction": "Flat", + "type": "sgv", + "_id": "6288cf770f1be700041e59c8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653132849000, + "dateString": "2022-05-21T11:34:09.000Z", + "isValid": true, + "sgv": 121, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288ce548e9ed800049b39f7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653132549000, + "dateString": "2022-05-21T11:29:09.000Z", + "isValid": true, + "sgv": 118, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288cd278e9ed800049b39f5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653132249000, + "dateString": "2022-05-21T11:24:09.000Z", + "isValid": true, + "sgv": 109, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "6288cbf98e9ed800049b39f2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653131948000, + "dateString": "2022-05-21T11:19:08.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "6288cacb8e9ed800049b39ec" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653131649000, + "dateString": "2022-05-21T11:14:09.000Z", + "isValid": true, + "sgv": 89, + "direction": "Flat", + "type": "sgv", + "_id": "6288c99e8e9ed800049b39e8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653131349000, + "dateString": "2022-05-21T11:09:09.000Z", + "isValid": true, + "sgv": 82, + "direction": "Flat", + "type": "sgv", + "_id": "6288c86f8e9ed800049b39e5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653131049000, + "dateString": "2022-05-21T11:04:09.000Z", + "isValid": true, + "sgv": 81, + "direction": "Flat", + "type": "sgv", + "_id": "6288c7418e9ed800049b39e3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653130748000, + "dateString": "2022-05-21T10:59:08.000Z", + "isValid": true, + "sgv": 84, + "direction": "Flat", + "type": "sgv", + "_id": "6288c61a1991280004dce468" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653130448000, + "dateString": "2022-05-21T10:54:08.000Z", + "isValid": true, + "sgv": 88, + "direction": "Flat", + "type": "sgv", + "_id": "6288c4ec1991280004dce464" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653130149000, + "dateString": "2022-05-21T10:49:09.000Z", + "isValid": true, + "sgv": 91, + "direction": "Flat", + "type": "sgv", + "_id": "6288c3be1991280004dce461" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653129848000, + "dateString": "2022-05-21T10:44:08.000Z", + "isValid": true, + "sgv": 93, + "direction": "Flat", + "type": "sgv", + "_id": "6288c2911991280004dce45e" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653129548000, + "dateString": "2022-05-21T10:39:08.000Z", + "isValid": true, + "sgv": 94, + "direction": "Flat", + "type": "sgv", + "_id": "6288c1631991280004dce45b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653129249000, + "dateString": "2022-05-21T10:34:09.000Z", + "isValid": true, + "sgv": 96, + "direction": "Flat", + "type": "sgv", + "_id": "6288c0341991280004dce459" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653128948000, + "dateString": "2022-05-21T10:29:08.000Z", + "isValid": true, + "sgv": 99, + "direction": "Flat", + "type": "sgv", + "_id": "6288bf061991280004dce457" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653128649000, + "dateString": "2022-05-21T10:24:09.000Z", + "isValid": true, + "sgv": 101, + "direction": "Flat", + "type": "sgv", + "_id": "6288bde0abbef90004616cf8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653128349000, + "dateString": "2022-05-21T10:19:09.000Z", + "isValid": true, + "sgv": 104, + "direction": "Flat", + "type": "sgv", + "_id": "6288bcb2abbef90004616cf6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653128049000, + "dateString": "2022-05-21T10:14:09.000Z", + "isValid": true, + "sgv": 110, + "direction": "Flat", + "type": "sgv", + "_id": "6288bb84abbef90004616cf4" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653127748000, + "dateString": "2022-05-21T10:09:08.000Z", + "isValid": true, + "sgv": 115, + "direction": "Flat", + "type": "sgv", + "_id": "6288ba56abbef90004616cf2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653127449000, + "dateString": "2022-05-21T10:04:09.000Z", + "isValid": true, + "sgv": 119, + "direction": "Flat", + "type": "sgv", + "_id": "6288b941abbef90004616cf0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653127149000, + "dateString": "2022-05-21T09:59:09.000Z", + "isValid": true, + "sgv": 119, + "direction": "Flat", + "type": "sgv", + "_id": "6288b813abbef90004616ceb" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653126849000, + "dateString": "2022-05-21T09:54:09.000Z", + "isValid": true, + "sgv": 118, + "direction": "Flat", + "type": "sgv", + "_id": "6288b6e9c9c02c00041f7f06" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653126549000, + "dateString": "2022-05-21T09:49:09.000Z", + "isValid": true, + "sgv": 117, + "direction": "Flat", + "type": "sgv", + "_id": "6288b5bbc9c02c00041f7f04" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653126249000, + "dateString": "2022-05-21T09:44:09.000Z", + "isValid": true, + "sgv": 118, + "direction": "Flat", + "type": "sgv", + "_id": "6288b48dc9c02c00041f7f02" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653125948000, + "dateString": "2022-05-21T09:39:08.000Z", + "isValid": true, + "sgv": 118, + "direction": "Flat", + "type": "sgv", + "_id": "6288b35fc9c02c00041f7f00" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653125649000, + "dateString": "2022-05-21T09:34:09.000Z", + "isValid": true, + "sgv": 118, + "direction": "Flat", + "type": "sgv", + "_id": "6288b231c9c02c00041f7efe" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653125349000, + "dateString": "2022-05-21T09:29:09.000Z", + "isValid": true, + "sgv": 120, + "direction": "Flat", + "type": "sgv", + "_id": "6288b103c9c02c00041f7efc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653125048000, + "dateString": "2022-05-21T09:24:08.000Z", + "isValid": true, + "sgv": 122, + "direction": "Flat", + "type": "sgv", + "_id": "6288afd5c9c02c00041f7ef8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653124749000, + "dateString": "2022-05-21T09:19:09.000Z", + "isValid": true, + "sgv": 125, + "direction": "Flat", + "type": "sgv", + "_id": "6288aea799fc930004d6bdfb" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653124448000, + "dateString": "2022-05-21T09:14:08.000Z", + "isValid": true, + "sgv": 124, + "direction": "Flat", + "type": "sgv", + "_id": "6288ad7999fc930004d6bdfa" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653124149000, + "dateString": "2022-05-21T09:09:09.000Z", + "isValid": true, + "sgv": 119, + "direction": "Flat", + "type": "sgv", + "_id": "6288ac4b99fc930004d6bdf8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653123849000, + "dateString": "2022-05-21T09:04:09.000Z", + "isValid": true, + "sgv": 113, + "direction": "Flat", + "type": "sgv", + "_id": "6288ab1d99fc930004d6bdf6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653123549000, + "dateString": "2022-05-21T08:59:09.000Z", + "isValid": true, + "sgv": 109, + "direction": "Flat", + "type": "sgv", + "_id": "6288a9f099fc930004d6bdf4" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653123248000, + "dateString": "2022-05-21T08:54:08.000Z", + "isValid": true, + "sgv": 107, + "direction": "Flat", + "type": "sgv", + "_id": "6288a8db99fc930004d6bdf1" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653122949000, + "dateString": "2022-05-21T08:49:09.000Z", + "isValid": true, + "sgv": 108, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288a7ad99fc930004d6bdef" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653122649000, + "dateString": "2022-05-21T08:44:09.000Z", + "isValid": true, + "sgv": 111, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288a73099fc930004d6bded" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653122349000, + "dateString": "2022-05-21T08:39:09.000Z", + "isValid": true, + "sgv": 118, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288a55199fc930004d6bdeb" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653122049000, + "dateString": "2022-05-21T08:34:09.000Z", + "isValid": true, + "sgv": 128, + "direction": "Flat", + "type": "sgv", + "_id": "6288a42099fc930004d6bde8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653121749000, + "dateString": "2022-05-21T08:29:09.000Z", + "isValid": true, + "sgv": 138, + "direction": "Flat", + "type": "sgv", + "_id": "6288a2fca4cc860004a251d2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653121449000, + "dateString": "2022-05-21T08:24:09.000Z", + "isValid": true, + "sgv": 145, + "direction": "Flat", + "type": "sgv", + "_id": "6288a1cda4cc860004a251d1" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653121149000, + "dateString": "2022-05-21T08:19:09.000Z", + "isValid": true, + "sgv": 147, + "direction": "Flat", + "type": "sgv", + "_id": "6288a09fa4cc860004a251ce" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653120849000, + "dateString": "2022-05-21T08:14:09.000Z", + "isValid": true, + "sgv": 148, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62889f6fa4cc860004a251cc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653120548000, + "dateString": "2022-05-21T08:09:08.000Z", + "isValid": true, + "sgv": 146, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62889e41a4cc860004a251cb" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653120249000, + "dateString": "2022-05-21T08:04:09.000Z", + "isValid": true, + "sgv": 141, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62889d13a4cc860004a251c9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653119949000, + "dateString": "2022-05-21T07:59:09.000Z", + "isValid": true, + "sgv": 132, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62889be4a4cc860004a251c7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653119649000, + "dateString": "2022-05-21T07:54:09.000Z", + "isValid": true, + "sgv": 123, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62889ac27ff1e700040f17dc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653119349000, + "dateString": "2022-05-21T07:49:09.000Z", + "isValid": true, + "sgv": 114, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "628899957ff1e700040f17d7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653119049000, + "dateString": "2022-05-21T07:44:09.000Z", + "isValid": true, + "sgv": 105, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "628898627ff1e700040f17d5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653118748000, + "dateString": "2022-05-21T07:39:08.000Z", + "isValid": true, + "sgv": 97, + "direction": "Flat", + "type": "sgv", + "_id": "628897357ff1e700040f17d3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653118449000, + "dateString": "2022-05-21T07:34:09.000Z", + "isValid": true, + "sgv": 92, + "direction": "Flat", + "type": "sgv", + "_id": "6288961d7ff1e700040f17ce" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653118149000, + "dateString": "2022-05-21T07:29:09.000Z", + "isValid": true, + "sgv": 86, + "direction": "Flat", + "type": "sgv", + "_id": "628894d37ff1e700040f17cd" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653117848000, + "dateString": "2022-05-21T07:24:08.000Z", + "isValid": true, + "sgv": 82, + "direction": "Flat", + "type": "sgv", + "_id": "628893bd7ff1e700040f17c9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653117549000, + "dateString": "2022-05-21T07:19:09.000Z", + "isValid": true, + "sgv": 80, + "direction": "Flat", + "type": "sgv", + "_id": "628892907ff1e700040f17c7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653117249000, + "dateString": "2022-05-21T07:14:09.000Z", + "isValid": true, + "sgv": 79, + "direction": "Flat", + "type": "sgv", + "_id": "628891627ff1e700040f17c6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653116949000, + "dateString": "2022-05-21T07:09:09.000Z", + "isValid": true, + "sgv": 76, + "direction": "Flat", + "type": "sgv", + "_id": "62889024149196000412bf57" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653116649000, + "dateString": "2022-05-21T07:04:09.000Z", + "isValid": true, + "sgv": 74, + "direction": "Flat", + "type": "sgv", + "_id": "62888f0f149196000412bf54" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653116349000, + "dateString": "2022-05-21T06:59:09.000Z", + "isValid": true, + "sgv": 70, + "direction": "Flat", + "type": "sgv", + "_id": "62888de2149196000412bf51" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653116049000, + "dateString": "2022-05-21T06:54:09.000Z", + "isValid": true, + "sgv": 69, + "direction": "Flat", + "type": "sgv", + "_id": "62888ccc149196000412bf4f" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653115749000, + "dateString": "2022-05-21T06:49:09.000Z", + "isValid": true, + "sgv": 70, + "direction": "Flat", + "type": "sgv", + "_id": "62888b85149196000412bf4d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653115449000, + "dateString": "2022-05-21T06:44:09.000Z", + "isValid": true, + "sgv": 74, + "direction": "Flat", + "type": "sgv", + "_id": "62888a57149196000412bf4b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653115149000, + "dateString": "2022-05-21T06:39:09.000Z", + "isValid": true, + "sgv": 76, + "direction": "Flat", + "type": "sgv", + "_id": "6288892a149196000412bf49" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653114849000, + "dateString": "2022-05-21T06:34:09.000Z", + "isValid": true, + "sgv": 78, + "direction": "Flat", + "type": "sgv", + "_id": "628888018ff3530004dc6070" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653114549000, + "dateString": "2022-05-21T06:29:09.000Z", + "isValid": true, + "sgv": 80, + "direction": "Flat", + "type": "sgv", + "_id": "628886d28ff3530004dc606b" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653114249000, + "dateString": "2022-05-21T06:24:09.000Z", + "isValid": true, + "sgv": 85, + "direction": "Flat", + "type": "sgv", + "_id": "628885a48ff3530004dc6069" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653113949000, + "dateString": "2022-05-21T06:19:09.000Z", + "isValid": true, + "sgv": 89, + "direction": "Flat", + "type": "sgv", + "_id": "628884778ff3530004dc6067" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653113649000, + "dateString": "2022-05-21T06:14:09.000Z", + "isValid": true, + "sgv": 91, + "direction": "Flat", + "type": "sgv", + "_id": "6288834a8ff3530004dc6065" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653113349000, + "dateString": "2022-05-21T06:09:09.000Z", + "isValid": true, + "sgv": 94, + "direction": "Flat", + "type": "sgv", + "_id": "6288821b8ff3530004dc6062" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653113049000, + "dateString": "2022-05-21T06:04:09.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "_id": "628880ee8ff3530004dc6060" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653112749000, + "dateString": "2022-05-21T05:59:09.000Z", + "isValid": true, + "sgv": 101, + "direction": "Flat", + "type": "sgv", + "_id": "62887fcee964810004aa5666" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653112449000, + "dateString": "2022-05-21T05:54:09.000Z", + "isValid": true, + "sgv": 102, + "direction": "Flat", + "type": "sgv", + "_id": "62887ea1e964810004aa5664" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653112148000, + "dateString": "2022-05-21T05:49:08.000Z", + "isValid": true, + "sgv": 103, + "direction": "Flat", + "type": "sgv", + "_id": "62887d72e964810004aa5661" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653111849000, + "dateString": "2022-05-21T05:44:09.000Z", + "isValid": true, + "sgv": 102, + "direction": "Flat", + "type": "sgv", + "_id": "62887c44e964810004aa565d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653111549000, + "dateString": "2022-05-21T05:39:09.000Z", + "isValid": true, + "sgv": 100, + "direction": "Flat", + "type": "sgv", + "_id": "62887b17e964810004aa565a" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653111249000, + "dateString": "2022-05-21T05:34:09.000Z", + "isValid": true, + "sgv": 97, + "direction": "Flat", + "type": "sgv", + "_id": "628879e9e964810004aa5657" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653110949000, + "dateString": "2022-05-21T05:29:09.000Z", + "isValid": true, + "sgv": 97, + "direction": "Flat", + "type": "sgv", + "_id": "628878bbe964810004aa5655" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653110649000, + "dateString": "2022-05-21T05:24:09.000Z", + "isValid": true, + "sgv": 98, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "628877a5363e6c0004f710e0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653110348000, + "dateString": "2022-05-21T05:19:08.000Z", + "isValid": true, + "sgv": 102, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62887677363e6c0004f710de" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653110049000, + "dateString": "2022-05-21T05:14:09.000Z", + "isValid": true, + "sgv": 109, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62887549363e6c0004f710dc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653109748000, + "dateString": "2022-05-21T05:09:08.000Z", + "isValid": true, + "sgv": 117, + "direction": "Flat", + "type": "sgv", + "_id": "6288741c363e6c0004f710d9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653109448000, + "dateString": "2022-05-21T05:04:08.000Z", + "isValid": true, + "sgv": 125, + "direction": "Flat", + "type": "sgv", + "_id": "628872ef363e6c0004f710d6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653109148000, + "dateString": "2022-05-21T04:59:08.000Z", + "isValid": true, + "sgv": 129, + "direction": "Flat", + "type": "sgv", + "_id": "628871c1363e6c0004f710d3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653108848000, + "dateString": "2022-05-21T04:54:08.000Z", + "isValid": true, + "sgv": 130, + "direction": "Flat", + "type": "sgv", + "_id": "62887093363e6c0004f710cf" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653108548000, + "dateString": "2022-05-21T04:49:08.000Z", + "isValid": true, + "sgv": 128, + "direction": "Flat", + "type": "sgv", + "_id": "62886f5719e2e60004989bbc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653108249000, + "dateString": "2022-05-21T04:44:09.000Z", + "isValid": true, + "sgv": 123, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62886e2919e2e60004989bba" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653107948000, + "dateString": "2022-05-21T04:39:08.000Z", + "isValid": true, + "sgv": 124, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62886cfc19e2e60004989bb8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653107648000, + "dateString": "2022-05-21T04:34:08.000Z", + "isValid": true, + "sgv": 132, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62886be719e2e60004989bb5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653107348000, + "dateString": "2022-05-21T04:29:08.000Z", + "isValid": true, + "sgv": 144, + "direction": "Flat", + "type": "sgv", + "_id": "62886ab919e2e60004989bb3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653107048000, + "dateString": "2022-05-21T04:24:08.000Z", + "isValid": true, + "sgv": 153, + "direction": "Flat", + "type": "sgv", + "_id": "6288698b19e2e60004989bb0" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653106749000, + "dateString": "2022-05-21T04:19:09.000Z", + "isValid": true, + "sgv": 157, + "direction": "Flat", + "type": "sgv", + "_id": "6288685d19e2e60004989bac" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653106449000, + "dateString": "2022-05-21T04:14:09.000Z", + "isValid": true, + "sgv": 155, + "direction": "Flat", + "type": "sgv", + "_id": "6288672f42c1220004f9573a" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653106149000, + "dateString": "2022-05-21T04:09:09.000Z", + "isValid": true, + "sgv": 151, + "direction": "Flat", + "type": "sgv", + "_id": "6288660142c1220004f95736" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653105848000, + "dateString": "2022-05-21T04:04:08.000Z", + "isValid": true, + "sgv": 146, + "direction": "Flat", + "type": "sgv", + "_id": "628864d342c1220004f95733" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653105549000, + "dateString": "2022-05-21T03:59:09.000Z", + "isValid": true, + "sgv": 146, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "628863a542c1220004f95730" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653105248000, + "dateString": "2022-05-21T03:54:08.000Z", + "isValid": true, + "sgv": 149, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288629042c1220004f9572e" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653104949000, + "dateString": "2022-05-21T03:49:09.000Z", + "isValid": true, + "sgv": 155, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288614942c1220004f9572c" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653104648000, + "dateString": "2022-05-21T03:44:08.000Z", + "isValid": true, + "sgv": 162, + "direction": "Flat", + "type": "sgv", + "_id": "6288601b42c1220004f95729" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653104349000, + "dateString": "2022-05-21T03:39:09.000Z", + "isValid": true, + "sgv": 167, + "direction": "Flat", + "type": "sgv", + "_id": "62885ef1293f3e00042c31e2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653104049000, + "dateString": "2022-05-21T03:34:09.000Z", + "isValid": true, + "sgv": 170, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62885dc3293f3e00042c31de" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653103748000, + "dateString": "2022-05-21T03:29:08.000Z", + "isValid": true, + "sgv": 171, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "62885c95293f3e00042c31db" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653103448000, + "dateString": "2022-05-21T03:24:08.000Z", + "isValid": true, + "sgv": 174, + "direction": "SingleDown", + "type": "sgv", + "_id": "62885b81293f3e00042c31d9" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653103149000, + "dateString": "2022-05-21T03:19:09.000Z", + "isValid": true, + "sgv": 182, + "direction": "SingleDown", + "type": "sgv", + "_id": "62885a52293f3e00042c31d7" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653102848000, + "dateString": "2022-05-21T03:14:08.000Z", + "isValid": true, + "sgv": 193, + "direction": "SingleDown", + "type": "sgv", + "_id": "62885924293f3e00042c31d5" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653102548000, + "dateString": "2022-05-21T03:09:08.000Z", + "isValid": true, + "sgv": 204, + "direction": "SingleDown", + "type": "sgv", + "_id": "628857f7293f3e00042c31d3" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653102249000, + "dateString": "2022-05-21T03:04:09.000Z", + "isValid": true, + "sgv": 216, + "direction": "SingleDown", + "type": "sgv", + "_id": "628856da5151b5000462a1ea" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653101948000, + "dateString": "2022-05-21T02:59:08.000Z", + "isValid": true, + "sgv": 228, + "direction": "SingleDown", + "type": "sgv", + "_id": "628855935151b5000462a1e8" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653101648000, + "dateString": "2022-05-21T02:54:08.000Z", + "isValid": true, + "sgv": 241, + "direction": "SingleDown", + "type": "sgv", + "_id": "6288547f5151b5000462a1e6" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653101348000, + "dateString": "2022-05-21T02:49:08.000Z", + "isValid": true, + "sgv": 253, + "direction": "SingleDown", + "type": "sgv", + "_id": "628853395151b5000462a1e4" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653101048000, + "dateString": "2022-05-21T02:44:08.000Z", + "isValid": true, + "sgv": 267, + "direction": "FortyFiveDown", + "type": "sgv", + "_id": "6288520b5151b5000462a1e2" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653100748000, + "dateString": "2022-05-21T02:39:08.000Z", + "isValid": true, + "sgv": 283, + "direction": "Flat", + "type": "sgv", + "_id": "628850de5151b5000462a1df" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653100449000, + "dateString": "2022-05-21T02:34:09.000Z", + "isValid": true, + "sgv": 297, + "direction": "Flat", + "type": "sgv", + "_id": "62884fb05151b5000462a1dc" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653100148000, + "dateString": "2022-05-21T02:29:08.000Z", + "isValid": true, + "sgv": 307, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62884e9493668c0004a30517" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653099848000, + "dateString": "2022-05-21T02:24:08.000Z", + "isValid": true, + "sgv": 308, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62884d6793668c0004a30514" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653099548000, + "dateString": "2022-05-21T02:19:08.000Z", + "isValid": true, + "sgv": 296, + "direction": "FortyFiveUp", + "type": "sgv", + "_id": "62884c3993668c0004a30510" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653099249000, + "dateString": "2022-05-21T02:14:09.000Z", + "isValid": true, + "sgv": 282, + "direction": "Flat", + "type": "sgv", + "_id": "62884b0c93668c0004a3050d" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653098948000, + "dateString": "2022-05-21T02:09:08.000Z", + "isValid": true, + "sgv": 271, + "direction": "Flat", + "type": "sgv", + "_id": "628849de93668c0004a30508" + }, + { + "device": "AndroidAPS-DexcomG6", + "date": 1653098648000, + "dateString": "2022-05-21T02:04:08.000Z", + "isValid": true, + "sgv": 271, + "direction": "Flat", + "type": "sgv", + "_id": "628848b093668c0004a30504" + } +] diff --git a/app/src/test/res/autotune/test3/aaps-treatments.2022-05-21.json b/app/src/test/res/autotune/test3/aaps-treatments.2022-05-21.json new file mode 100644 index 0000000000..b271cc80e4 --- /dev/null +++ b/app/src/test/res/autotune/test3/aaps-treatments.2022-05-21.json @@ -0,0 +1,3146 @@ +[ + { + "created_at": "2022-05-22T02:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 635539, + "type": "NORMAL", + "rate": 0.0742, + "percent": -90, + "pumpId": 454016, + "endId": 454021, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289982461a8290004740387" + }, + { + "created_at": "2022-05-22T01:55:40.718Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 259282, + "type": "NORMAL", + "rate": 0.0824, + "percent": -90, + "pumpId": 454016, + "endId": 454021, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289982461a8290004740387" + }, + { + "created_at": "2022-05-22T01:50:36.118Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 303106, + "type": "NORMAL", + "rate": 0.1648, + "percent": -80, + "pumpId": 454013, + "endId": 454015, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628996f661a8290004740384" + }, + { + "created_at": "2022-05-22T01:45:35.222Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299405, + "type": "NORMAL", + "rate": 0.49439999999999995, + "percent": -40, + "pumpId": 454010, + "endId": 454012, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628995c761a8290004740381" + }, + { + "created_at": "2022-05-22T01:40:51.929Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 281796, + "type": "NORMAL", + "rate": 0.6592, + "percent": -20, + "pumpId": 454007, + "endId": 454009, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628994ab50e51d0004429e6f" + }, + { + "created_at": "2022-05-22T01:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 40, + "durationInMilliseconds": 2449437, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 454003, + "endId": 454006, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628988efda46aa0004d1e0f7" + }, + { + "created_at": "2022-05-22T00:50:32.326Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 567674, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 454003, + "endId": 454006, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628988efda46aa0004d1e0f7" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.1, + "created_at": "2022-05-22T00:45:47.966Z", + "date": 1653180347966, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21574, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628987c0da46aa0004d1e0f3" + }, + { + "created_at": "2022-05-22T00:45:45.232Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 285608, + "type": "NORMAL", + "rate": 1.209, + "percent": 50, + "pumpId": 453998, + "endId": 454002, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628987c0da46aa0004d1e0f4" + }, + { + "created_at": "2022-05-22T00:35:30.702Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 613035, + "type": "NORMAL", + "rate": 1.0478, + "percent": 30, + "pumpId": 453995, + "endId": 453997, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62898563da46aa0004d1e0ec" + }, + { + "created_at": "2022-05-22T00:30:42.142Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 287064, + "type": "NORMAL", + "rate": 0.7254, + "percent": -10, + "pumpId": 453992, + "endId": 453994, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628984439d6f1800047cd0df" + }, + { + "created_at": "2022-05-22T00:20:44.045Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 595609, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453989, + "endId": 453991, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628981e59d6f1800047cd0da" + }, + { + "created_at": "2022-05-22T00:10:28.057Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 614498, + "type": "NORMAL", + "rate": 0.403, + "percent": -50, + "pumpId": 453986, + "endId": 453988, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62897f879d6f1800047cd0d5" + }, + { + "created_at": "2022-05-22T00:06:13.096Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 252465, + "type": "NORMAL", + "rate": 0.403, + "percent": -50, + "pumpId": 453983, + "endId": 453985, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62897e8b9d6f1800047cd0d2" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.1, + "created_at": "2022-05-22T00:00:34.526Z", + "date": 1653177634526, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21573, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62897d299d6f1800047cd0cd" + }, + { + "created_at": "2022-05-22T00:00:31.592Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 340013, + "type": "NORMAL", + "rate": 0.5642, + "percent": -30, + "pumpId": 453978, + "endId": 453982, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62897d299d6f1800047cd0cf" + }, + { + "created_at": "2022-05-22T00:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 30096, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453974, + "endId": 453977, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62897c139d6f1800047cd0ca" + }, + { + "created_at": "2022-05-21T23:55:56.658Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 243342, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453974, + "endId": 453977, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62897c139d6f1800047cd0ca" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.54, + "created_at": "2022-05-21T23:50:30.757Z", + "date": 1653177030757, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21572, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62897ad171a363000480abcb" + }, + { + "created_at": "2022-05-21T23:46:13.228Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 573000, + "type": "FAKE_EXTENDED", + "rate": 2.561162303664922, + "absolute": 2.561162303664922, + "pumpId": 21571, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628979d571a363000480abc9" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.22, + "created_at": "2022-05-21T23:40:59.180Z", + "date": 1653176459180, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21570, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289788d71a363000480abc4" + }, + { + "created_at": "2022-05-21T23:40:57.936Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 304306, + "type": "NORMAL", + "rate": 1.6842000000000001, + "percent": 110, + "pumpId": 453959, + "endId": 453963, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289788e71a363000480abc6" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-21T23:20:51.857Z", + "date": 1653175251857, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21569, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628973eb71a363000480abba" + }, + { + "created_at": "2022-05-21T23:16:23.121Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 24, + "durationInMilliseconds": 1472326, + "type": "NORMAL", + "rate": 1.1228, + "percent": 40, + "pumpId": 453954, + "endId": 453958, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628972de37d09a00043f2b24" + }, + { + "created_at": "2022-05-21T23:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 16, + "durationInMilliseconds": 983121, + "type": "NORMAL", + "rate": 0.802, + "percent": 0, + "_id": "neutral_1653171415806" + }, + { + "created_at": "2022-05-21T22:16:55.806Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 43, + "durationInMilliseconds": 2584194, + "type": "NORMAL", + "rate": 0.795, + "percent": 0, + "_id": "neutral_1653171415806" + }, + { + "created_at": "2022-05-21T22:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 16, + "durationInMilliseconds": 1015806, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453943, + "endId": 453951, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628957129bf1e6000482ff9a" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.28, + "created_at": "2022-05-21T21:24:43.261Z", + "date": 1653168283261, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21568, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628958a49bf1e6000482ff9c" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.2, + "created_at": "2022-05-21T21:17:49.628Z", + "date": 1653167869628, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21567, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628957109bf1e6000482ff99" + }, + { + "created_at": "2022-05-21T21:17:43.507Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 42, + "durationInMilliseconds": 2536493, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453943, + "endId": 453951, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628957129bf1e6000482ff9a" + }, + { + "created_at": "2022-05-21T21:10:55.350Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 6, + "durationInMilliseconds": 406671, + "type": "NORMAL", + "rate": 1.0049000000000001, + "percent": 30, + "pumpId": 453940, + "endId": 453942, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628955629bf1e6000482ff94" + }, + { + "created_at": "2022-05-21T21:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 653862, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453936, + "endId": 453939, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62894e5580fc7e00041b22a2" + }, + { + "created_at": "2022-05-21T20:40:34.976Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 19, + "durationInMilliseconds": 1165024, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453936, + "endId": 453939, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62894e5580fc7e00041b22a2" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.14, + "created_at": "2022-05-21T20:30:40.892Z", + "date": 1653165040892, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21566, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62894bf780fc7e00041b229d" + }, + { + "created_at": "2022-05-21T20:25:40.930Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 891567, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453931, + "endId": 453935, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62894aca4493460004e63a3a" + }, + { + "eventType": "Meal Bolus", + "insulin": 9.4, + "created_at": "2022-05-21T20:19:54.209Z", + "date": 1653164394209, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 21565, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628949824493460004e63a35" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.14, + "created_at": "2022-05-21T20:11:04.953Z", + "date": 1653163864953, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21564, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628947704493460004e63a30" + }, + { + "created_at": "2022-05-21T20:11:03.814Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 874625, + "type": "NORMAL", + "rate": 1.2563, + "percent": 70, + "pumpId": 453924, + "endId": 453930, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628947574493460004e63a2f" + }, + { + "created_at": "2022-05-21T20:00:37.912Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 623413, + "type": "NORMAL", + "rate": 0.9606999999999999, + "percent": 30, + "pumpId": 453921, + "endId": 453923, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628944fa4493460004e63a29" + }, + { + "created_at": "2022-05-21T20:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 35425, + "type": "NORMAL", + "rate": 0.2956, + "percent": -60, + "pumpId": 453917, + "endId": 453920, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62894164598f780004bb3b2f" + }, + { + "created_at": "2022-05-21T19:45:25.759Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 874241, + "type": "NORMAL", + "rate": 0.2888, + "percent": -60, + "pumpId": 453917, + "endId": 453920, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62894164598f780004bb3b2f" + }, + { + "created_at": "2022-05-21T19:25:47.539Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 19, + "durationInMilliseconds": 1175731, + "type": "NORMAL", + "rate": 0.43320000000000003, + "percent": -40, + "pumpId": 453914, + "endId": 453916, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62893cc8598f780004bb3b25" + }, + { + "created_at": "2022-05-21T19:20:54.174Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 293365, + "type": "NORMAL", + "rate": 0.722, + "percent": 0, + "_id": "neutral_1653160854174" + }, + { + "created_at": "2022-05-21T19:10:51.515Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 602659, + "type": "NORMAL", + "rate": 0.7942, + "percent": 10, + "pumpId": 453908, + "endId": 453910, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289394a22fbc8000495b821" + }, + { + "created_at": "2022-05-21T19:01:01.322Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 588703, + "type": "NORMAL", + "rate": 0.2888, + "percent": -60, + "pumpId": 453905, + "endId": 453907, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628936ef22fbc8000495b81c" + }, + { + "created_at": "2022-05-21T19:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 59826, + "type": "NORMAL", + "rate": 0.7942, + "percent": 10, + "pumpId": 453900, + "endId": 453904, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289349522fbc8000495b816" + }, + { + "created_at": "2022-05-21T18:50:58.216Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 541784, + "type": "NORMAL", + "rate": 0.77, + "percent": 10, + "pumpId": 453900, + "endId": 453904, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289349522fbc8000495b816" + }, + { + "created_at": "2022-05-21T18:46:12.499Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 285717, + "type": "NORMAL", + "rate": 0.7, + "percent": 0, + "_id": "neutral_1653158772499" + }, + { + "created_at": "2022-05-21T18:30:30.651Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 15, + "durationInMilliseconds": 941848, + "type": "NORMAL", + "rate": 0.91, + "percent": 30, + "pumpId": 453894, + "endId": 453896, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62892fda840d8d0004a20bfc" + }, + { + "created_at": "2022-05-21T18:20:44.275Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 584884, + "type": "NORMAL", + "rate": 0.28, + "percent": -60, + "pumpId": 453891, + "endId": 453893, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62892d80840d8d0004a20bf7" + }, + { + "created_at": "2022-05-21T18:15:30.389Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 312398, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453888, + "endId": 453890, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62892c52840d8d0004a20bf4" + }, + { + "created_at": "2022-05-21T18:00:33.832Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 895066, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453885, + "endId": 453887, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628928ca8809e60004c644e8" + }, + { + "created_at": "2022-05-21T18:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 32345, + "type": "NORMAL", + "rate": 0.35, + "percent": -50, + "pumpId": 453881, + "endId": 453884, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628927b58809e60004c644e5" + }, + { + "created_at": "2022-05-21T17:55:44.739Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 255261, + "type": "NORMAL", + "rate": 0.3295, + "percent": -50, + "pumpId": 453881, + "endId": 453884, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628927b58809e60004c644e5" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.24, + "created_at": "2022-05-21T17:45:48.032Z", + "date": 1653155148032, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21563, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628925588809e60004c644de" + }, + { + "created_at": "2022-05-21T17:45:45.750Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 597498, + "type": "NORMAL", + "rate": 1.5816, + "percent": 140, + "pumpId": 453876, + "endId": 453880, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628925588809e60004c644e0" + }, + { + "created_at": "2022-05-21T17:40:44.874Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299386, + "type": "NORMAL", + "rate": 0.8567, + "percent": 30, + "pumpId": 453873, + "endId": 453875, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289242b8809e60004c644db" + }, + { + "created_at": "2022-05-21T17:35:46.611Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 295766, + "type": "NORMAL", + "rate": 0.3295, + "percent": -50, + "pumpId": 453870, + "endId": 453872, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628922fe8809e60004c644d8" + }, + { + "created_at": "2022-05-21T17:25:37.912Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 607206, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453867, + "endId": 453869, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628920a41090500004ca4729" + }, + { + "created_at": "2022-05-21T17:20:42.063Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 293355, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453864, + "endId": 453866, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62891f771090500004ca4726" + }, + { + "created_at": "2022-05-21T17:10:30.971Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 608601, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453861, + "endId": 453863, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62891d1b1090500004ca4721" + }, + { + "created_at": "2022-05-21T17:00:45.815Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 582673, + "type": "NORMAL", + "rate": 0.0659, + "percent": -90, + "pumpId": 453858, + "endId": 453860, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62891ac01090500004ca471c" + }, + { + "created_at": "2022-05-21T17:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 43325, + "type": "NORMAL", + "rate": 1.4498000000000002, + "percent": 120, + "pumpId": 453852, + "endId": 453857, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628918711090500004ca4716" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.2, + "created_at": "2022-05-21T16:55:53.346Z", + "date": 1653152153346, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21562, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289199e1090500004ca4718" + }, + { + "created_at": "2022-05-21T16:50:50.998Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 549002, + "type": "NORMAL", + "rate": 1.4322, + "percent": 120, + "pumpId": 453852, + "endId": 453857, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628918711090500004ca4716" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.1, + "created_at": "2022-05-21T16:45:50.105Z", + "date": 1653151550105, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21561, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628917431090500004ca4711" + }, + { + "created_at": "2022-05-21T16:45:47.200Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 300314, + "type": "NORMAL", + "rate": 1.0415999999999999, + "percent": 60, + "pumpId": 453847, + "endId": 453851, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628917431090500004ca4713" + }, + { + "created_at": "2022-05-21T16:40:54.765Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 290944, + "type": "NORMAL", + "rate": 0.8463, + "percent": 30, + "pumpId": 453844, + "endId": 453846, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289161c1090500004ca470e" + }, + { + "created_at": "2022-05-21T16:35:35.684Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 317593, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453841, + "endId": 453843, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628914eb1090500004ca470b" + }, + { + "created_at": "2022-05-21T16:30:39.072Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 295126, + "type": "NORMAL", + "rate": 0.06509999999999999, + "percent": -90, + "pumpId": 453838, + "endId": 453840, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628913c01090500004ca4708" + }, + { + "created_at": "2022-05-21T16:25:35.342Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 301235, + "type": "NORMAL", + "rate": 0.06509999999999999, + "percent": -90, + "pumpId": 453835, + "endId": 453837, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628913141090500004ca4705" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.1, + "created_at": "2022-05-21T16:20:30.382Z", + "date": 1653150030382, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21560, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6289130f1090500004ca4700" + }, + { + "created_at": "2022-05-21T16:20:27.375Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 306478, + "type": "NORMAL", + "rate": 1.0415999999999999, + "percent": 60, + "pumpId": 453830, + "endId": 453834, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628913101090500004ca4702" + }, + { + "created_at": "2022-05-21T16:11:20.186Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 545699, + "type": "NORMAL", + "rate": 0.32550000000000007, + "percent": -50, + "pumpId": 453827, + "endId": 453829, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890f811090500004ca46fc" + }, + { + "created_at": "2022-05-21T16:06:52.798Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 265903, + "type": "NORMAL", + "rate": 0.26039999999999996, + "percent": -60, + "pumpId": 453824, + "endId": 453826, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890e29cf7ee10004a2b1e1" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.32, + "created_at": "2022-05-21T16:01:01.819Z", + "date": 1653148861819, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21559, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890cc9cf7ee10004a2b1dc" + }, + { + "created_at": "2022-05-21T16:00:58.172Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 344000, + "type": "FAKE_EXTENDED", + "rate": 1.9068139534883721, + "absolute": 1.9068139534883721, + "pumpId": 21558, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890cc9cf7ee10004a2b1dd" + }, + { + "created_at": "2022-05-21T16:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 46830, + "type": "NORMAL", + "rate": 0.06509999999999999, + "percent": -90, + "pumpId": 453811, + "endId": 453814, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890b82cf7ee10004a2b1d9" + }, + { + "created_at": "2022-05-21T15:55:39.147Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 260853, + "type": "NORMAL", + "rate": 0.0673, + "percent": -90, + "pumpId": 453811, + "endId": 453814, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890b82cf7ee10004a2b1d9" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-21T15:51:00.932Z", + "date": 1653148260932, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21557, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890a6dcf7ee10004a2b1d4" + }, + { + "created_at": "2022-05-21T15:50:58.818Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 278838, + "type": "NORMAL", + "rate": 1.1441000000000001, + "percent": 70, + "pumpId": 453806, + "endId": 453810, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890a6ecf7ee10004a2b1d6" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.14, + "created_at": "2022-05-21T15:40:59.961Z", + "date": 1653147659961, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21556, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890811cf7ee10004a2b1cf" + }, + { + "created_at": "2022-05-21T15:35:20.343Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 15, + "durationInMilliseconds": 935989, + "type": "NORMAL", + "rate": 1.0095, + "percent": 50, + "pumpId": 453800, + "endId": 453805, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628906e3cf7ee10004a2b1cc" + }, + { + "created_at": "2022-05-21T15:31:00.492Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 258353, + "type": "NORMAL", + "rate": 0.0673, + "percent": -90, + "pumpId": 453797, + "endId": 453799, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628905b6c9346b0004863368" + }, + { + "created_at": "2022-05-21T15:25:55.840Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 303154, + "type": "NORMAL", + "rate": 0.3365000000000001, + "percent": -50, + "pumpId": 453794, + "endId": 453796, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62890488c9346b0004863365" + }, + { + "created_at": "2022-05-21T15:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 25, + "durationInMilliseconds": 1553350, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453790, + "endId": 453793, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288fa1b0e0c880004d58de2" + }, + { + "created_at": "2022-05-21T14:41:07.802Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 18, + "durationInMilliseconds": 1132198, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453790, + "endId": 453793, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288fa1b0e0c880004d58de2" + }, + { + "created_at": "2022-05-21T14:30:59.772Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 605542, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453787, + "endId": 453789, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288f7a60e0c880004d58ddd" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.28, + "created_at": "2022-05-21T14:25:43.954Z", + "date": 1653143143954, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21555, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288f6770e0c880004d58dd9" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.78, + "created_at": "2022-05-21T14:15:46.926Z", + "date": 1653142546926, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21554, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288f4152634cd0004296072" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.86, + "created_at": "2022-05-21T14:05:34.493Z", + "date": 1653141934493, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21553, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288f1b82634cd000429606d" + }, + { + "created_at": "2022-05-21T14:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 30, + "durationInMilliseconds": 1857281, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453769, + "endId": 453786, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288e8910f1be700041e5a02" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.58, + "created_at": "2022-05-21T13:55:47.615Z", + "date": 1653141347615, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21552, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288ef752634cd0004296068" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.98, + "created_at": "2022-05-21T13:45:57.753Z", + "date": 1653140757753, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21551, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288ed160f1be700041e5a0c" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.6, + "created_at": "2022-05-21T13:36:02.971Z", + "date": 1653140162971, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21550, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288ead30f1be700041e5a08" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.58, + "created_at": "2022-05-21T13:30:42.515Z", + "date": 1653139842515, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21549, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288e98c0f1be700041e5a04" + }, + { + "created_at": "2022-05-21T13:26:18.959Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 33, + "durationInMilliseconds": 2021041, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453769, + "endId": 453786, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288e8910f1be700041e5a02" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.74, + "created_at": "2022-05-21T13:10:43.719Z", + "date": 1653138643719, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21548, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288e5520f1be700041e59f9" + }, + { + "eventType": "Correction Bolus", + "insulin": 1.04, + "created_at": "2022-05-21T13:00:56.399Z", + "date": 1653138056399, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21547, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288e2970f1be700041e59f4" + }, + { + "created_at": "2022-05-21T13:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 26, + "durationInMilliseconds": 1576482, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453759, + "endId": 453768, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288da470f1be700041e59e4" + }, + { + "eventType": "Correction Bolus", + "insulin": 1.24, + "created_at": "2022-05-21T12:55:30.825Z", + "date": 1653137730825, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21546, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288e1500f1be700041e59f1" + }, + { + "created_at": "2022-05-21T12:25:26.042Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 34, + "durationInMilliseconds": 2073958, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453759, + "endId": 453768, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288da470f1be700041e59e4" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-21T12:10:34.513Z", + "date": 1653135034513, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21545, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288d6ca0f1be700041e59db" + }, + { + "created_at": "2022-05-21T12:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 25, + "durationInMilliseconds": 1523557, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453752, + "endId": 453758, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288cc5d8e9ed800049b39f4" + }, + { + "created_at": "2022-05-21T11:26:10.112Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 33, + "durationInMilliseconds": 2029888, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453752, + "endId": 453758, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288cc5d8e9ed800049b39f4" + }, + { + "eventType": "Meal Bolus", + "insulin": 8.22, + "created_at": "2022-05-21T11:23:36.043Z", + "date": 1653132216043, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 21544, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288cbc78e9ed800049b39ef" + }, + { + "created_at": "2022-05-21T11:21:02.281Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299000, + "type": "FAKE_EXTENDED", + "rate": 1.6932107023411371, + "absolute": 1.6932107023411371, + "pumpId": 21543, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288cb308e9ed800049b39ee" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.2, + "created_at": "2022-05-21T11:15:45.765Z", + "date": 1653131745765, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21542, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c9e98e9ed800049b39e9" + }, + { + "created_at": "2022-05-21T11:15:43.070Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 308169, + "type": "NORMAL", + "rate": 1.533, + "percent": 110, + "pumpId": 453738, + "endId": 453742, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c9e98e9ed800049b39eb" + }, + { + "created_at": "2022-05-21T11:10:35.181Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 305390, + "type": "NORMAL", + "rate": 0.073, + "percent": -90, + "pumpId": 453735, + "endId": 453737, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c8bb8e9ed800049b39e7" + }, + { + "created_at": "2022-05-21T11:00:50.721Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 582968, + "type": "NORMAL", + "rate": 0.21899999999999997, + "percent": -70, + "pumpId": 453732, + "endId": 453734, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c6661991280004dce46a" + }, + { + "created_at": "2022-05-21T11:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 49281, + "type": "NORMAL", + "rate": 1.022, + "percent": 40, + "pumpId": 453728, + "endId": 453731, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c5381991280004dce466" + }, + { + "created_at": "2022-05-21T10:55:43.162Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 256838, + "type": "NORMAL", + "rate": 1.0248, + "percent": 40, + "pumpId": 453728, + "endId": 453731, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c5381991280004dce466" + }, + { + "created_at": "2022-05-21T10:50:29.463Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 312203, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453725, + "endId": 453727, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c40a1991280004dce463" + }, + { + "created_at": "2022-05-21T10:45:42.010Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 285961, + "type": "NORMAL", + "rate": 0.0732, + "percent": -90, + "pumpId": 453722, + "endId": 453724, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c2dd1991280004dce460" + }, + { + "created_at": "2022-05-21T10:40:32.888Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 306629, + "type": "NORMAL", + "rate": 0.2928, + "percent": -60, + "pumpId": 453719, + "endId": 453721, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288c1ae1991280004dce45d" + }, + { + "created_at": "2022-05-21T10:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 40, + "durationInMilliseconds": 2430396, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453715, + "endId": 453718, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288b09fc9c02c00041f7efb" + }, + { + "created_at": "2022-05-21T09:27:51.738Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 32, + "durationInMilliseconds": 1928262, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453715, + "endId": 453718, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288b09fc9c02c00041f7efb" + }, + { + "created_at": "2022-05-21T09:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 27, + "durationInMilliseconds": 1670246, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453708, + "endId": 453714, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288a50699fc930004d6bdea" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.32, + "created_at": "2022-05-21T08:58:07.216Z", + "date": 1653123487216, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21541, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288a9a499fc930004d6bdf2" + }, + { + "created_at": "2022-05-21T08:38:27.621Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 21, + "durationInMilliseconds": 1292379, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453708, + "endId": 453714, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288a50699fc930004d6bdea" + }, + { + "created_at": "2022-05-21T08:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 38, + "durationInMilliseconds": 2306129, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453704, + "endId": 453707, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62889bb2a4cc860004a251c6" + }, + { + "created_at": "2022-05-21T07:58:04.003Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 1, + "durationInMilliseconds": 115997, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453704, + "endId": 453707, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62889bb2a4cc860004a251c6" + }, + { + "eventType": "Meal Bolus", + "insulin": 13.56, + "created_at": "2022-05-21T07:52:52.394Z", + "date": 1653119572394, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 21540, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62889a5d7ff1e700040f17d9" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.34, + "created_at": "2022-05-21T07:38:42.955Z", + "date": 1653118722955, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21539, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288971c7ff1e700040f17d2" + }, + { + "created_at": "2022-05-21T07:38:40.317Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 19, + "durationInMilliseconds": 1153999, + "type": "FAKE_EXTENDED", + "rate": 2.251401644195532, + "absolute": 2.251401644195532, + "pumpId": 21538, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628897027ff1e700040f17d0" + }, + { + "created_at": "2022-05-21T07:28:33.763Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 595482, + "type": "NORMAL", + "rate": 0.377, + "percent": -50, + "pumpId": 453689, + "endId": 453691, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628894a17ff1e700040f17cc" + }, + { + "created_at": "2022-05-21T07:13:06.679Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 15, + "durationInMilliseconds": 924592, + "type": "NORMAL", + "rate": 0.2262, + "percent": -70, + "pumpId": 453686, + "endId": 453688, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62889106149196000412bf59" + }, + { + "created_at": "2022-05-21T07:08:35.905Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 269284, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453683, + "endId": 453685, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288900b149196000412bf56" + }, + { + "created_at": "2022-05-21T07:03:41.224Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 292184, + "type": "NORMAL", + "rate": 0.0754, + "percent": -90, + "pumpId": 453680, + "endId": 453682, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62888edd149196000412bf53" + }, + { + "created_at": "2022-05-21T07:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 3, + "durationInMilliseconds": 219733, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453676, + "endId": 453679, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628887058ff3530004dc606e" + }, + { + "created_at": "2022-05-21T06:30:07.195Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1792805, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453676, + "endId": 453679, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628887058ff3530004dc606e" + }, + { + "created_at": "2022-05-21T06:12:44.359Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 17, + "durationInMilliseconds": 1041347, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453673, + "endId": 453675, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628882e48ff3530004dc6064" + }, + { + "created_at": "2022-05-21T06:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 12, + "durationInMilliseconds": 762867, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453669, + "endId": 453672, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62887ea0e964810004aa5663" + }, + { + "created_at": "2022-05-21T05:54:16.341Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 343659, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453669, + "endId": 453672, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62887ea0e964810004aa5663" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.44, + "created_at": "2022-05-21T05:47:59.042Z", + "date": 1653112079042, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21537, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62887d27e964810004aa5660" + }, + { + "created_at": "2022-05-21T05:47:56.189Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 6, + "durationInMilliseconds": 371000, + "type": "FAKE_EXTENDED", + "rate": 3.305911051212938, + "absolute": 3.305911051212938, + "pumpId": 21536, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62887d0ee964810004aa565f" + }, + { + "created_at": "2022-05-21T05:42:45.087Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299481, + "type": "NORMAL", + "rate": 0.8613000000000001, + "percent": 10, + "pumpId": 453657, + "endId": 453659, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62887be0e964810004aa565c" + }, + { + "created_at": "2022-05-21T05:37:33.183Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 309411, + "type": "NORMAL", + "rate": 0.0783, + "percent": -90, + "pumpId": 453654, + "endId": 453656, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62887ab2e964810004aa5659" + }, + { + "created_at": "2022-05-21T05:12:51.790Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 24, + "durationInMilliseconds": 1479904, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453651, + "endId": 453653, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628874e5363e6c0004f710db" + }, + { + "created_at": "2022-05-21T05:07:46.012Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 304280, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453648, + "endId": 453650, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628873b8363e6c0004f710d8" + }, + { + "created_at": "2022-05-21T05:02:53.773Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 289742, + "type": "NORMAL", + "rate": 0.1566, + "percent": -80, + "pumpId": 453645, + "endId": 453647, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288728a363e6c0004f710d5" + }, + { + "created_at": "2022-05-21T05:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 2, + "durationInMilliseconds": 171279, + "type": "NORMAL", + "rate": 1.5659999999999998, + "percent": 100, + "pumpId": 453639, + "endId": 453644, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288715d363e6c0004f710d2" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.2, + "created_at": "2022-05-21T04:57:53.298Z", + "date": 1653109073298, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21535, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288715c363e6c0004f710d1" + }, + { + "created_at": "2022-05-21T04:57:50.147Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 2, + "durationInMilliseconds": 129853, + "type": "NORMAL", + "rate": 1.472, + "percent": 100, + "pumpId": 453639, + "endId": 453644, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288715d363e6c0004f710d2" + }, + { + "created_at": "2022-05-21T04:52:45.360Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 303299, + "type": "NORMAL", + "rate": 1.0304, + "percent": 40, + "pumpId": 453636, + "endId": 453638, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288702f363e6c0004f710ce" + }, + { + "created_at": "2022-05-21T04:37:34.478Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 15, + "durationInMilliseconds": 909400, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453633, + "endId": 453635, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62886c9719e2e60004989bb7" + }, + { + "created_at": "2022-05-21T04:27:51.392Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 581589, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453630, + "endId": 453632, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62886a5519e2e60004989bb2" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.14, + "created_at": "2022-05-21T04:23:04.285Z", + "date": 1653106984285, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21534, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288694019e2e60004989baf" + }, + { + "created_at": "2022-05-21T04:23:00.631Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 289268, + "type": "NORMAL", + "rate": 0.4416, + "percent": -40, + "pumpId": 453625, + "endId": 453629, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288692719e2e60004989bae" + }, + { + "created_at": "2022-05-21T04:18:00.399Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 291000, + "type": "FAKE_EXTENDED", + "rate": 3.210226804123711, + "absolute": 3.210226804123711, + "pumpId": 21533, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288681219e2e60004989bab" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.66, + "created_at": "2022-05-21T04:13:03.102Z", + "date": 1653106383102, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21532, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628866e342c1220004f95738" + }, + { + "created_at": "2022-05-21T04:13:00.412Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299987, + "type": "FAKE_EXTENDED", + "rate": 3.3759999999999994, + "absolute": 3.3759999999999994, + "pumpId": 21531, + "endId": 21533, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628866e342c1220004f95739" + }, + { + "created_at": "2022-05-21T04:07:39.846Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 307758, + "type": "NORMAL", + "rate": 1.0304, + "percent": 40, + "pumpId": 453609, + "endId": 453611, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288659d42c1220004f95735" + }, + { + "created_at": "2022-05-21T04:02:57.240Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 280112, + "type": "NORMAL", + "rate": 0.368, + "percent": -50, + "pumpId": 453606, + "endId": 453608, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288648842c1220004f95732" + }, + { + "created_at": "2022-05-21T04:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 2, + "durationInMilliseconds": 175749, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453602, + "endId": 453605, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628860fe42c1220004f9572b" + }, + { + "created_at": "2022-05-21T03:47:49.532Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 12, + "durationInMilliseconds": 730468, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453602, + "endId": 453605, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628860fe42c1220004f9572b" + }, + { + "created_at": "2022-05-21T03:43:04.365Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 283670, + "type": "NORMAL", + "rate": 0.7001999999999999, + "percent": -10, + "pumpId": 453599, + "endId": 453601, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62885fcf42c1220004f95728" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.52, + "created_at": "2022-05-21T03:38:07.812Z", + "date": 1653104287812, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21530, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62885ea5293f3e00042c31e0" + }, + { + "created_at": "2022-05-21T03:38:05.030Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 290000, + "type": "FAKE_EXTENDED", + "rate": 3.2607586206896553, + "absolute": 3.2607586206896553, + "pumpId": 21529, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62885ea5293f3e00042c31e1" + }, + { + "created_at": "2022-05-21T03:32:50.531Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 303634, + "type": "NORMAL", + "rate": 0.2334, + "percent": -70, + "pumpId": 453587, + "endId": 453589, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62885d78293f3e00042c31dd" + }, + { + "created_at": "2022-05-21T03:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 32, + "durationInMilliseconds": 1969040, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453583, + "endId": 453586, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628851a75151b5000462a1e1" + }, + { + "created_at": "2022-05-21T02:42:42.383Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 17, + "durationInMilliseconds": 1037617, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453583, + "endId": 453586, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628851a75151b5000462a1e1" + }, + { + "created_at": "2022-05-21T02:37:54.170Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 286717, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453580, + "endId": 453582, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628850925151b5000462a1de" + }, + { + "created_at": "2022-05-21T02:32:55.252Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 297423, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453577, + "endId": 453579, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62884f645151b5000462a1db" + }, + { + "created_at": "2022-05-21T02:28:10.152Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 283605, + "type": "NORMAL", + "rate": 0.2968, + "percent": -60, + "pumpId": 453574, + "endId": 453576, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62884e4993668c0004a30516" + }, + { + "eventType": "Correction Bolus", + "insulin": 1.5, + "created_at": "2022-05-21T02:23:08.766Z", + "date": 1653099788766, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21528, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62884d1b93668c0004a30512" + }, + { + "created_at": "2022-05-21T02:23:06.229Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 294000, + "type": "FAKE_EXTENDED", + "rate": 7.10934693877551, + "absolute": 7.10934693877551, + "pumpId": 21527, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62884d1b93668c0004a30513" + }, + { + "created_at": "2022-05-21T02:17:55.333Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299966, + "type": "NORMAL", + "rate": 0.5936, + "percent": -20, + "pumpId": 453562, + "endId": 453564, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62884bd493668c0004a3050f" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.92, + "created_at": "2022-05-21T02:13:06.284Z", + "date": 1653099186284, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21526, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62884ac093668c0004a3050b" + }, + { + "created_at": "2022-05-21T02:13:03.301Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 283000, + "type": "FAKE_EXTENDED", + "rate": 3.0317526501766783, + "absolute": 3.0317526501766783, + "pumpId": 21525, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62884ac093668c0004a3050c" + }, + { + "created_at": "2022-05-21T02:02:49.661Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 601864, + "type": "NORMAL", + "rate": 0.5201, + "percent": -30, + "pumpId": 453548, + "endId": 453552, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288484c93668c0004a30503" + }, + { + "created_at": "2022-05-21T02:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 2, + "durationInMilliseconds": 168169, + "type": "NORMAL", + "rate": 0.6687000000000001, + "percent": -10, + "pumpId": 453542, + "endId": 453547, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288473793668c0004a30500" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-21T01:57:52.501Z", + "date": 1653098272501, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21524, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288473793668c0004a304ff" + }, + { + "created_at": "2022-05-21T01:57:50.546Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 2, + "durationInMilliseconds": 129454, + "type": "NORMAL", + "rate": 0.7155, + "percent": -10, + "pumpId": 453542, + "endId": 453547, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288473793668c0004a30500" + }, + { + "created_at": "2022-05-21T01:52:49.925Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 300621, + "type": "NORMAL", + "rate": 0.795, + "percent": 0, + "_id": "neutral_1653097969925" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.46, + "created_at": "2022-05-21T01:47:59.874Z", + "date": 1653097679874, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21523, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628844e49d7ff00004aaf0c0" + }, + { + "created_at": "2022-05-21T01:47:56.925Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 293000, + "type": "FAKE_EXTENDED", + "rate": 3.00660409556314, + "absolute": 3.00660409556314, + "pumpId": 21522, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628844e49d7ff00004aaf0c1" + }, + { + "created_at": "2022-05-21T01:42:53.604Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 292860, + "type": "NORMAL", + "rate": 0.3975, + "percent": -50, + "pumpId": 453530, + "endId": 453532, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628843b79d7ff00004aaf0bd" + }, + { + "created_at": "2022-05-21T01:37:38.923Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 313186, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453527, + "endId": 453529, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628842709d7ff00004aaf0ba" + }, + { + "created_at": "2022-05-21T01:32:51.444Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 284984, + "type": "NORMAL", + "rate": 0.318, + "percent": -60, + "pumpId": 453524, + "endId": 453526, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288415b9d7ff00004aaf0b7" + }, + { + "eventType": "Correction Bolus", + "insulin": 1.5, + "created_at": "2022-05-21T01:27:52.076Z", + "date": 1653096472076, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21521, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288402d9d7ff00004aaf0b4" + }, + { + "eventType": "Correction Bolus", + "insulin": 1.6, + "created_at": "2022-05-21T01:18:07.619Z", + "date": 1653095887619, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21520, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62883de332ad2e0004b68cca" + }, + { + "created_at": "2022-05-21T01:18:05.464Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 876000, + "type": "FAKE_EXTENDED", + "rate": 5.068972602739726, + "absolute": 5.068972602739726, + "pumpId": 21519, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62883de332ad2e0004b68cc9" + }, + { + "created_at": "2022-05-21T01:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 18, + "durationInMilliseconds": 1085464, + "type": "NORMAL", + "rate": 0.795, + "percent": 0, + "_id": "neutral_1653086276443" + }, + { + "created_at": "2022-05-21T00:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 60, + "durationInMilliseconds": 3600000, + "type": "NORMAL", + "rate": 0.76, + "percent": 0, + "_id": "neutral_1653086276443" + }, + { + "created_at": "2022-05-20T23:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 60, + "durationInMilliseconds": 3600000, + "type": "NORMAL", + "rate": 0.738, + "percent": 0, + "_id": "neutral_1653086276443" + }, + { + "created_at": "2022-05-20T22:37:56.443Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 22, + "durationInMilliseconds": 1323557, + "type": "NORMAL", + "rate": 0.7239999999999999, + "percent": 0, + "_id": "neutral_1653086276443" + }, + { + "created_at": "2022-05-20T22:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 37, + "durationInMilliseconds": 2276443, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453504, + "endId": 453510, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62880a6b1664860004cb51ad" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-20T21:38:36.984Z", + "date": 1653082716984, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21518, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62880a6b1664860004cb51ac" + }, + { + "created_at": "2022-05-20T21:38:35.831Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 21, + "durationInMilliseconds": 1284169, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453504, + "endId": 453510, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "62880a6b1664860004cb51ad" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-20T21:28:21.755Z", + "date": 1653082101755, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21517, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628807f71664860004cb51a6" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.18, + "created_at": "2022-05-20T21:18:34.069Z", + "date": 1653081514069, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21516, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "628805b61664860004cb51a2" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.22, + "created_at": "2022-05-20T21:08:33.702Z", + "date": 1653080913702, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21515, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288035c1664860004cb519c" + }, + { + "created_at": "2022-05-20T21:08:31.728Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 30, + "durationInMilliseconds": 1801610, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453495, + "endId": 453503, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6288035c1664860004cb519d" + }, + { + "created_at": "2022-05-20T21:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 8, + "durationInMilliseconds": 510237, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453478, + "endId": 453494, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287ece572b1ae0004593ff0" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.22, + "created_at": "2022-05-20T20:53:24.438Z", + "date": 1653080004438, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21514, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287ffd41664860004cb5195" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.32, + "created_at": "2022-05-20T20:43:26.220Z", + "date": 1653079406220, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21513, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287fd7ba2dcb700046b8728" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.28, + "created_at": "2022-05-20T20:33:38.526Z", + "date": 1653078818526, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21512, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287fb3aa2dcb700046b8724" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.28, + "created_at": "2022-05-20T20:22:54.311Z", + "date": 1653078174311, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21511, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287f8aba2dcb700046b871e" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.34, + "created_at": "2022-05-20T20:17:40.808Z", + "date": 1653077860808, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21510, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287f765a2dcb700046b871b" + }, + { + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-20T20:08:27.325Z", + "date": 1653077307325, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21509, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287f54db2af570004d8c046" + }, + { + "created_at": "2022-05-20T20:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 60, + "durationInMilliseconds": 3600000, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453478, + "endId": 453494, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287ece572b1ae0004593ff0" + }, + { + "created_at": "2022-05-20T19:32:50.116Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 27, + "durationInMilliseconds": 1629884, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453478, + "endId": 453494, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287ece572b1ae0004593ff0" + }, + { + "eventType": "Meal Bolus", + "insulin": 9.58, + "created_at": "2022-05-20T19:27:22.747Z", + "date": 1653074842747, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 21508, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287eb9d72b1ae0004593fea" + }, + { + "created_at": "2022-05-20T19:08:06.145Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 24, + "durationInMilliseconds": 1481495, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453473, + "endId": 453477, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287e73072b1ae0004593fe2" + }, + { + "created_at": "2022-05-20T19:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 8, + "durationInMilliseconds": 484657, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453469, + "endId": 453472, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287dedc72b1ae0004593fd2" + }, + { + "created_at": "2022-05-20T18:33:00.960Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 26, + "durationInMilliseconds": 1619040, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 453469, + "endId": 453472, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287dedc72b1ae0004593fd2" + }, + { + "created_at": "2022-05-20T18:17:39.957Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 15, + "durationInMilliseconds": 918518, + "type": "NORMAL", + "rate": 0.5591999999999999, + "percent": -20, + "pumpId": 453466, + "endId": 453468, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "_id": "6287db4963f1e20004e4e5a7" + }, + { + "created_at": "2022-05-20T18:00:00.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 17, + "durationInMilliseconds": 1059957, + "type": "NORMAL", + "rate": 0.699, + "percent": 0, + "_id": "neutral_1653069600000" + } +] diff --git a/app/src/test/res/autotune/test3/aapsorefautotune_recommendations.log b/app/src/test/res/autotune/test3/aapsorefautotune_recommendations.log new file mode 100644 index 0000000000..b17d6072da --- /dev/null +++ b/app/src/test/res/autotune/test3/aapsorefautotune_recommendations.log @@ -0,0 +1,53 @@ +Parameter | Pump | Autotune | Days Missing +--------------------------------------------------------- +ISF [mg/dL/U] | 86.200 | 93.589 | +Carb Ratio[g/U]| 5.750 | 5.750 | +Basals [U/hr] | - | | + 00:00 | 0.966 | 1.039 | 0 + 00:30 | | | + 01:00 | 0.977 | 1.091 | 0 + 01:30 | | | + 02:00 | 0.971 | 1.118 | 0 + 02:30 | | | + 03:00 | 1.111 | 1.321 | 0 + 03:30 | | | + 04:00 | 0.974 | 1.091 | 0 + 04:30 | | | + 05:00 | 0.923 | 0.965 | 0 + 05:30 | | | + 06:00 | 0.823 | 0.848 | 0 + 06:30 | | | + 07:00 | 0.855 | 1.112 | 0 + 07:30 | | | + 08:00 | 0.902 | 1.173 | 0 + 08:30 | | | + 09:00 | 0.934 | 1.214 | 0 + 09:30 | | | + 10:00 | 0.938 | 1.219 | 0 + 10:30 | | | + 11:00 | 0.903 | 1.070 | 0 + 11:30 | | | + 12:00 | 0.882 | 1.147 | 0 + 12:30 | | | + 13:00 | 0.874 | 1.136 | 0 + 13:30 | | | + 14:00 | 0.866 | 1.126 | 0 + 14:30 | | | + 15:00 | 0.848 | 1.102 | 0 + 15:30 | | | + 16:00 | 0.758 | 0.928 | 0 + 16:30 | | | + 17:00 | 0.650 | 0.710 | 0 + 17:30 | | | + 18:00 | 0.648 | 0.654 | 0 + 18:30 | | | + 19:00 | 0.738 | 0.878 | 0 + 19:30 | | | + 20:00 | 0.847 | 1.101 | 0 + 20:30 | | | + 21:00 | 0.861 | 1.119 | 0 + 21:30 | | | + 22:00 | 0.863 | 1.122 | 0 + 22:30 | | | + 23:00 | 0.843 | 1.047 | 0 + 23:30 | | | diff --git a/app/src/test/res/autotune/test3/aapsorefprofile.2022-05-21.json b/app/src/test/res/autotune/test3/aapsorefprofile.2022-05-21.json new file mode 100644 index 0000000000..eefadabacb --- /dev/null +++ b/app/src/test/res/autotune/test3/aapsorefprofile.2022-05-21.json @@ -0,0 +1,147 @@ +{ + "name": "Tuned Dyn2", + "min_5m_carbimpact": 8, + "dia": 6, + "curve": "ultra-rapid", + "useCustomPeakTime": true, + "insulinPeakTime": 45, + "basalprofile": [ + { + "start": "00:00:00", + "minutes": 0, + "rate": 0.966 + }, + { + "start": "01:00:00", + "minutes": 60, + "rate": 0.977 + }, + { + "start": "02:00:00", + "minutes": 120, + "rate": 0.971 + }, + { + "start": "03:00:00", + "minutes": 180, + "rate": 1.111 + }, + { + "start": "04:00:00", + "minutes": 240, + "rate": 0.974 + }, + { + "start": "05:00:00", + "minutes": 300, + "rate": 0.923 + }, + { + "start": "06:00:00", + "minutes": 360, + "rate": 0.823 + }, + { + "start": "07:00:00", + "minutes": 420, + "rate": 0.855 + }, + { + "start": "08:00:00", + "minutes": 480, + "rate": 0.902 + }, + { + "start": "09:00:00", + "minutes": 540, + "rate": 0.934 + }, + { + "start": "10:00:00", + "minutes": 600, + "rate": 0.938 + }, + { + "start": "11:00:00", + "minutes": 660, + "rate": 0.903 + }, + { + "start": "12:00:00", + "minutes": 720, + "rate": 0.882 + }, + { + "start": "13:00:00", + "minutes": 780, + "rate": 0.874 + }, + { + "start": "14:00:00", + "minutes": 840, + "rate": 0.866 + }, + { + "start": "15:00:00", + "minutes": 900, + "rate": 0.848 + }, + { + "start": "16:00:00", + "minutes": 960, + "rate": 0.758 + }, + { + "start": "17:00:00", + "minutes": 1020, + "rate": 0.65 + }, + { + "start": "18:00:00", + "minutes": 1080, + "rate": 0.648 + }, + { + "start": "19:00:00", + "minutes": 1140, + "rate": 0.738 + }, + { + "start": "20:00:00", + "minutes": 1200, + "rate": 0.847 + }, + { + "start": "21:00:00", + "minutes": 1260, + "rate": 0.861 + }, + { + "start": "22:00:00", + "minutes": 1320, + "rate": 0.863 + }, + { + "start": "23:00:00", + "minutes": 1380, + "rate": 0.843 + } + ], + "isfProfile": { + "sensitivities": [ + { + "i": 0, + "start": "00:00:00", + "sensitivity": 86.2, + "offset": 0, + "x": 0, + "endoffset": 1440 + } + ] + }, + "carb_ratio": 5.75, + "autosens_max": 1.3, + "autosens_min": 0.7, + "units": "mg/dl", + "timezone": "Europe/Paris" +} diff --git a/app/src/test/res/autotune/test3/aapsorefprofile.json b/app/src/test/res/autotune/test3/aapsorefprofile.json new file mode 100644 index 0000000000..e7ae1b4e0e --- /dev/null +++ b/app/src/test/res/autotune/test3/aapsorefprofile.json @@ -0,0 +1,173 @@ +{ + "autosens_max": 1.3, + "autosens_min": 0.7, + "basalprofile": [ + { + "i": 0, + "minutes": 0, + "rate": 1.039, + "start": "00:00:00" + }, + { + "i": 1, + "minutes": 60, + "rate": 1.091, + "start": "01:00:00" + }, + { + "i": 2, + "minutes": 120, + "rate": 1.118, + "start": "02:00:00" + }, + { + "i": 3, + "minutes": 180, + "rate": 1.321, + "start": "03:00:00" + }, + { + "i": 4, + "minutes": 240, + "rate": 1.091, + "start": "04:00:00" + }, + { + "i": 5, + "minutes": 300, + "rate": 0.965, + "start": "05:00:00" + }, + { + "i": 6, + "minutes": 360, + "rate": 0.848, + "start": "06:00:00" + }, + { + "i": 7, + "minutes": 420, + "rate": 1.112, + "start": "07:00:00" + }, + { + "i": 8, + "minutes": 480, + "rate": 1.173, + "start": "08:00:00" + }, + { + "i": 9, + "minutes": 540, + "rate": 1.214, + "start": "09:00:00" + }, + { + "i": 10, + "minutes": 600, + "rate": 1.219, + "start": "10:00:00" + }, + { + "i": 11, + "minutes": 660, + "rate": 1.07, + "start": "11:00:00" + }, + { + "i": 12, + "minutes": 720, + "rate": 1.147, + "start": "12:00:00" + }, + { + "i": 13, + "minutes": 780, + "rate": 1.136, + "start": "13:00:00" + }, + { + "i": 14, + "minutes": 840, + "rate": 1.126, + "start": "14:00:00" + }, + { + "i": 15, + "minutes": 900, + "rate": 1.102, + "start": "15:00:00" + }, + { + "i": 16, + "minutes": 960, + "rate": 0.928, + "start": "16:00:00" + }, + { + "i": 17, + "minutes": 1020, + "rate": 0.71, + "start": "17:00:00" + }, + { + "i": 18, + "minutes": 1080, + "rate": 0.654, + "start": "18:00:00" + }, + { + "i": 19, + "minutes": 1140, + "rate": 0.878, + "start": "19:00:00" + }, + { + "i": 20, + "minutes": 1200, + "rate": 1.101, + "start": "20:00:00" + }, + { + "i": 21, + "minutes": 1260, + "rate": 1.119, + "start": "21:00:00" + }, + { + "i": 22, + "minutes": 1320, + "rate": 1.122, + "start": "22:00:00" + }, + { + "i": 23, + "minutes": 1380, + "rate": 1.047, + "start": "23:00:00" + } + ], + "carb_ratio": 5.75, + "csf": 14.991, + "curve": "ultra-rapid", + "dia": 6, + "insulinPeakTime": 45, + "isfProfile": { + "sensitivities": [ + { + "endoffset": 1440, + "i": 0, + "offset": 0, + "sensitivity": 93.589, + "start": "00:00:00", + "x": 0 + } + ] + }, + "min_5m_carbimpact": 8, + "name": "Tuned Dyn2", + "sens": 93.589, + "timezone": "Europe/Paris", + "units": "mg/dl", + "useCustomPeakTime": true +} diff --git a/app/src/test/res/autotune/test3/autotune.2022-05-21.json b/app/src/test/res/autotune/test3/autotune.2022-05-21.json new file mode 100644 index 0000000000..deb6b431f6 --- /dev/null +++ b/app/src/test/res/autotune/test3/autotune.2022-05-21.json @@ -0,0 +1 @@ +{"CRData":[],"CSFGlucoseData":[],"ISFGlucoseData":[{"device":"AndroidAPS-DexcomG6","date":1653108249000,"dateString":"2022-05-21T04:44:09.000Z","isValid":true,"sgv":123,"direction":"FortyFiveDown","type":"sgv","_id":"62886e2919e2e60004989bba","glucose":123,"avgDelta":"-7.50","BGI":-7.59,"deviation":"0.09"},{"device":"AndroidAPS-DexcomG6","date":1653108548000,"dateString":"2022-05-21T04:49:08.000Z","isValid":true,"sgv":128,"direction":"Flat","type":"sgv","_id":"62886f5719e2e60004989bbc","glucose":128,"avgDelta":"-4.00","BGI":-7.2,"deviation":"3.20"},{"device":"AndroidAPS-DexcomG6","date":1653110649000,"dateString":"2022-05-21T05:24:09.000Z","isValid":true,"sgv":98,"direction":"FortyFiveDown","type":"sgv","_id":"628877a5363e6c0004f710e0","glucose":98,"avgDelta":"-6.75","BGI":-4.44,"deviation":"-2.31"},{"device":"AndroidAPS-DexcomG6","date":1653110949000,"dateString":"2022-05-21T05:29:09.000Z","isValid":true,"sgv":97,"direction":"Flat","type":"sgv","_id":"628878bbe964810004aa5655","glucose":97,"avgDelta":"-5.00","BGI":-3.92,"deviation":"-1.08"},{"device":"AndroidAPS-DexcomG6","date":1653111249000,"dateString":"2022-05-21T05:34:09.000Z","isValid":true,"sgv":97,"direction":"Flat","type":"sgv","_id":"628879e9e964810004aa5657","glucose":97,"avgDelta":"-3.00","BGI":-3.45,"deviation":"0.45"},{"device":"AndroidAPS-DexcomG6","date":1653111549000,"dateString":"2022-05-21T05:39:09.000Z","isValid":true,"sgv":100,"direction":"Flat","type":"sgv","_id":"62887b17e964810004aa565a","glucose":100,"avgDelta":"-0.50","BGI":-2.84,"deviation":"2.34"},{"device":"AndroidAPS-DexcomG6","date":1653111849000,"dateString":"2022-05-21T05:44:09.000Z","isValid":true,"sgv":102,"direction":"Flat","type":"sgv","_id":"62887c44e964810004aa565d","glucose":102,"avgDelta":"1.00","BGI":-2.37,"deviation":"3.37"},{"device":"AndroidAPS-DexcomG6","date":1653112148000,"dateString":"2022-05-21T05:49:08.000Z","isValid":true,"sgv":103,"direction":"Flat","type":"sgv","_id":"62887d72e964810004aa5661","glucose":103,"avgDelta":"1.50","BGI":-2.07,"deviation":"3.57"},{"device":"AndroidAPS-DexcomG6","date":1653112449000,"dateString":"2022-05-21T05:54:09.000Z","isValid":true,"sgv":102,"direction":"Flat","type":"sgv","_id":"62887ea1e964810004aa5664","glucose":102,"avgDelta":"1.25","BGI":-2.28,"deviation":"3.53"},{"device":"AndroidAPS-DexcomG6","date":1653112749000,"dateString":"2022-05-21T05:59:09.000Z","isValid":true,"sgv":101,"direction":"Flat","type":"sgv","_id":"62887fcee964810004aa5666","glucose":101,"avgDelta":"0.25","BGI":-2.46,"deviation":"2.71"},{"device":"AndroidAPS-DexcomG6","date":1653113049000,"dateString":"2022-05-21T06:04:09.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"628880ee8ff3530004dc6060","glucose":98,"avgDelta":"-1.00","BGI":-2.5,"deviation":"1.50"},{"device":"AndroidAPS-DexcomG6","date":1653113349000,"dateString":"2022-05-21T06:09:09.000Z","isValid":true,"sgv":94,"direction":"Flat","type":"sgv","_id":"6288821b8ff3530004dc6062","glucose":94,"avgDelta":"-2.25","BGI":-2.46,"deviation":"0.21"},{"device":"AndroidAPS-DexcomG6","date":1653113649000,"dateString":"2022-05-21T06:14:09.000Z","isValid":true,"sgv":91,"direction":"Flat","type":"sgv","_id":"6288834a8ff3530004dc6065","glucose":91,"avgDelta":"-2.75","BGI":-2.28,"deviation":"-0.47"},{"device":"AndroidAPS-DexcomG6","date":1653113949000,"dateString":"2022-05-21T06:19:09.000Z","isValid":true,"sgv":89,"direction":"Flat","type":"sgv","_id":"628884778ff3530004dc6067","glucose":89,"avgDelta":"-3.00","BGI":-2.07,"deviation":"-0.93"},{"device":"AndroidAPS-DexcomG6","date":1653114249000,"dateString":"2022-05-21T06:24:09.000Z","isValid":true,"sgv":85,"direction":"Flat","type":"sgv","_id":"628885a48ff3530004dc6069","glucose":85,"avgDelta":"-3.25","BGI":-1.77,"deviation":"-1.48"},{"device":"AndroidAPS-DexcomG6","date":1653153249000,"dateString":"2022-05-21T17:14:09.000Z","isValid":true,"sgv":124,"direction":"FortyFiveDown","type":"sgv","_id":"62891dfd1090500004ca4722","glucose":124,"avgDelta":"-9.00","BGI":-4.05,"deviation":"-4.95"},{"device":"AndroidAPS-DexcomG6","date":1653153549000,"dateString":"2022-05-21T17:19:09.000Z","isValid":true,"sgv":110,"direction":"SingleDown","type":"sgv","_id":"62891f2b1090500004ca4724","glucose":110,"avgDelta":"-12.00","BGI":-3.79,"deviation":"-8.21"},{"device":"AndroidAPS-DexcomG6","date":1653153849000,"dateString":"2022-05-21T17:24:09.000Z","isValid":true,"sgv":96,"direction":"SingleDown","type":"sgv","_id":"628920591090500004ca4727","glucose":96,"avgDelta":"-13.25","BGI":-3.49,"deviation":"-9.76"},{"device":"AndroidAPS-DexcomG6","date":1653154149000,"dateString":"2022-05-21T17:29:09.000Z","isValid":true,"sgv":93,"direction":"SingleDown","type":"sgv","_id":"628921861090500004ca472b","glucose":93,"avgDelta":"-11.25","BGI":-3.19,"deviation":"-8.06"},{"device":"AndroidAPS-DexcomG6","date":1653154449000,"dateString":"2022-05-21T17:34:09.000Z","isValid":true,"sgv":97,"direction":"FortyFiveDown","type":"sgv","_id":"628922b18809e60004c644d6","glucose":97,"avgDelta":"-6.75","BGI":-2.84,"deviation":"-3.91"},{"device":"AndroidAPS-DexcomG6","date":1653154749000,"dateString":"2022-05-21T17:39:09.000Z","isValid":true,"sgv":108,"direction":"NONE","type":"sgv","_id":"628923df8809e60004c644d9","glucose":108,"avgDelta":"-0.50","BGI":-2.5,"deviation":"2.00"},{"device":"AndroidAPS-DexcomG6","date":1653156849000,"dateString":"2022-05-21T18:14:09.000Z","isValid":true,"sgv":110,"direction":"Flat","type":"sgv","_id":"62892c06840d8d0004a20bf2","glucose":110,"avgDelta":"-3.50","BGI":-1.72,"deviation":"-1.78"},{"device":"AndroidAPS-DexcomG6","date":1653180849000,"dateString":"2022-05-22T00:54:09.000Z","isValid":true,"sgv":105,"direction":"SingleDown","type":"sgv","_id":"628989d2da46aa0004d1e0f8","glucose":105,"avgDelta":"-9.50","BGI":-3.1,"deviation":"-6.40"},{"device":"AndroidAPS-DexcomG6","date":1653181150000,"dateString":"2022-05-22T00:59:10.000Z","isValid":true,"sgv":97,"direction":"SingleDown","type":"sgv","_id":"62898b01da46aa0004d1e0fa","glucose":97,"avgDelta":"-11.50","BGI":-2.84,"deviation":"-8.66"},{"device":"AndroidAPS-DexcomG6","date":1653181450000,"dateString":"2022-05-22T01:04:10.000Z","isValid":true,"sgv":92,"direction":"FortyFiveDown","type":"sgv","_id":"62898c2fda46aa0004d1e0fc","glucose":92,"avgDelta":"-10.75","BGI":-2.5,"deviation":"-8.25"},{"device":"AndroidAPS-DexcomG6","date":1653181750000,"dateString":"2022-05-22T01:09:10.000Z","isValid":true,"sgv":87,"direction":"FortyFiveDown","type":"sgv","_id":"62898d4750e51d0004429e5f","glucose":87,"avgDelta":"-8.50","BGI":-2.11,"deviation":"-6.39"}],"basalGlucoseData":[{"device":"AndroidAPS-DexcomG6","date":1653114549000,"dateString":"2022-05-21T06:29:09.000Z","isValid":true,"sgv":80,"direction":"Flat","type":"sgv","_id":"628886d28ff3530004dc606b","glucose":80,"avgDelta":"-3.50","BGI":-1.47,"deviation":"-2.03"},{"device":"AndroidAPS-DexcomG6","date":1653114849000,"dateString":"2022-05-21T06:34:09.000Z","isValid":true,"sgv":78,"direction":"Flat","type":"sgv","_id":"628888018ff3530004dc6070","glucose":78,"avgDelta":"-3.25","BGI":-1.12,"deviation":"-2.13"},{"device":"AndroidAPS-DexcomG6","date":1653115149000,"dateString":"2022-05-21T06:39:09.000Z","isValid":true,"sgv":76,"direction":"Flat","type":"sgv","_id":"6288892a149196000412bf49","glucose":76,"avgDelta":"-3.25","BGI":-0.78,"deviation":"-2.47"},{"device":"AndroidAPS-DexcomG6","date":1653115449000,"dateString":"2022-05-21T06:44:09.000Z","isValid":true,"sgv":74,"direction":"Flat","type":"sgv","_id":"62888a57149196000412bf4b","glucose":74,"avgDelta":"-2.75","BGI":-0.34,"deviation":"-2.41"},{"device":"AndroidAPS-DexcomG6","date":1653115749000,"dateString":"2022-05-21T06:49:09.000Z","isValid":true,"sgv":70,"direction":"Flat","type":"sgv","_id":"62888b85149196000412bf4d","glucose":70,"avgDelta":"-2.50","BGI":0,"deviation":"-2.50"},{"device":"AndroidAPS-DexcomG6","date":1653116049000,"dateString":"2022-05-21T06:54:09.000Z","isValid":true,"sgv":69,"direction":"Flat","type":"sgv","_id":"62888ccc149196000412bf4f","glucose":69,"avgDelta":"-2.25","BGI":0.43,"deviation":"-2.68"},{"device":"AndroidAPS-DexcomG6","date":1653116349000,"dateString":"2022-05-21T06:59:09.000Z","isValid":true,"sgv":70,"direction":"Flat","type":"sgv","_id":"62888de2149196000412bf51","glucose":70,"avgDelta":"-1.50","BGI":0.78,"deviation":"-2.28"},{"device":"AndroidAPS-DexcomG6","date":1653116649000,"dateString":"2022-05-21T07:04:09.000Z","isValid":true,"sgv":74,"direction":"Flat","type":"sgv","_id":"62888f0f149196000412bf54","glucose":74,"avgDelta":"0.00","BGI":1.12,"deviation":"-1.12"},{"device":"AndroidAPS-DexcomG6","date":1653116949000,"dateString":"2022-05-21T07:09:09.000Z","isValid":true,"sgv":76,"direction":"Flat","type":"sgv","_id":"62889024149196000412bf57","glucose":76,"avgDelta":"1.50","BGI":1.47,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653117249000,"dateString":"2022-05-21T07:14:09.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","_id":"628891627ff1e700040f17c6","glucose":79,"avgDelta":"2.50","BGI":1.77,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653117549000,"dateString":"2022-05-21T07:19:09.000Z","isValid":true,"sgv":80,"direction":"Flat","type":"sgv","_id":"628892907ff1e700040f17c7","glucose":80,"avgDelta":"2.50","BGI":2.11,"deviation":"0.39"},{"device":"AndroidAPS-DexcomG6","date":1653117848000,"dateString":"2022-05-21T07:24:08.000Z","isValid":true,"sgv":82,"direction":"Flat","type":"sgv","_id":"628893bd7ff1e700040f17c9","glucose":82,"avgDelta":"2.00","BGI":2.37,"deviation":"-0.37"},{"device":"AndroidAPS-DexcomG6","date":1653118149000,"dateString":"2022-05-21T07:29:09.000Z","isValid":true,"sgv":86,"direction":"Flat","type":"sgv","_id":"628894d37ff1e700040f17cd","glucose":86,"avgDelta":"2.50","BGI":2.63,"deviation":"-0.13"},{"device":"AndroidAPS-DexcomG6","date":1653118449000,"dateString":"2022-05-21T07:34:09.000Z","isValid":true,"sgv":92,"direction":"Flat","type":"sgv","_id":"6288961d7ff1e700040f17ce","glucose":92,"avgDelta":"3.25","BGI":2.84,"deviation":"0.41"},{"device":"AndroidAPS-DexcomG6","date":1653118748000,"dateString":"2022-05-21T07:39:08.000Z","isValid":true,"sgv":97,"direction":"Flat","type":"sgv","_id":"628897357ff1e700040f17d3","glucose":97,"avgDelta":"4.25","BGI":3.06,"deviation":"1.19"},{"device":"AndroidAPS-DexcomG6","date":1653119049000,"dateString":"2022-05-21T07:44:09.000Z","isValid":true,"sgv":105,"direction":"FortyFiveUp","type":"sgv","_id":"628898627ff1e700040f17d5","glucose":105,"avgDelta":"5.75","BGI":2.76,"deviation":"2.99"},{"device":"AndroidAPS-DexcomG6","date":1653119349000,"dateString":"2022-05-21T07:49:09.000Z","isValid":true,"sgv":114,"direction":"FortyFiveUp","type":"sgv","_id":"628899957ff1e700040f17d7","glucose":114,"avgDelta":"7.00","BGI":2.37,"deviation":"4.63"},{"device":"AndroidAPS-DexcomG6","date":1653131349000,"dateString":"2022-05-21T11:09:09.000Z","isValid":true,"sgv":82,"direction":"Flat","type":"sgv","_id":"6288c86f8e9ed800049b39e5","glucose":82,"avgDelta":"-2.25","BGI":-1.25,"deviation":"-1.00"},{"device":"AndroidAPS-DexcomG6","date":1653131649000,"dateString":"2022-05-21T11:14:09.000Z","isValid":true,"sgv":89,"direction":"Flat","type":"sgv","_id":"6288c99e8e9ed800049b39e8","glucose":89,"avgDelta":"0.25","BGI":-0.65,"deviation":"0.90"},{"device":"AndroidAPS-DexcomG6","date":1653131948000,"dateString":"2022-05-21T11:19:08.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"6288cacb8e9ed800049b39ec","glucose":98,"avgDelta":"3.50","BGI":-0.3,"deviation":"3.80"},{"device":"AndroidAPS-DexcomG6","date":1653157149000,"dateString":"2022-05-21T18:19:09.000Z","isValid":true,"sgv":108,"direction":"Flat","type":"sgv","_id":"62892d34840d8d0004a20bf5","glucose":108,"avgDelta":"-3.75","BGI":-1.47,"deviation":"-2.28"},{"device":"AndroidAPS-DexcomG6","date":1653157449000,"dateString":"2022-05-21T18:24:09.000Z","isValid":true,"sgv":108,"direction":"Flat","type":"sgv","_id":"62892e62840d8d0004a20bf8","glucose":108,"avgDelta":"-2.75","BGI":-1.21,"deviation":"-1.54"},{"device":"AndroidAPS-DexcomG6","date":1653157750000,"dateString":"2022-05-21T18:29:10.000Z","isValid":true,"sgv":106,"direction":"Flat","type":"sgv","_id":"62892f8f840d8d0004a20bfa","glucose":106,"avgDelta":"-2.00","BGI":-0.95,"deviation":"-1.05"},{"device":"AndroidAPS-DexcomG6","date":1653158049000,"dateString":"2022-05-21T18:34:09.000Z","isValid":true,"sgv":104,"direction":"Flat","type":"sgv","_id":"628930bc840d8d0004a20bfd","glucose":104,"avgDelta":"-1.50","BGI":-0.69,"deviation":"-0.81"},{"device":"AndroidAPS-DexcomG6","date":1653158349000,"dateString":"2022-05-21T18:39:09.000Z","isValid":true,"sgv":102,"direction":"Flat","type":"sgv","_id":"628931e9840d8d0004a20bff","glucose":102,"avgDelta":"-1.50","BGI":-0.47,"deviation":"-1.03"},{"device":"AndroidAPS-DexcomG6","date":1653158649000,"dateString":"2022-05-21T18:44:09.000Z","isValid":true,"sgv":101,"direction":"Flat","type":"sgv","_id":"6289331c22fbc8000495b813","glucose":101,"avgDelta":"-1.75","BGI":-0.3,"deviation":"-1.45"},{"device":"AndroidAPS-DexcomG6","date":1653158949000,"dateString":"2022-05-21T18:49:09.000Z","isValid":true,"sgv":100,"direction":"Flat","type":"sgv","_id":"6289344a22fbc8000495b815","glucose":100,"avgDelta":"-1.50","BGI":-0.17,"deviation":"-1.33"},{"device":"AndroidAPS-DexcomG6","date":1653159249000,"dateString":"2022-05-21T18:54:09.000Z","isValid":true,"sgv":99,"direction":"Flat","type":"sgv","_id":"6289357622fbc8000495b818","glucose":99,"avgDelta":"-1.25","BGI":-0.04,"deviation":"-1.21"},{"device":"AndroidAPS-DexcomG6","date":1653159549000,"dateString":"2022-05-21T18:59:09.000Z","isValid":true,"sgv":99,"direction":"Flat","type":"sgv","_id":"628936a422fbc8000495b81a","glucose":99,"avgDelta":"-0.75","BGI":0.04,"deviation":"-0.79"},{"device":"AndroidAPS-DexcomG6","date":1653159849000,"dateString":"2022-05-21T19:04:09.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"628937b822fbc8000495b81d","glucose":98,"avgDelta":"-0.75","BGI":0.17,"deviation":"-0.92"},{"device":"AndroidAPS-DexcomG6","date":1653160150000,"dateString":"2022-05-21T19:09:10.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"628938fe22fbc8000495b81f","glucose":98,"avgDelta":"-0.50","BGI":0.3,"deviation":"-0.80"},{"device":"AndroidAPS-DexcomG6","date":1653160449000,"dateString":"2022-05-21T19:14:09.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"62893a1222fbc8000495b822","glucose":98,"avgDelta":"-0.25","BGI":0.43,"deviation":"-0.68"},{"device":"AndroidAPS-DexcomG6","date":1653160749000,"dateString":"2022-05-21T19:19:09.000Z","isValid":true,"sgv":97,"direction":"Flat","type":"sgv","_id":"62893b4f598f780004bb3b22","glucose":97,"avgDelta":"-0.50","BGI":0.52,"deviation":"-1.02"},{"device":"AndroidAPS-DexcomG6","date":1653161049000,"dateString":"2022-05-21T19:24:09.000Z","isValid":true,"sgv":95,"direction":"Flat","type":"sgv","_id":"62893c7d598f780004bb3b24","glucose":95,"avgDelta":"-0.75","BGI":0.6,"deviation":"-1.35"},{"device":"AndroidAPS-DexcomG6","date":1653161350000,"dateString":"2022-05-21T19:29:10.000Z","isValid":true,"sgv":94,"direction":"Flat","type":"sgv","_id":"62893daa598f780004bb3b27","glucose":94,"avgDelta":"-1.00","BGI":0.65,"deviation":"-1.65"},{"device":"AndroidAPS-DexcomG6","date":1653161649000,"dateString":"2022-05-21T19:34:09.000Z","isValid":true,"sgv":93,"direction":"Flat","type":"sgv","_id":"62893ed7598f780004bb3b29","glucose":93,"avgDelta":"-1.25","BGI":0.73,"deviation":"-1.98"},{"device":"AndroidAPS-DexcomG6","date":1653161950000,"dateString":"2022-05-21T19:39:10.000Z","isValid":true,"sgv":91,"direction":"Flat","type":"sgv","_id":"62893feb598f780004bb3b2b","glucose":91,"avgDelta":"-1.50","BGI":0.86,"deviation":"-2.36"},{"device":"AndroidAPS-DexcomG6","date":1653162250000,"dateString":"2022-05-21T19:44:10.000Z","isValid":true,"sgv":89,"direction":"Flat","type":"sgv","_id":"62894118598f780004bb3b2d","glucose":89,"avgDelta":"-1.50","BGI":0.99,"deviation":"-2.49"},{"device":"AndroidAPS-DexcomG6","date":1653162549000,"dateString":"2022-05-21T19:49:09.000Z","isValid":true,"sgv":88,"direction":"Flat","type":"sgv","_id":"6289425f598f780004bb3b30","glucose":88,"avgDelta":"-1.50","BGI":1.12,"deviation":"-2.62"},{"device":"AndroidAPS-DexcomG6","date":1653162850000,"dateString":"2022-05-21T19:54:10.000Z","isValid":true,"sgv":89,"direction":"Flat","type":"sgv","_id":"6289437f4493460004e63a25","glucose":89,"avgDelta":"-1.00","BGI":1.25,"deviation":"-2.25"},{"device":"AndroidAPS-DexcomG6","date":1653163150000,"dateString":"2022-05-21T19:59:10.000Z","isValid":true,"sgv":91,"direction":"Flat","type":"sgv","_id":"628944ae4493460004e63a27","glucose":91,"avgDelta":"0.00","BGI":1.38,"deviation":"-1.38"},{"device":"AndroidAPS-DexcomG6","date":1653163449000,"dateString":"2022-05-21T20:04:09.000Z","isValid":true,"sgv":95,"direction":"Flat","type":"sgv","_id":"628945dc4493460004e63a2a","glucose":95,"avgDelta":"1.50","BGI":1.51,"deviation":"-0.01"},{"device":"AndroidAPS-DexcomG6","date":1653163749000,"dateString":"2022-05-21T20:09:09.000Z","isValid":true,"sgv":100,"direction":"Flat","type":"sgv","_id":"6289470c4493460004e63a2d","glucose":100,"avgDelta":"3.00","BGI":1.55,"deviation":"1.45"},{"device":"AndroidAPS-DexcomG6","date":1653164049000,"dateString":"2022-05-21T20:14:09.000Z","isValid":true,"sgv":109,"direction":"Flat","type":"sgv","_id":"628948214493460004e63a31","glucose":109,"avgDelta":"5.00","BGI":1.51,"deviation":"3.49"},{"device":"AndroidAPS-DexcomG6","date":1653164350000,"dateString":"2022-05-21T20:19:10.000Z","isValid":true,"sgv":120,"direction":"FortyFiveUp","type":"sgv","_id":"6289496a4493460004e63a34","glucose":120,"avgDelta":"7.25","BGI":1.34,"deviation":"5.91"},{"device":"AndroidAPS-DexcomG6","date":1653182050000,"dateString":"2022-05-22T01:14:10.000Z","isValid":true,"sgv":81,"direction":"FortyFiveDown","type":"sgv","_id":"62898e7650e51d0004429e63","glucose":81,"avgDelta":"-6.00","BGI":-1.68,"deviation":"-4.32"},{"device":"AndroidAPS-DexcomG6","date":1653182349000,"dateString":"2022-05-22T01:19:09.000Z","isValid":true,"sgv":77,"direction":"FortyFiveDown","type":"sgv","_id":"62898fa550e51d0004429e65","glucose":77,"avgDelta":"-5.00","BGI":-1.25,"deviation":"-3.75"},{"device":"AndroidAPS-DexcomG6","date":1653182650000,"dateString":"2022-05-22T01:24:10.000Z","isValid":true,"sgv":74,"direction":"FortyFiveDown","type":"sgv","_id":"628990d350e51d0004429e67","glucose":74,"avgDelta":"-4.50","BGI":-0.78,"deviation":"-3.72"},{"device":"AndroidAPS-DexcomG6","date":1653182949000,"dateString":"2022-05-22T01:29:09.000Z","isValid":true,"sgv":72,"direction":"Flat","type":"sgv","_id":"6289920150e51d0004429e69","glucose":72,"avgDelta":"-3.75","BGI":-0.3,"deviation":"-3.45"},{"device":"AndroidAPS-DexcomG6","date":1653183249000,"dateString":"2022-05-22T01:34:09.000Z","isValid":true,"sgv":73,"direction":"Flat","type":"sgv","_id":"6289933050e51d0004429e6b","glucose":73,"avgDelta":"-2.00","BGI":0.22,"deviation":"-2.22"},{"device":"AndroidAPS-DexcomG6","date":1653183550000,"dateString":"2022-05-22T01:39:10.000Z","isValid":true,"sgv":76,"direction":"Flat","type":"sgv","_id":"6289945f50e51d0004429e6d","glucose":76,"avgDelta":"-0.25","BGI":0.69,"deviation":"-0.94"},{"device":"AndroidAPS-DexcomG6","date":1653183850000,"dateString":"2022-05-22T01:44:10.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","_id":"6289957b61a829000474037f","glucose":79,"avgDelta":"1.25","BGI":1.12,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653184150000,"dateString":"2022-05-22T01:49:10.000Z","isValid":true,"sgv":80,"direction":"Flat","type":"sgv","_id":"628996a961a8290004740382","glucose":80,"avgDelta":"2.00","BGI":1.55,"deviation":"0.45"},{"device":"AndroidAPS-DexcomG6","date":1653184450000,"dateString":"2022-05-22T01:54:10.000Z","isValid":true,"sgv":80,"direction":"Flat","type":"sgv","_id":"628997d861a8290004740385","glucose":80,"avgDelta":"1.75","BGI":1.9,"deviation":"-0.15"},{"device":"AndroidAPS-DexcomG6","date":1653099848000,"dateString":"2022-05-21T02:24:08.000Z","isValid":true,"sgv":308,"direction":"FortyFiveUp","type":"sgv","_id":"62884d6793668c0004a30514","glucose":308,"avgDelta":"9.25","BGI":-16.85,"deviation":"26.10","uamAbsorption":"start"},{"device":"AndroidAPS-DexcomG6","date":1653100148000,"dateString":"2022-05-21T02:29:08.000Z","isValid":true,"sgv":307,"direction":"FortyFiveUp","type":"sgv","_id":"62884e9493668c0004a30517","glucose":307,"avgDelta":"9.00","BGI":-18.88,"deviation":"27.88"},{"device":"AndroidAPS-DexcomG6","date":1653100449000,"dateString":"2022-05-21T02:34:09.000Z","isValid":true,"sgv":297,"direction":"Flat","type":"sgv","_id":"62884fb05151b5000462a1dc","glucose":297,"avgDelta":"3.75","BGI":-20.26,"deviation":"24.01"},{"device":"AndroidAPS-DexcomG6","date":1653100748000,"dateString":"2022-05-21T02:39:08.000Z","isValid":true,"sgv":283,"direction":"Flat","type":"sgv","_id":"628850de5151b5000462a1df","glucose":283,"avgDelta":"-3.25","BGI":-21.08,"deviation":"17.83"},{"device":"AndroidAPS-DexcomG6","date":1653101048000,"dateString":"2022-05-21T02:44:08.000Z","isValid":true,"sgv":267,"direction":"FortyFiveDown","type":"sgv","_id":"6288520b5151b5000462a1e2","glucose":267,"avgDelta":"-10.25","BGI":-21.46,"deviation":"11.21"},{"device":"AndroidAPS-DexcomG6","date":1653101348000,"dateString":"2022-05-21T02:49:08.000Z","isValid":true,"sgv":253,"direction":"SingleDown","type":"sgv","_id":"628853395151b5000462a1e4","glucose":253,"avgDelta":"-13.50","BGI":-21.46,"deviation":"7.96"},{"device":"AndroidAPS-DexcomG6","date":1653101648000,"dateString":"2022-05-21T02:54:08.000Z","isValid":true,"sgv":241,"direction":"SingleDown","type":"sgv","_id":"6288547f5151b5000462a1e6","glucose":241,"avgDelta":"-14.00","BGI":-21.16,"deviation":"7.16"},{"device":"AndroidAPS-DexcomG6","date":1653101948000,"dateString":"2022-05-21T02:59:08.000Z","isValid":true,"sgv":228,"direction":"SingleDown","type":"sgv","_id":"628855935151b5000462a1e8","glucose":228,"avgDelta":"-13.75","BGI":-20.52,"deviation":"6.77"},{"device":"AndroidAPS-DexcomG6","date":1653102249000,"dateString":"2022-05-21T03:04:09.000Z","isValid":true,"sgv":216,"direction":"SingleDown","type":"sgv","_id":"628856da5151b5000462a1ea","glucose":216,"avgDelta":"-12.75","BGI":-19.7,"deviation":"6.95"},{"device":"AndroidAPS-DexcomG6","date":1653102548000,"dateString":"2022-05-21T03:09:08.000Z","isValid":true,"sgv":204,"direction":"SingleDown","type":"sgv","_id":"628857f7293f3e00042c31d3","glucose":204,"avgDelta":"-12.25","BGI":-18.79,"deviation":"6.54"},{"device":"AndroidAPS-DexcomG6","date":1653102848000,"dateString":"2022-05-21T03:14:08.000Z","isValid":true,"sgv":193,"direction":"SingleDown","type":"sgv","_id":"62885924293f3e00042c31d5","glucose":193,"avgDelta":"-12.00","BGI":-17.71,"deviation":"5.71"},{"device":"AndroidAPS-DexcomG6","date":1653103149000,"dateString":"2022-05-21T03:19:09.000Z","isValid":true,"sgv":182,"direction":"SingleDown","type":"sgv","_id":"62885a52293f3e00042c31d7","glucose":182,"avgDelta":"-11.50","BGI":-16.64,"deviation":"5.14"},{"device":"AndroidAPS-DexcomG6","date":1653103448000,"dateString":"2022-05-21T03:24:08.000Z","isValid":true,"sgv":174,"direction":"SingleDown","type":"sgv","_id":"62885b81293f3e00042c31d9","glucose":174,"avgDelta":"-10.50","BGI":-15.43,"deviation":"4.93"},{"device":"AndroidAPS-DexcomG6","date":1653103748000,"dateString":"2022-05-21T03:29:08.000Z","isValid":true,"sgv":171,"direction":"FortyFiveDown","type":"sgv","_id":"62885c95293f3e00042c31db","glucose":171,"avgDelta":"-8.25","BGI":-14.31,"deviation":"6.06"},{"device":"AndroidAPS-DexcomG6","date":1653104049000,"dateString":"2022-05-21T03:34:09.000Z","isValid":true,"sgv":170,"direction":"FortyFiveDown","type":"sgv","_id":"62885dc3293f3e00042c31de","glucose":170,"avgDelta":"-5.75","BGI":-13.1,"deviation":"7.35"},{"device":"AndroidAPS-DexcomG6","date":1653104349000,"dateString":"2022-05-21T03:39:09.000Z","isValid":true,"sgv":167,"direction":"Flat","type":"sgv","_id":"62885ef1293f3e00042c31e2","glucose":167,"avgDelta":"-3.75","BGI":-12.07,"deviation":"8.32"},{"device":"AndroidAPS-DexcomG6","date":1653104648000,"dateString":"2022-05-21T03:44:08.000Z","isValid":true,"sgv":162,"direction":"Flat","type":"sgv","_id":"6288601b42c1220004f95729","glucose":162,"avgDelta":"-3.00","BGI":-11.64,"deviation":"8.64"},{"device":"AndroidAPS-DexcomG6","date":1653104949000,"dateString":"2022-05-21T03:49:09.000Z","isValid":true,"sgv":155,"direction":"FortyFiveDown","type":"sgv","_id":"6288614942c1220004f9572c","glucose":155,"avgDelta":"-4.00","BGI":-11.12,"deviation":"7.12"},{"device":"AndroidAPS-DexcomG6","date":1653105248000,"dateString":"2022-05-21T03:54:08.000Z","isValid":true,"sgv":149,"direction":"FortyFiveDown","type":"sgv","_id":"6288629042c1220004f9572e","glucose":149,"avgDelta":"-5.25","BGI":-10.56,"deviation":"5.31"},{"device":"AndroidAPS-DexcomG6","date":1653105549000,"dateString":"2022-05-21T03:59:09.000Z","isValid":true,"sgv":146,"direction":"FortyFiveDown","type":"sgv","_id":"628863a542c1220004f95730","glucose":146,"avgDelta":"-5.25","BGI":-9.87,"deviation":"4.62"},{"device":"AndroidAPS-DexcomG6","date":1653105848000,"dateString":"2022-05-21T04:04:08.000Z","isValid":true,"sgv":146,"direction":"Flat","type":"sgv","_id":"628864d342c1220004f95733","glucose":146,"avgDelta":"-4.00","BGI":-9.14,"deviation":"5.14"},{"device":"AndroidAPS-DexcomG6","date":1653106149000,"dateString":"2022-05-21T04:09:09.000Z","isValid":true,"sgv":151,"direction":"Flat","type":"sgv","_id":"6288660142c1220004f95736","glucose":151,"avgDelta":"-1.00","BGI":-8.36,"deviation":"7.36"},{"device":"AndroidAPS-DexcomG6","date":1653106449000,"dateString":"2022-05-21T04:14:09.000Z","isValid":true,"sgv":155,"direction":"Flat","type":"sgv","_id":"6288672f42c1220004f9573a","glucose":155,"avgDelta":"1.50","BGI":-7.8,"deviation":"9.30"},{"device":"AndroidAPS-DexcomG6","date":1653106749000,"dateString":"2022-05-21T04:19:09.000Z","isValid":true,"sgv":157,"direction":"Flat","type":"sgv","_id":"6288685d19e2e60004989bac","glucose":157,"avgDelta":"2.75","BGI":-7.93,"deviation":"10.68"},{"device":"AndroidAPS-DexcomG6","date":1653107048000,"dateString":"2022-05-21T04:24:08.000Z","isValid":true,"sgv":153,"direction":"Flat","type":"sgv","_id":"6288698b19e2e60004989bb0","glucose":153,"avgDelta":"1.75","BGI":-8.06,"deviation":"9.81"},{"device":"AndroidAPS-DexcomG6","date":1653107348000,"dateString":"2022-05-21T04:29:08.000Z","isValid":true,"sgv":144,"direction":"Flat","type":"sgv","_id":"62886ab919e2e60004989bb3","glucose":144,"avgDelta":"-1.75","BGI":-8.19,"deviation":"6.44"},{"device":"AndroidAPS-DexcomG6","date":1653107648000,"dateString":"2022-05-21T04:34:08.000Z","isValid":true,"sgv":132,"direction":"FortyFiveDown","type":"sgv","_id":"62886be719e2e60004989bb5","glucose":132,"avgDelta":"-5.75","BGI":-8.1,"deviation":"2.35"},{"device":"AndroidAPS-DexcomG6","date":1653107948000,"dateString":"2022-05-21T04:39:08.000Z","isValid":true,"sgv":124,"direction":"FortyFiveDown","type":"sgv","_id":"62886cfc19e2e60004989bb8","glucose":124,"avgDelta":"-8.25","BGI":-7.89,"deviation":"-0.36"},{"device":"AndroidAPS-DexcomG6","date":1653108848000,"dateString":"2022-05-21T04:54:08.000Z","isValid":true,"sgv":130,"direction":"Flat","type":"sgv","_id":"62887093363e6c0004f710cf","glucose":130,"avgDelta":"-0.50","BGI":-6.72,"deviation":"6.22","uamAbsorption":"start"},{"device":"AndroidAPS-DexcomG6","date":1653109148000,"dateString":"2022-05-21T04:59:08.000Z","isValid":true,"sgv":129,"direction":"Flat","type":"sgv","_id":"628871c1363e6c0004f710d3","glucose":129,"avgDelta":"1.25","BGI":-6.34,"deviation":"7.59"},{"device":"AndroidAPS-DexcomG6","date":1653109448000,"dateString":"2022-05-21T05:04:08.000Z","isValid":true,"sgv":125,"direction":"Flat","type":"sgv","_id":"628872ef363e6c0004f710d6","glucose":125,"avgDelta":"0.50","BGI":-6.08,"deviation":"6.58"},{"device":"AndroidAPS-DexcomG6","date":1653109748000,"dateString":"2022-05-21T05:09:08.000Z","isValid":true,"sgv":117,"direction":"Flat","type":"sgv","_id":"6288741c363e6c0004f710d9","glucose":117,"avgDelta":"-2.75","BGI":-5.73,"deviation":"2.98"},{"device":"AndroidAPS-DexcomG6","date":1653110049000,"dateString":"2022-05-21T05:14:09.000Z","isValid":true,"sgv":109,"direction":"FortyFiveDown","type":"sgv","_id":"62887549363e6c0004f710dc","glucose":109,"avgDelta":"-5.25","BGI":-5.34,"deviation":"0.09"},{"device":"AndroidAPS-DexcomG6","date":1653110348000,"dateString":"2022-05-21T05:19:08.000Z","isValid":true,"sgv":102,"direction":"FortyFiveDown","type":"sgv","_id":"62887677363e6c0004f710de","glucose":102,"avgDelta":"-6.75","BGI":-4.91,"deviation":"-1.84"},{"device":"AndroidAPS-DexcomG6","date":1653119649000,"dateString":"2022-05-21T07:54:09.000Z","isValid":true,"sgv":123,"direction":"FortyFiveUp","type":"sgv","_id":"62889ac27ff1e700040f17dc","glucose":123,"avgDelta":"7.75","BGI":-0.99,"deviation":"8.74","uamAbsorption":"start"},{"device":"AndroidAPS-DexcomG6","date":1653119949000,"dateString":"2022-05-21T07:59:09.000Z","isValid":true,"sgv":132,"direction":"FortyFiveUp","type":"sgv","_id":"62889be4a4cc860004a251c7","glucose":132,"avgDelta":"8.75","BGI":-14.27,"deviation":"23.02"},{"device":"AndroidAPS-DexcomG6","date":1653120249000,"dateString":"2022-05-21T08:04:09.000Z","isValid":true,"sgv":141,"direction":"FortyFiveUp","type":"sgv","_id":"62889d13a4cc860004a251c9","glucose":141,"avgDelta":"9.00","BGI":-24.7,"deviation":"33.70"},{"device":"AndroidAPS-DexcomG6","date":1653120548000,"dateString":"2022-05-21T08:09:08.000Z","isValid":true,"sgv":146,"direction":"FortyFiveUp","type":"sgv","_id":"62889e41a4cc860004a251cb","glucose":146,"avgDelta":"8.00","BGI":-32.76,"deviation":"40.76"},{"device":"AndroidAPS-DexcomG6","date":1653120849000,"dateString":"2022-05-21T08:14:09.000Z","isValid":true,"sgv":148,"direction":"FortyFiveUp","type":"sgv","_id":"62889f6fa4cc860004a251cc","glucose":148,"avgDelta":"6.25","BGI":-38.79,"deviation":"45.04"},{"device":"AndroidAPS-DexcomG6","date":1653121149000,"dateString":"2022-05-21T08:19:09.000Z","isValid":true,"sgv":147,"direction":"Flat","type":"sgv","_id":"6288a09fa4cc860004a251ce","glucose":147,"avgDelta":"3.75","BGI":-43.14,"deviation":"46.89"},{"device":"AndroidAPS-DexcomG6","date":1653121449000,"dateString":"2022-05-21T08:24:09.000Z","isValid":true,"sgv":145,"direction":"Flat","type":"sgv","_id":"6288a1cda4cc860004a251d1","glucose":145,"avgDelta":"1.00","BGI":-46.03,"deviation":"47.03"},{"device":"AndroidAPS-DexcomG6","date":1653121749000,"dateString":"2022-05-21T08:29:09.000Z","isValid":true,"sgv":138,"direction":"Flat","type":"sgv","_id":"6288a2fca4cc860004a251d2","glucose":138,"avgDelta":"-2.00","BGI":-47.84,"deviation":"45.84"},{"device":"AndroidAPS-DexcomG6","date":1653122049000,"dateString":"2022-05-21T08:34:09.000Z","isValid":true,"sgv":128,"direction":"Flat","type":"sgv","_id":"6288a42099fc930004d6bde8","glucose":128,"avgDelta":"-5.00","BGI":-48.66,"deviation":"43.66"},{"device":"AndroidAPS-DexcomG6","date":1653122349000,"dateString":"2022-05-21T08:39:09.000Z","isValid":true,"sgv":118,"direction":"FortyFiveDown","type":"sgv","_id":"6288a55199fc930004d6bdeb","glucose":118,"avgDelta":"-7.25","BGI":-48.66,"deviation":"41.41"},{"device":"AndroidAPS-DexcomG6","date":1653122649000,"dateString":"2022-05-21T08:44:09.000Z","isValid":true,"sgv":111,"direction":"FortyFiveDown","type":"sgv","_id":"6288a73099fc930004d6bded","glucose":111,"avgDelta":"-8.50","BGI":-48.01,"deviation":"39.51"},{"device":"AndroidAPS-DexcomG6","date":1653122949000,"dateString":"2022-05-21T08:49:09.000Z","isValid":true,"sgv":108,"direction":"FortyFiveDown","type":"sgv","_id":"6288a7ad99fc930004d6bdef","glucose":108,"avgDelta":"-7.50","BGI":-46.89,"deviation":"39.39"},{"device":"AndroidAPS-DexcomG6","date":1653123248000,"dateString":"2022-05-21T08:54:08.000Z","isValid":true,"sgv":107,"direction":"Flat","type":"sgv","_id":"6288a8db99fc930004d6bdf1","glucose":107,"avgDelta":"-5.25","BGI":-45.38,"deviation":"40.13"},{"device":"AndroidAPS-DexcomG6","date":1653123549000,"dateString":"2022-05-21T08:59:09.000Z","isValid":true,"sgv":109,"direction":"Flat","type":"sgv","_id":"6288a9f099fc930004d6bdf4","glucose":109,"avgDelta":"-2.25","BGI":-43.62,"deviation":"41.37"},{"device":"AndroidAPS-DexcomG6","date":1653123849000,"dateString":"2022-05-21T09:04:09.000Z","isValid":true,"sgv":113,"direction":"Flat","type":"sgv","_id":"6288ab1d99fc930004d6bdf6","glucose":113,"avgDelta":"0.50","BGI":-41.85,"deviation":"42.35"},{"device":"AndroidAPS-DexcomG6","date":1653124149000,"dateString":"2022-05-21T09:09:09.000Z","isValid":true,"sgv":119,"direction":"Flat","type":"sgv","_id":"6288ac4b99fc930004d6bdf8","glucose":119,"avgDelta":"2.75","BGI":-39.95,"deviation":"42.70"},{"device":"AndroidAPS-DexcomG6","date":1653124448000,"dateString":"2022-05-21T09:14:08.000Z","isValid":true,"sgv":124,"direction":"Flat","type":"sgv","_id":"6288ad7999fc930004d6bdfa","glucose":124,"avgDelta":"4.25","BGI":-37.84,"deviation":"42.09"},{"device":"AndroidAPS-DexcomG6","date":1653124749000,"dateString":"2022-05-21T09:19:09.000Z","isValid":true,"sgv":125,"direction":"Flat","type":"sgv","_id":"6288aea799fc930004d6bdfb","glucose":125,"avgDelta":"4.00","BGI":-35.69,"deviation":"39.69"},{"device":"AndroidAPS-DexcomG6","date":1653125048000,"dateString":"2022-05-21T09:24:08.000Z","isValid":true,"sgv":122,"direction":"Flat","type":"sgv","_id":"6288afd5c9c02c00041f7ef8","glucose":122,"avgDelta":"2.25","BGI":-33.4,"deviation":"35.65"},{"device":"AndroidAPS-DexcomG6","date":1653125349000,"dateString":"2022-05-21T09:29:09.000Z","isValid":true,"sgv":120,"direction":"Flat","type":"sgv","_id":"6288b103c9c02c00041f7efc","glucose":120,"avgDelta":"0.25","BGI":-31.2,"deviation":"31.45"},{"device":"AndroidAPS-DexcomG6","date":1653125649000,"dateString":"2022-05-21T09:34:09.000Z","isValid":true,"sgv":118,"direction":"Flat","type":"sgv","_id":"6288b231c9c02c00041f7efe","glucose":118,"avgDelta":"-1.50","BGI":-28.96,"deviation":"27.46"},{"device":"AndroidAPS-DexcomG6","date":1653125948000,"dateString":"2022-05-21T09:39:08.000Z","isValid":true,"sgv":118,"direction":"Flat","type":"sgv","_id":"6288b35fc9c02c00041f7f00","glucose":118,"avgDelta":"-1.75","BGI":-26.77,"deviation":"25.02"},{"device":"AndroidAPS-DexcomG6","date":1653126249000,"dateString":"2022-05-21T09:44:09.000Z","isValid":true,"sgv":118,"direction":"Flat","type":"sgv","_id":"6288b48dc9c02c00041f7f02","glucose":118,"avgDelta":"-1.00","BGI":-24.61,"deviation":"23.61"},{"device":"AndroidAPS-DexcomG6","date":1653126549000,"dateString":"2022-05-21T09:49:09.000Z","isValid":true,"sgv":117,"direction":"Flat","type":"sgv","_id":"6288b5bbc9c02c00041f7f04","glucose":117,"avgDelta":"-0.75","BGI":-22.5,"deviation":"21.75"},{"device":"AndroidAPS-DexcomG6","date":1653126849000,"dateString":"2022-05-21T09:54:09.000Z","isValid":true,"sgv":118,"direction":"Flat","type":"sgv","_id":"6288b6e9c9c02c00041f7f06","glucose":118,"avgDelta":"0.00","BGI":-20.52,"deviation":"20.52"},{"device":"AndroidAPS-DexcomG6","date":1653127149000,"dateString":"2022-05-21T09:59:09.000Z","isValid":true,"sgv":119,"direction":"Flat","type":"sgv","_id":"6288b813abbef90004616ceb","glucose":119,"avgDelta":"0.25","BGI":-18.58,"deviation":"18.83"},{"device":"AndroidAPS-DexcomG6","date":1653127449000,"dateString":"2022-05-21T10:04:09.000Z","isValid":true,"sgv":119,"direction":"Flat","type":"sgv","_id":"6288b941abbef90004616cf0","glucose":119,"avgDelta":"0.25","BGI":-16.72,"deviation":"16.97"},{"device":"AndroidAPS-DexcomG6","date":1653127748000,"dateString":"2022-05-21T10:09:08.000Z","isValid":true,"sgv":115,"direction":"Flat","type":"sgv","_id":"6288ba56abbef90004616cf2","glucose":115,"avgDelta":"-0.50","BGI":-14.96,"deviation":"14.46"},{"device":"AndroidAPS-DexcomG6","date":1653128049000,"dateString":"2022-05-21T10:14:09.000Z","isValid":true,"sgv":110,"direction":"Flat","type":"sgv","_id":"6288bb84abbef90004616cf4","glucose":110,"avgDelta":"-2.00","BGI":-13.32,"deviation":"11.32"},{"device":"AndroidAPS-DexcomG6","date":1653128349000,"dateString":"2022-05-21T10:19:09.000Z","isValid":true,"sgv":104,"direction":"Flat","type":"sgv","_id":"6288bcb2abbef90004616cf6","glucose":104,"avgDelta":"-3.75","BGI":-11.72,"deviation":"7.97"},{"device":"AndroidAPS-DexcomG6","date":1653128649000,"dateString":"2022-05-21T10:24:09.000Z","isValid":true,"sgv":101,"direction":"Flat","type":"sgv","_id":"6288bde0abbef90004616cf8","glucose":101,"avgDelta":"-4.50","BGI":-10.3,"deviation":"5.80"},{"device":"AndroidAPS-DexcomG6","date":1653128948000,"dateString":"2022-05-21T10:29:08.000Z","isValid":true,"sgv":99,"direction":"Flat","type":"sgv","_id":"6288bf061991280004dce457","glucose":99,"avgDelta":"-4.00","BGI":-8.88,"deviation":"4.88"},{"device":"AndroidAPS-DexcomG6","date":1653129249000,"dateString":"2022-05-21T10:34:09.000Z","isValid":true,"sgv":96,"direction":"Flat","type":"sgv","_id":"6288c0341991280004dce459","glucose":96,"avgDelta":"-3.50","BGI":-7.59,"deviation":"4.09"},{"device":"AndroidAPS-DexcomG6","date":1653129548000,"dateString":"2022-05-21T10:39:08.000Z","isValid":true,"sgv":94,"direction":"Flat","type":"sgv","_id":"6288c1631991280004dce45b","glucose":94,"avgDelta":"-2.50","BGI":-6.38,"deviation":"3.88"},{"device":"AndroidAPS-DexcomG6","date":1653129848000,"dateString":"2022-05-21T10:44:08.000Z","isValid":true,"sgv":93,"direction":"Flat","type":"sgv","_id":"6288c2911991280004dce45e","glucose":93,"avgDelta":"-2.00","BGI":-5.26,"deviation":"3.26"},{"device":"AndroidAPS-DexcomG6","date":1653130149000,"dateString":"2022-05-21T10:49:09.000Z","isValid":true,"sgv":91,"direction":"Flat","type":"sgv","_id":"6288c3be1991280004dce461","glucose":91,"avgDelta":"-2.00","BGI":-4.27,"deviation":"2.27"},{"device":"AndroidAPS-DexcomG6","date":1653130448000,"dateString":"2022-05-21T10:54:08.000Z","isValid":true,"sgv":88,"direction":"Flat","type":"sgv","_id":"6288c4ec1991280004dce464","glucose":88,"avgDelta":"-2.00","BGI":-3.36,"deviation":"1.36"},{"device":"AndroidAPS-DexcomG6","date":1653130748000,"dateString":"2022-05-21T10:59:08.000Z","isValid":true,"sgv":84,"direction":"Flat","type":"sgv","_id":"6288c61a1991280004dce468","glucose":84,"avgDelta":"-2.50","BGI":-2.59,"deviation":"0.09"},{"device":"AndroidAPS-DexcomG6","date":1653131049000,"dateString":"2022-05-21T11:04:09.000Z","isValid":true,"sgv":81,"direction":"Flat","type":"sgv","_id":"6288c7418e9ed800049b39e3","glucose":81,"avgDelta":"-3.00","BGI":-1.9,"deviation":"-1.10"},{"device":"AndroidAPS-DexcomG6","date":1653132249000,"dateString":"2022-05-21T11:24:09.000Z","isValid":true,"sgv":109,"direction":"FortyFiveUp","type":"sgv","_id":"6288cbf98e9ed800049b39f2","glucose":109,"avgDelta":"7.00","BGI":-1.94,"deviation":"8.94","uamAbsorption":"start"},{"device":"AndroidAPS-DexcomG6","date":1653132549000,"dateString":"2022-05-21T11:29:09.000Z","isValid":true,"sgv":118,"direction":"FortyFiveUp","type":"sgv","_id":"6288cd278e9ed800049b39f5","glucose":118,"avgDelta":"9.00","BGI":-9.57,"deviation":"18.57"},{"device":"AndroidAPS-DexcomG6","date":1653132849000,"dateString":"2022-05-21T11:34:09.000Z","isValid":true,"sgv":121,"direction":"FortyFiveUp","type":"sgv","_id":"6288ce548e9ed800049b39f7","glucose":121,"avgDelta":"8.00","BGI":-15.47,"deviation":"23.47"},{"device":"AndroidAPS-DexcomG6","date":1653133149000,"dateString":"2022-05-21T11:39:09.000Z","isValid":true,"sgv":114,"direction":"Flat","type":"sgv","_id":"6288cf770f1be700041e59c8","glucose":114,"avgDelta":"4.00","BGI":-20.04,"deviation":"24.04"},{"device":"AndroidAPS-DexcomG6","date":1653133449000,"dateString":"2022-05-21T11:44:09.000Z","isValid":true,"sgv":101,"direction":"Flat","type":"sgv","_id":"6288d0a80f1be700041e59cb","glucose":101,"avgDelta":"-2.00","BGI":-23.32,"deviation":"21.32"},{"device":"AndroidAPS-DexcomG6","date":1653133749000,"dateString":"2022-05-21T11:49:09.000Z","isValid":true,"sgv":87,"direction":"FortyFiveDown","type":"sgv","_id":"6288d1d80f1be700041e59cf","glucose":87,"avgDelta":"-7.75","BGI":-25.69,"deviation":"17.94"},{"device":"AndroidAPS-DexcomG6","date":1653134049000,"dateString":"2022-05-21T11:54:09.000Z","isValid":true,"sgv":79,"direction":"FortyFiveDown","type":"sgv","_id":"6288d3060f1be700041e59d2","glucose":79,"avgDelta":"-10.50","BGI":-27.28,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653134349000,"dateString":"2022-05-21T11:59:09.000Z","isValid":true,"sgv":76,"direction":"FortyFiveDown","type":"sgv","_id":"6288d4220f1be700041e59d5","glucose":76,"avgDelta":"-9.50","BGI":-28.06,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653134649000,"dateString":"2022-05-21T12:04:09.000Z","isValid":true,"sgv":77,"direction":"Flat","type":"sgv","_id":"6288d5500f1be700041e59d7","glucose":77,"avgDelta":"-6.00","BGI":-28.32,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653134949000,"dateString":"2022-05-21T12:09:09.000Z","isValid":true,"sgv":78,"direction":"Flat","type":"sgv","_id":"6288d67f0f1be700041e59da","glucose":78,"avgDelta":"-2.25","BGI":-28.14,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653135249000,"dateString":"2022-05-21T12:14:09.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","_id":"6288d7ae0f1be700041e59de","glucose":79,"avgDelta":"0.00","BGI":-27.76,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653135549000,"dateString":"2022-05-21T12:19:09.000Z","isValid":true,"sgv":78,"direction":"Flat","type":"sgv","_id":"6288d8e00f1be700041e59e0","glucose":78,"avgDelta":"0.50","BGI":-27.02,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653135849000,"dateString":"2022-05-21T12:24:09.000Z","isValid":true,"sgv":76,"direction":"Flat","type":"sgv","_id":"6288d9fb0f1be700041e59e2","glucose":76,"avgDelta":"-0.25","BGI":-26.12,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653136149000,"dateString":"2022-05-21T12:29:09.000Z","isValid":true,"sgv":73,"direction":"Flat","type":"sgv","_id":"6288db8a0f1be700041e59e5","glucose":73,"avgDelta":"-1.25","BGI":-25,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653136449000,"dateString":"2022-05-21T12:34:09.000Z","isValid":true,"sgv":70,"direction":"Flat","type":"sgv","_id":"6288dd270f1be700041e59e8","glucose":70,"avgDelta":"-2.25","BGI":-23.7,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653136749000,"dateString":"2022-05-21T12:39:09.000Z","isValid":true,"sgv":68,"direction":"Flat","type":"sgv","_id":"6288de580f1be700041e59ea","glucose":68,"avgDelta":"-2.50","BGI":-22.37,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653137049000,"dateString":"2022-05-21T12:44:09.000Z","isValid":true,"sgv":69,"direction":"Flat","type":"sgv","_id":"6288df8a0f1be700041e59ec","glucose":69,"avgDelta":"-1.75","BGI":-20.95,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653137350000,"dateString":"2022-05-21T12:49:10.000Z","isValid":true,"sgv":72,"direction":"Flat","type":"sgv","_id":"6288dfd60f1be700041e59ee","glucose":72,"avgDelta":"-0.25","BGI":-19.52,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653137649000,"dateString":"2022-05-21T12:54:09.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","_id":"6288e1040f1be700041e59f0","glucose":79,"avgDelta":"2.25","BGI":-18.02,"deviation":"0.00"},{"device":"AndroidAPS-DexcomG6","date":1653137949000,"dateString":"2022-05-21T12:59:09.000Z","isValid":true,"sgv":86,"direction":"Flat","type":"sgv","_id":"6288e24c0f1be700041e59f3","glucose":86,"avgDelta":"4.50","BGI":-17.54,"deviation":"22.04"},{"device":"AndroidAPS-DexcomG6","date":1653138249000,"dateString":"2022-05-21T13:04:09.000Z","isValid":true,"sgv":93,"direction":"FortyFiveUp","type":"sgv","_id":"6288e3610f1be700041e59f6","glucose":93,"avgDelta":"6.00","BGI":-17.8,"deviation":"23.80"},{"device":"AndroidAPS-DexcomG6","date":1653138549000,"dateString":"2022-05-21T13:09:09.000Z","isValid":true,"sgv":95,"direction":"FortyFiveUp","type":"sgv","_id":"6288e4900f1be700041e59f8","glucose":95,"avgDelta":"5.75","BGI":-18.1,"deviation":"23.85"},{"device":"AndroidAPS-DexcomG6","date":1653138849000,"dateString":"2022-05-21T13:14:09.000Z","isValid":true,"sgv":94,"direction":"Flat","type":"sgv","_id":"6288e5d00f1be700041e59fb","glucose":94,"avgDelta":"3.75","BGI":-18.53,"deviation":"22.28"},{"device":"AndroidAPS-DexcomG6","date":1653139150000,"dateString":"2022-05-21T13:19:10.000Z","isValid":true,"sgv":93,"direction":"Flat","type":"sgv","_id":"6288e7030f1be700041e59fd","glucose":93,"avgDelta":"1.75","BGI":-18.83,"deviation":"20.58"},{"device":"AndroidAPS-DexcomG6","date":1653139450000,"dateString":"2022-05-21T13:24:10.000Z","isValid":true,"sgv":94,"direction":"Flat","type":"sgv","_id":"6288e82c0f1be700041e5a00","glucose":94,"avgDelta":"0.25","BGI":-18.83,"deviation":"19.08"},{"device":"AndroidAPS-DexcomG6","date":1653139749000,"dateString":"2022-05-21T13:29:09.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"6288e9410f1be700041e5a03","glucose":98,"avgDelta":"0.75","BGI":-18.58,"deviation":"19.33"},{"device":"AndroidAPS-DexcomG6","date":1653140049000,"dateString":"2022-05-21T13:34:09.000Z","isValid":true,"sgv":105,"direction":"Flat","type":"sgv","_id":"6288ea6e0f1be700041e5a06","glucose":105,"avgDelta":"2.75","BGI":-18.45,"deviation":"21.20"},{"device":"AndroidAPS-DexcomG6","date":1653140349000,"dateString":"2022-05-21T13:39:09.000Z","isValid":true,"sgv":114,"direction":"FortyFiveUp","type":"sgv","_id":"6288eb9d0f1be700041e5a09","glucose":114,"avgDelta":"5.25","BGI":-18.58,"deviation":"23.83"},{"device":"AndroidAPS-DexcomG6","date":1653140648000,"dateString":"2022-05-21T13:44:08.000Z","isValid":true,"sgv":121,"direction":"FortyFiveUp","type":"sgv","_id":"6288ecca0f1be700041e5a0b","glucose":121,"avgDelta":"6.75","BGI":-18.71,"deviation":"25.46"},{"device":"AndroidAPS-DexcomG6","date":1653140949000,"dateString":"2022-05-21T13:49:09.000Z","isValid":true,"sgv":126,"direction":"FortyFiveUp","type":"sgv","_id":"6288edfc2634cd0004296065","glucose":126,"avgDelta":"7.00","BGI":-19.05,"deviation":"26.05"},{"device":"AndroidAPS-DexcomG6","date":1653141249000,"dateString":"2022-05-21T13:54:09.000Z","isValid":true,"sgv":131,"direction":"FortyFiveUp","type":"sgv","_id":"6288ef2a2634cd0004296067","glucose":131,"avgDelta":"6.50","BGI":-19.48,"deviation":"25.98"},{"device":"AndroidAPS-DexcomG6","date":1653141548000,"dateString":"2022-05-21T13:59:08.000Z","isValid":true,"sgv":139,"direction":"FortyFiveUp","type":"sgv","_id":"6288f03f2634cd000429606a","glucose":139,"avgDelta":"6.25","BGI":-19.91,"deviation":"26.16"},{"device":"AndroidAPS-DexcomG6","date":1653141849000,"dateString":"2022-05-21T14:04:09.000Z","isValid":true,"sgv":147,"direction":"FortyFiveUp","type":"sgv","_id":"6288f16d2634cd000429606c","glucose":147,"avgDelta":"6.50","BGI":-20.17,"deviation":"26.67"},{"device":"AndroidAPS-DexcomG6","date":1653142149000,"dateString":"2022-05-21T14:09:09.000Z","isValid":true,"sgv":155,"direction":"FortyFiveUp","type":"sgv","_id":"6288f29b2634cd000429606f","glucose":155,"avgDelta":"7.25","BGI":-20.73,"deviation":"27.98"},{"device":"AndroidAPS-DexcomG6","date":1653142449000,"dateString":"2022-05-21T14:14:09.000Z","isValid":true,"sgv":160,"direction":"FortyFiveUp","type":"sgv","_id":"6288f3c92634cd0004296071","glucose":160,"avgDelta":"7.25","BGI":-21.08,"deviation":"28.33"},{"device":"AndroidAPS-DexcomG6","date":1653142749000,"dateString":"2022-05-21T14:19:09.000Z","isValid":true,"sgv":166,"direction":"FortyFiveUp","type":"sgv","_id":"6288f4f72634cd0004296074","glucose":166,"avgDelta":"6.75","BGI":-21.55,"deviation":"28.30"},{"device":"AndroidAPS-DexcomG6","date":1653143049000,"dateString":"2022-05-21T14:24:09.000Z","isValid":true,"sgv":174,"direction":"FortyFiveUp","type":"sgv","_id":"6288f62c0e0c880004d58dd8","glucose":174,"avgDelta":"6.75","BGI":-21.89,"deviation":"28.64"},{"device":"AndroidAPS-DexcomG6","date":1653143349000,"dateString":"2022-05-21T14:29:09.000Z","isValid":true,"sgv":182,"direction":"FortyFiveUp","type":"sgv","_id":"6288f75a0e0c880004d58ddb","glucose":182,"avgDelta":"6.75","BGI":-21.98,"deviation":"28.73"},{"device":"AndroidAPS-DexcomG6","date":1653143650000,"dateString":"2022-05-21T14:34:10.000Z","isValid":true,"sgv":185,"direction":"FortyFiveUp","type":"sgv","_id":"6288f8880e0c880004d58dde","glucose":185,"avgDelta":"6.25","BGI":-21.85,"deviation":"28.10"},{"device":"AndroidAPS-DexcomG6","date":1653143949000,"dateString":"2022-05-21T14:39:09.000Z","isValid":true,"sgv":184,"direction":"Flat","type":"sgv","_id":"6288f9b60e0c880004d58de0","glucose":184,"avgDelta":"4.50","BGI":-21.46,"deviation":"25.96"},{"device":"AndroidAPS-DexcomG6","date":1653144249000,"dateString":"2022-05-21T14:44:09.000Z","isValid":true,"sgv":180,"direction":"Flat","type":"sgv","_id":"6288facb0e0c880004d58de3","glucose":180,"avgDelta":"1.50","BGI":-20.82,"deviation":"22.32"},{"device":"AndroidAPS-DexcomG6","date":1653144550000,"dateString":"2022-05-21T14:49:10.000Z","isValid":true,"sgv":178,"direction":"Flat","type":"sgv","_id":"6288fbf90e0c880004d58de5","glucose":178,"avgDelta":"-1.00","BGI":-20,"deviation":"19.00"},{"device":"AndroidAPS-DexcomG6","date":1653144849000,"dateString":"2022-05-21T14:54:09.000Z","isValid":true,"sgv":177,"direction":"Flat","type":"sgv","_id":"6288fd270e0c880004d58de7","glucose":177,"avgDelta":"-2.00","BGI":-19.01,"deviation":"17.01"},{"device":"AndroidAPS-DexcomG6","date":1653145149000,"dateString":"2022-05-21T14:59:09.000Z","isValid":true,"sgv":176,"direction":"Flat","type":"sgv","_id":"6288fe56c9346b0004863359","glucose":176,"avgDelta":"-2.00","BGI":-17.97,"deviation":"15.97"},{"device":"AndroidAPS-DexcomG6","date":1653145449000,"dateString":"2022-05-21T15:04:09.000Z","isValid":true,"sgv":177,"direction":"Flat","type":"sgv","_id":"6288ff9ec9346b000486335b","glucose":177,"avgDelta":"-0.75","BGI":-16.85,"deviation":"16.10"},{"device":"AndroidAPS-DexcomG6","date":1653145750000,"dateString":"2022-05-21T15:09:10.000Z","isValid":true,"sgv":177,"direction":"Flat","type":"sgv","_id":"628900b2c9346b000486335d","glucose":177,"avgDelta":"-0.25","BGI":-15.73,"deviation":"15.48"},{"device":"AndroidAPS-DexcomG6","date":1653146050000,"dateString":"2022-05-21T15:14:10.000Z","isValid":true,"sgv":177,"direction":"Flat","type":"sgv","_id":"628901e0c9346b000486335f","glucose":177,"avgDelta":"0.00","BGI":-14.57,"deviation":"14.57"},{"device":"AndroidAPS-DexcomG6","date":1653146349000,"dateString":"2022-05-21T15:19:09.000Z","isValid":true,"sgv":177,"direction":"Flat","type":"sgv","_id":"6289030ec9346b0004863361","glucose":177,"avgDelta":"0.25","BGI":-13.45,"deviation":"13.70"},{"device":"AndroidAPS-DexcomG6","date":1653146650000,"dateString":"2022-05-21T15:24:10.000Z","isValid":true,"sgv":178,"direction":"Flat","type":"sgv","_id":"6289043cc9346b0004863363","glucose":178,"avgDelta":"0.25","BGI":-12.33,"deviation":"12.58"},{"device":"AndroidAPS-DexcomG6","date":1653146949000,"dateString":"2022-05-21T15:29:09.000Z","isValid":true,"sgv":178,"direction":"Flat","type":"sgv","_id":"6289056ac9346b0004863366","glucose":178,"avgDelta":"0.25","BGI":-11.29,"deviation":"11.54"},{"device":"AndroidAPS-DexcomG6","date":1653147249000,"dateString":"2022-05-21T15:34:09.000Z","isValid":true,"sgv":177,"direction":"Flat","type":"sgv","_id":"6289067fc9346b0004863369","glucose":177,"avgDelta":"0.00","BGI":-10.17,"deviation":"10.17"},{"device":"AndroidAPS-DexcomG6","date":1653147549000,"dateString":"2022-05-21T15:39:09.000Z","isValid":true,"sgv":176,"direction":"Flat","type":"sgv","_id":"628907c5cf7ee10004a2b1ce","glucose":176,"avgDelta":"-0.25","BGI":-9.27,"deviation":"9.02"},{"device":"AndroidAPS-DexcomG6","date":1653147849000,"dateString":"2022-05-21T15:44:09.000Z","isValid":true,"sgv":175,"direction":"Flat","type":"sgv","_id":"628908f3cf7ee10004a2b1d1","glucose":175,"avgDelta":"-0.75","BGI":-8.49,"deviation":"7.74"},{"device":"AndroidAPS-DexcomG6","date":1653148149000,"dateString":"2022-05-21T15:49:09.000Z","isValid":true,"sgv":174,"direction":"Flat","type":"sgv","_id":"62890a21cf7ee10004a2b1d3","glucose":174,"avgDelta":"-1.00","BGI":-7.89,"deviation":"6.89"},{"device":"AndroidAPS-DexcomG6","date":1653148450000,"dateString":"2022-05-21T15:54:10.000Z","isValid":true,"sgv":176,"direction":"Flat","type":"sgv","_id":"62890b36cf7ee10004a2b1d7","glucose":176,"avgDelta":"-0.25","BGI":-7.37,"deviation":"7.12"},{"device":"AndroidAPS-DexcomG6","date":1653148749000,"dateString":"2022-05-21T15:59:09.000Z","isValid":true,"sgv":176,"direction":"Flat","type":"sgv","_id":"62890c64cf7ee10004a2b1da","glucose":176,"avgDelta":"0.00","BGI":-6.94,"deviation":"6.94"},{"device":"AndroidAPS-DexcomG6","date":1653149049000,"dateString":"2022-05-21T16:04:09.000Z","isValid":true,"sgv":176,"direction":"Flat","type":"sgv","_id":"62890daccf7ee10004a2b1de","glucose":176,"avgDelta":"0.25","BGI":-6.72,"deviation":"6.97"},{"device":"AndroidAPS-DexcomG6","date":1653149349000,"dateString":"2022-05-21T16:09:09.000Z","isValid":true,"sgv":174,"direction":"Flat","type":"sgv","_id":"62890edacf7ee10004a2b1e2","glucose":174,"avgDelta":"0.00","BGI":-6.64,"deviation":"6.64"},{"device":"AndroidAPS-DexcomG6","date":1653149650000,"dateString":"2022-05-21T16:14:10.000Z","isValid":true,"sgv":173,"direction":"Flat","type":"sgv","_id":"62890fff1090500004ca46fd","glucose":173,"avgDelta":"-0.75","BGI":-6.42,"deviation":"5.67"},{"device":"AndroidAPS-DexcomG6","date":1653149949000,"dateString":"2022-05-21T16:19:09.000Z","isValid":true,"sgv":172,"direction":"Flat","type":"sgv","_id":"6289130f1090500004ca46ff","glucose":172,"avgDelta":"-1.00","BGI":-6.12,"deviation":"5.12"},{"device":"AndroidAPS-DexcomG6","date":1653150249000,"dateString":"2022-05-21T16:24:09.000Z","isValid":true,"sgv":170,"direction":"Flat","type":"sgv","_id":"628913111090500004ca4704","glucose":170,"avgDelta":"-1.50","BGI":-5.95,"deviation":"4.45"},{"device":"AndroidAPS-DexcomG6","date":1653150549000,"dateString":"2022-05-21T16:29:09.000Z","isValid":true,"sgv":165,"direction":"Flat","type":"sgv","_id":"628913731090500004ca4706","glucose":165,"avgDelta":"-2.25","BGI":-5.73,"deviation":"3.48"},{"device":"AndroidAPS-DexcomG6","date":1653150849000,"dateString":"2022-05-21T16:34:09.000Z","isValid":true,"sgv":161,"direction":"Flat","type":"sgv","_id":"628914d01090500004ca4709","glucose":161,"avgDelta":"-3.00","BGI":-5.47,"deviation":"2.47"},{"device":"AndroidAPS-DexcomG6","date":1653151149000,"dateString":"2022-05-21T16:39:09.000Z","isValid":true,"sgv":158,"direction":"Flat","type":"sgv","_id":"628915ce1090500004ca470c","glucose":158,"avgDelta":"-3.50","BGI":-5.09,"deviation":"1.59"},{"device":"AndroidAPS-DexcomG6","date":1653151449000,"dateString":"2022-05-21T16:44:09.000Z","isValid":true,"sgv":158,"direction":"Flat","type":"sgv","_id":"628916f81090500004ca4710","glucose":158,"avgDelta":"-3.00","BGI":-4.74,"deviation":"1.74"},{"device":"AndroidAPS-DexcomG6","date":1653151749000,"dateString":"2022-05-21T16:49:09.000Z","isValid":true,"sgv":159,"direction":"Flat","type":"sgv","_id":"628918261090500004ca4714","glucose":159,"avgDelta":"-1.50","BGI":-4.53,"deviation":"3.03"},{"device":"AndroidAPS-DexcomG6","date":1653152049000,"dateString":"2022-05-21T16:54:09.000Z","isValid":true,"sgv":160,"direction":"Flat","type":"sgv","_id":"628919531090500004ca4717","glucose":160,"avgDelta":"-0.25","BGI":-4.35,"deviation":"4.10"},{"device":"AndroidAPS-DexcomG6","date":1653152349000,"dateString":"2022-05-21T16:59:09.000Z","isValid":true,"sgv":158,"direction":"Flat","type":"sgv","_id":"62891a811090500004ca471a","glucose":158,"avgDelta":"0.00","BGI":-4.35,"deviation":"4.35"},{"device":"AndroidAPS-DexcomG6","date":1653152649000,"dateString":"2022-05-21T17:04:09.000Z","isValid":true,"sgv":149,"direction":"Flat","type":"sgv","_id":"62891ba31090500004ca471d","glucose":149,"avgDelta":"-2.25","BGI":-4.35,"deviation":"2.10"},{"device":"AndroidAPS-DexcomG6","date":1653152949000,"dateString":"2022-05-21T17:09:09.000Z","isValid":true,"sgv":138,"direction":"FortyFiveDown","type":"sgv","_id":"62891cd01090500004ca471f","glucose":138,"avgDelta":"-5.25","BGI":-4.22,"deviation":"-1.03"},{"device":"AndroidAPS-DexcomG6","date":1653155049000,"dateString":"2022-05-21T17:44:09.000Z","isValid":true,"sgv":116,"direction":"NONE","type":"sgv","_id":"6289250d8809e60004c644dd","glucose":116,"avgDelta":"5.00","BGI":-2.16,"deviation":"7.16","uamAbsorption":"start"},{"device":"AndroidAPS-DexcomG6","date":1653155349000,"dateString":"2022-05-21T17:49:09.000Z","isValid":true,"sgv":123,"direction":"NONE","type":"sgv","_id":"6289263c8809e60004c644e1","glucose":123,"avgDelta":"7.50","BGI":-2.07,"deviation":"9.57"},{"device":"AndroidAPS-DexcomG6","date":1653155649000,"dateString":"2022-05-21T17:54:09.000Z","isValid":true,"sgv":124,"direction":"Flat","type":"sgv","_id":"6289276a8809e60004c644e3","glucose":124,"avgDelta":"6.75","BGI":-2.11,"deviation":"8.86"},{"device":"AndroidAPS-DexcomG6","date":1653155950000,"dateString":"2022-05-21T17:59:10.000Z","isValid":true,"sgv":123,"direction":"Flat","type":"sgv","_id":"6289287e8809e60004c644e6","glucose":123,"avgDelta":"3.75","BGI":-2.16,"deviation":"5.91"},{"device":"AndroidAPS-DexcomG6","date":1653156250000,"dateString":"2022-05-21T18:04:10.000Z","isValid":true,"sgv":119,"direction":"Flat","type":"sgv","_id":"628929ac8809e60004c644e9","glucose":119,"avgDelta":"0.75","BGI":-2.07,"deviation":"2.82"},{"device":"AndroidAPS-DexcomG6","date":1653156549000,"dateString":"2022-05-21T18:09:09.000Z","isValid":true,"sgv":114,"direction":"Flat","type":"sgv","_id":"62892af2840d8d0004a20bf0","glucose":114,"avgDelta":"-2.25","BGI":-1.9,"deviation":"-0.35"},{"device":"AndroidAPS-DexcomG6","date":1653164649000,"dateString":"2022-05-21T20:24:09.000Z","isValid":true,"sgv":133,"direction":"FortyFiveUp","type":"sgv","_id":"62894a7e4493460004e63a38","glucose":133,"avgDelta":"9.50","BGI":-6.46,"deviation":"15.96","uamAbsorption":"start"},{"device":"AndroidAPS-DexcomG6","date":1653164950000,"dateString":"2022-05-21T20:29:10.000Z","isValid":true,"sgv":143,"direction":"SingleUp","type":"sgv","_id":"62894bab80fc7e00041b229b","glucose":143,"avgDelta":"10.75","BGI":-14.31,"deviation":"25.06"},{"device":"AndroidAPS-DexcomG6","date":1653165249000,"dateString":"2022-05-21T20:34:09.000Z","isValid":true,"sgv":145,"direction":"FortyFiveUp","type":"sgv","_id":"62894cdb80fc7e00041b229e","glucose":145,"avgDelta":"9.00","BGI":-20.43,"deviation":"29.43"},{"device":"AndroidAPS-DexcomG6","date":1653165550000,"dateString":"2022-05-21T20:39:10.000Z","isValid":true,"sgv":139,"direction":"Flat","type":"sgv","_id":"62894e0980fc7e00041b22a0","glucose":139,"avgDelta":"4.75","BGI":-25.17,"deviation":"29.92"},{"device":"AndroidAPS-DexcomG6","date":1653165850000,"dateString":"2022-05-21T20:44:10.000Z","isValid":true,"sgv":128,"direction":"Flat","type":"sgv","_id":"62894f3880fc7e00041b22a3","glucose":128,"avgDelta":"-1.25","BGI":-28.62,"deviation":"27.37"},{"device":"AndroidAPS-DexcomG6","date":1653166149000,"dateString":"2022-05-21T20:49:09.000Z","isValid":true,"sgv":118,"direction":"FortyFiveDown","type":"sgv","_id":"6289506680fc7e00041b22a5","glucose":118,"avgDelta":"-6.25","BGI":-30.95,"deviation":"24.70"},{"device":"AndroidAPS-DexcomG6","date":1653166450000,"dateString":"2022-05-21T20:54:10.000Z","isValid":true,"sgv":110,"direction":"FortyFiveDown","type":"sgv","_id":"6289519580fc7e00041b22a7","glucose":110,"avgDelta":"-8.75","BGI":-32.45,"deviation":"23.70"},{"device":"AndroidAPS-DexcomG6","date":1653166749000,"dateString":"2022-05-21T20:59:09.000Z","isValid":true,"sgv":104,"direction":"FortyFiveDown","type":"sgv","_id":"628952c680fc7e00041b22a9","glucose":104,"avgDelta":"-8.75","BGI":-33.27,"deviation":"24.52"},{"device":"AndroidAPS-DexcomG6","date":1653167049000,"dateString":"2022-05-21T21:04:09.000Z","isValid":true,"sgv":101,"direction":"FortyFiveDown","type":"sgv","_id":"628953e79bf1e6000482ff90","glucose":101,"avgDelta":"-6.75","BGI":-33.45,"deviation":"26.70"},{"device":"AndroidAPS-DexcomG6","date":1653167350000,"dateString":"2022-05-21T21:09:10.000Z","isValid":true,"sgv":99,"direction":"Flat","type":"sgv","_id":"628955179bf1e6000482ff92","glucose":99,"avgDelta":"-4.75","BGI":-33.14,"deviation":"28.39"},{"device":"AndroidAPS-DexcomG6","date":1653167650000,"dateString":"2022-05-21T21:14:10.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"628956919bf1e6000482ff96","glucose":98,"avgDelta":"-3.00","BGI":-32.5,"deviation":"29.50"},{"device":"AndroidAPS-DexcomG6","date":1653167949000,"dateString":"2022-05-21T21:19:09.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"6289583f9bf1e6000482ff9b","glucose":98,"avgDelta":"-1.50","BGI":-31.64,"deviation":"30.14"},{"device":"AndroidAPS-DexcomG6","date":1653168250000,"dateString":"2022-05-21T21:24:10.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"628959ed9bf1e6000482ff9e","glucose":98,"avgDelta":"-0.75","BGI":-30.69,"deviation":"29.94"},{"device":"AndroidAPS-DexcomG6","date":1653168549000,"dateString":"2022-05-21T21:29:09.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","_id":"62895b9a9bf1e6000482ffa1","glucose":98,"avgDelta":"-0.25","BGI":-29.74,"deviation":"29.49"},{"device":"AndroidAPS-DexcomG6","date":1653168849000,"dateString":"2022-05-21T21:34:09.000Z","isValid":true,"sgv":100,"direction":"Flat","type":"sgv","_id":"62895d98fb144900043c34e5","glucose":100,"avgDelta":"0.50","BGI":-28.58,"deviation":"29.08"},{"device":"AndroidAPS-DexcomG6","date":1653169150000,"dateString":"2022-05-21T21:39:10.000Z","isValid":true,"sgv":102,"direction":"Flat","type":"sgv","_id":"62895f5ffb144900043c34e8","glucose":102,"avgDelta":"1.00","BGI":-27.28,"deviation":"28.28"},{"device":"AndroidAPS-DexcomG6","date":1653169449000,"dateString":"2022-05-21T21:44:09.000Z","isValid":true,"sgv":105,"direction":"Flat","type":"sgv","_id":"628961a4fb144900043c34ea","glucose":105,"avgDelta":"1.75","BGI":-25.82,"deviation":"27.57"},{"device":"AndroidAPS-DexcomG6","date":1653169749000,"dateString":"2022-05-21T21:49:09.000Z","isValid":true,"sgv":107,"direction":"Flat","type":"sgv","_id":"628964906a5ecf00042d546b","glucose":107,"avgDelta":"2.25","BGI":-24.39,"deviation":"26.64"},{"device":"AndroidAPS-DexcomG6","date":1653170049000,"dateString":"2022-05-21T21:54:09.000Z","isValid":true,"sgv":110,"direction":"Flat","type":"sgv","_id":"628967a06a5ecf00042d546e","glucose":110,"avgDelta":"2.50","BGI":-22.84,"deviation":"25.34"},{"device":"AndroidAPS-DexcomG6","date":1653170350000,"dateString":"2022-05-21T21:59:10.000Z","isValid":true,"sgv":112,"direction":"Flat","type":"sgv","_id":"628969016a5ecf00042d5470","glucose":112,"avgDelta":"2.50","BGI":-21.29,"deviation":"23.79"},{"device":"AndroidAPS-DexcomG6","date":1653170650000,"dateString":"2022-05-21T22:04:10.000Z","isValid":true,"sgv":115,"direction":"Flat","type":"sgv","_id":"628969fd6a5ecf00042d5471","glucose":115,"avgDelta":"2.50","BGI":-19.7,"deviation":"22.20"},{"device":"AndroidAPS-DexcomG6","date":1653170950000,"dateString":"2022-05-21T22:09:10.000Z","isValid":true,"sgv":117,"direction":"Flat","type":"sgv","_id":"62896ac76a5ecf00042d5472","glucose":117,"avgDelta":"2.50","BGI":-18.15,"deviation":"20.65"},{"device":"AndroidAPS-DexcomG6","date":1653171250000,"dateString":"2022-05-21T22:14:10.000Z","isValid":true,"sgv":118,"direction":"Flat","type":"sgv","_id":"62896b5f6a5ecf00042d5474","glucose":118,"avgDelta":"2.00","BGI":-16.59,"deviation":"18.59"},{"device":"AndroidAPS-DexcomG6","date":1653171549000,"dateString":"2022-05-21T22:19:09.000Z","isValid":true,"sgv":120,"direction":"Flat","type":"sgv","_id":"62896c1037d09a00043f2b13","glucose":120,"avgDelta":"2.00","BGI":-15.13,"deviation":"17.13"},{"device":"AndroidAPS-DexcomG6","date":1653171849000,"dateString":"2022-05-21T22:24:09.000Z","isValid":true,"sgv":122,"direction":"Flat","type":"sgv","_id":"62896c7537d09a00043f2b14","glucose":122,"avgDelta":"1.75","BGI":-13.75,"deviation":"15.50"},{"device":"AndroidAPS-DexcomG6","date":1653172150000,"dateString":"2022-05-21T22:29:10.000Z","isValid":true,"sgv":124,"direction":"Flat","type":"sgv","_id":"62896cda37d09a00043f2b16","glucose":124,"avgDelta":"1.75","BGI":-12.41,"deviation":"14.16"},{"device":"AndroidAPS-DexcomG6","date":1653172450000,"dateString":"2022-05-21T22:34:10.000Z","isValid":true,"sgv":124,"direction":"Flat","type":"sgv","_id":"62896d8b37d09a00043f2b17","glucose":124,"avgDelta":"1.50","BGI":-11.21,"deviation":"12.71"},{"device":"AndroidAPS-DexcomG6","date":1653172749000,"dateString":"2022-05-21T22:39:09.000Z","isValid":true,"sgv":120,"direction":"Flat","type":"sgv","_id":"62896e8937d09a00043f2b19","glucose":120,"avgDelta":"0.00","BGI":-10.13,"deviation":"10.13"},{"device":"AndroidAPS-DexcomG6","date":1653173050000,"dateString":"2022-05-21T22:44:10.000Z","isValid":true,"sgv":115,"direction":"Flat","type":"sgv","_id":"62896f8537d09a00043f2b1a","glucose":115,"avgDelta":"-1.75","BGI":-9.05,"deviation":"7.30"},{"device":"AndroidAPS-DexcomG6","date":1653173350000,"dateString":"2022-05-21T22:49:10.000Z","isValid":true,"sgv":110,"direction":"Flat","type":"sgv","_id":"62896fb837d09a00043f2b1b","glucose":110,"avgDelta":"-3.50","BGI":-8.15,"deviation":"4.65"},{"device":"AndroidAPS-DexcomG6","date":1653173650000,"dateString":"2022-05-21T22:54:10.000Z","isValid":true,"sgv":108,"direction":"Flat","type":"sgv","_id":"6289717d37d09a00043f2b1e","glucose":108,"avgDelta":"-4.00","BGI":-7.28,"deviation":"3.28"},{"device":"AndroidAPS-DexcomG6","date":1653173949000,"dateString":"2022-05-21T22:59:09.000Z","isValid":true,"sgv":108,"direction":"Flat","type":"sgv","_id":"6289721437d09a00043f2b1f","glucose":108,"avgDelta":"-3.00","BGI":-6.42,"deviation":"3.42"},{"device":"AndroidAPS-DexcomG6","date":1653174249000,"dateString":"2022-05-21T23:04:09.000Z","isValid":true,"sgv":111,"direction":"Flat","type":"sgv","_id":"6289726037d09a00043f2b20","glucose":111,"avgDelta":"-1.00","BGI":-5.69,"deviation":"4.69"},{"device":"AndroidAPS-DexcomG6","date":1653174550000,"dateString":"2022-05-21T23:09:10.000Z","isValid":true,"sgv":114,"direction":"Flat","type":"sgv","_id":"6289727937d09a00043f2b21","glucose":114,"avgDelta":"1.00","BGI":-4.96,"deviation":"5.96"},{"device":"AndroidAPS-DexcomG6","date":1653174850000,"dateString":"2022-05-21T23:14:10.000Z","isValid":true,"sgv":117,"direction":"Flat","type":"sgv","_id":"6289727a37d09a00043f2b22","glucose":117,"avgDelta":"2.25","BGI":-4.35,"deviation":"6.60"},{"device":"AndroidAPS-DexcomG6","date":1653175149000,"dateString":"2022-05-21T23:19:09.000Z","isValid":true,"sgv":120,"direction":"Flat","type":"sgv","_id":"6289738f37d09a00043f2b26","glucose":120,"avgDelta":"3.00","BGI":-3.84,"deviation":"6.84"},{"device":"AndroidAPS-DexcomG6","date":1653175450000,"dateString":"2022-05-21T23:24:10.000Z","isValid":true,"sgv":123,"direction":"Flat","type":"sgv","_id":"628974b671a363000480abbc","glucose":123,"avgDelta":"3.00","BGI":-3.4,"deviation":"6.40"},{"device":"AndroidAPS-DexcomG6","date":1653175750000,"dateString":"2022-05-21T23:29:10.000Z","isValid":true,"sgv":124,"direction":"Flat","type":"sgv","_id":"628975e471a363000480abbe","glucose":124,"avgDelta":"2.50","BGI":-3.19,"deviation":"5.69"},{"device":"AndroidAPS-DexcomG6","date":1653176050000,"dateString":"2022-05-21T23:34:10.000Z","isValid":true,"sgv":127,"direction":"Flat","type":"sgv","_id":"6289771371a363000480abc1","glucose":127,"avgDelta":"2.50","BGI":-2.93,"deviation":"5.43"},{"device":"AndroidAPS-DexcomG6","date":1653176350000,"dateString":"2022-05-21T23:39:10.000Z","isValid":true,"sgv":132,"direction":"Flat","type":"sgv","_id":"6289784271a363000480abc3","glucose":132,"avgDelta":"3.00","BGI":-2.67,"deviation":"5.67"},{"device":"AndroidAPS-DexcomG6","date":1653176650000,"dateString":"2022-05-21T23:44:10.000Z","isValid":true,"sgv":139,"direction":"Flat","type":"sgv","_id":"6289797071a363000480abc7","glucose":139,"avgDelta":"4.00","BGI":-2.59,"deviation":"6.59"},{"device":"AndroidAPS-DexcomG6","date":1653176950000,"dateString":"2022-05-21T23:49:10.000Z","isValid":true,"sgv":143,"direction":"FortyFiveUp","type":"sgv","_id":"62897a8771a363000480abca","glucose":143,"avgDelta":"4.75","BGI":-2.63,"deviation":"7.38"},{"device":"AndroidAPS-DexcomG6","date":1653177250000,"dateString":"2022-05-21T23:54:10.000Z","isValid":true,"sgv":146,"direction":"Flat","type":"sgv","_id":"62897bc89d6f1800047cd0c9","glucose":146,"avgDelta":"4.75","BGI":-3.23,"deviation":"7.98"},{"device":"AndroidAPS-DexcomG6","date":1653177550000,"dateString":"2022-05-21T23:59:10.000Z","isValid":true,"sgv":147,"direction":"Flat","type":"sgv","_id":"62897cde9d6f1800047cd0cc","glucose":147,"avgDelta":"3.75","BGI":-3.79,"deviation":"7.54"},{"device":"AndroidAPS-DexcomG6","date":1653177850000,"dateString":"2022-05-22T00:04:10.000Z","isValid":true,"sgv":149,"direction":"Flat","type":"sgv","_id":"62897e0c9d6f1800047cd0d0","glucose":149,"avgDelta":"2.50","BGI":-4.22,"deviation":"6.72"},{"device":"AndroidAPS-DexcomG6","date":1653178149000,"dateString":"2022-05-22T00:09:09.000Z","isValid":true,"sgv":149,"direction":"Flat","type":"sgv","_id":"62897f3b9d6f1800047cd0d3","glucose":149,"avgDelta":"1.50","BGI":-4.48,"deviation":"5.98"},{"device":"AndroidAPS-DexcomG6","date":1653178449000,"dateString":"2022-05-22T00:14:09.000Z","isValid":true,"sgv":147,"direction":"Flat","type":"sgv","_id":"6289806a9d6f1800047cd0d6","glucose":147,"avgDelta":"0.25","BGI":-4.61,"deviation":"4.86"},{"device":"AndroidAPS-DexcomG6","date":1653178750000,"dateString":"2022-05-22T00:19:10.000Z","isValid":true,"sgv":144,"direction":"Flat","type":"sgv","_id":"628981999d6f1800047cd0d8","glucose":144,"avgDelta":"-0.75","BGI":-4.57,"deviation":"3.82"},{"device":"AndroidAPS-DexcomG6","date":1653179050000,"dateString":"2022-05-22T00:24:10.000Z","isValid":true,"sgv":142,"direction":"Flat","type":"sgv","_id":"628982c89d6f1800047cd0db","glucose":142,"avgDelta":"-1.75","BGI":-4.48,"deviation":"2.73"},{"device":"AndroidAPS-DexcomG6","date":1653179350000,"dateString":"2022-05-22T00:29:10.000Z","isValid":true,"sgv":142,"direction":"Flat","type":"sgv","_id":"628983f69d6f1800047cd0dd","glucose":142,"avgDelta":"-1.75","BGI":-4.27,"deviation":"2.52"},{"device":"AndroidAPS-DexcomG6","date":1653179649000,"dateString":"2022-05-22T00:34:09.000Z","isValid":true,"sgv":143,"direction":"Flat","type":"sgv","_id":"62898517da46aa0004d1e0ea","glucose":143,"avgDelta":"-1.00","BGI":-4.01,"deviation":"3.01"},{"device":"AndroidAPS-DexcomG6","date":1653179949000,"dateString":"2022-05-22T00:39:09.000Z","isValid":true,"sgv":143,"direction":"Flat","type":"sgv","_id":"62898645da46aa0004d1e0ee","glucose":143,"avgDelta":"-0.25","BGI":-3.75,"deviation":"3.50"},{"device":"AndroidAPS-DexcomG6","date":1653180250000,"dateString":"2022-05-22T00:44:10.000Z","isValid":true,"sgv":135,"direction":"Flat","type":"sgv","_id":"62898774da46aa0004d1e0f1","glucose":135,"avgDelta":"-1.75","BGI":-3.49,"deviation":"1.74"},{"device":"AndroidAPS-DexcomG6","date":1653180549000,"dateString":"2022-05-22T00:49:09.000Z","isValid":true,"sgv":121,"direction":"FortyFiveDown","type":"sgv","_id":"628988a3da46aa0004d1e0f5","glucose":121,"avgDelta":"-5.25","BGI":-3.32,"deviation":"-1.93"}]} diff --git a/app/src/test/res/autotune/test3/autotune.2022-06-25-111350.log b/app/src/test/res/autotune/test3/autotune.2022-06-25-111350.log new file mode 100644 index 0000000000..49e1010a9a --- /dev/null +++ b/app/src/test/res/autotune/test3/autotune.2022-06-25-111350.log @@ -0,0 +1,425 @@ +Autotune disk usage: +160K . +Overall disk used/avail: +Filesystem Size Used Avail Use% Mounted on +rootfs 930G 431G 500G 47% / +Grabbing AAPS treatments.json and entries/sgv.json for date range... +oref0-autotune-prep --categorize_uam_as_basal ns-treatments.2022-05-21.json profile.json ns-entries.2022-05-21.json profile.pump.json > autotune.2022-05-21.json +start uannnounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -16.9 IOB: 5.249 Activity: 0.0391 at 04:24:08 dev: 26.10 avgDelta: 9.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -18.9 IOB: 5.292 Activity: 0.0438 at 04:29:08 dev: 27.88 avgDelta: 9.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -20.3 IOB: 4.964 Activity: 0.047 at 04:34:09 dev: 24.01 avgDelta: 3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -21.1 IOB: 4.674 Activity: 0.0489 at 04:39:08 dev: 17.83 avgDelta: -3.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -21.5 IOB: 4.377 Activity: 0.0498 at 04:44:08 dev: 11.21 avgDelta: -10.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -21.5 IOB: 4.077 Activity: 0.0498 at 04:49:08 dev: 7.96 avgDelta: -13.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -21.2 IOB: 3.73 Activity: 0.0491 at 04:54:08 dev: 7.16 avgDelta: -14.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -20.5 IOB: 3.389 Activity: 0.0476 at 04:59:08 dev: 6.77 avgDelta: -13.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -19.7 IOB: 3.055 Activity: 0.0457 at 05:04:09 dev: 6.95 avgDelta: -12.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -18.8 IOB: 2.782 Activity: 0.0436 at 05:09:08 dev: 6.54 avgDelta: -12.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -17.7 IOB: 2.47 Activity: 0.0411 at 05:14:08 dev: 5.71 avgDelta: -12.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -16.6 IOB: 2.22 Activity: 0.0386 at 05:19:09 dev: 5.14 avgDelta: -11.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -15.4 IOB: 1.935 Activity: 0.0358 at 05:24:08 dev: 4.93 avgDelta: -10.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -14.3 IOB: 1.711 Activity: 0.0332 at 05:29:08 dev: 6.06 avgDelta: -8.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -13.1 IOB: 1.452 Activity: 0.0304 at 05:34:09 dev: 7.35 avgDelta: -5.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -12.1 IOB: 1.927 Activity: 0.028 at 05:39:09 dev: 8.32 avgDelta: -3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -11.6 IOB: 1.84 Activity: 0.027 at 05:44:08 dev: 8.64 avgDelta: -3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -11.1 IOB: 1.658 Activity: 0.0258 at 05:49:09 dev: 7.12 avgDelta: -4.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -10.6 IOB: 1.482 Activity: 0.0245 at 05:54:08 dev: 5.31 avgDelta: -5.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.6 BGI: -9.9 IOB: 1.264 Activity: 0.0229 at 05:59:09 dev: 4.62 avgDelta: -5.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -9.1 IOB: 1.104 Activity: 0.0212 at 06:04:08 dev: 5.14 avgDelta: -4.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -8.4 IOB: 0.952 Activity: 0.0194 at 06:09:09 dev: 7.36 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -7.8 IOB: 1.619 Activity: 0.0181 at 06:14:09 dev: 9.30 avgDelta: 1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -7.9 IOB: 1.678 Activity: 0.0184 at 06:19:09 dev: 10.68 avgDelta: 2.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -8.1 IOB: 1.775 Activity: 0.0187 at 06:24:08 dev: 9.81 avgDelta: 1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -8.2 IOB: 1.581 Activity: 0.019 at 06:29:08 dev: 6.44 avgDelta: -1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -8.1 IOB: 1.437 Activity: 0.0188 at 06:34:08 dev: 2.35 avgDelta: -5.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -7.9 IOB: 1.294 Activity: 0.0183 at 06:39:08 dev: -0.36 avgDelta: -8.25 uam +end unannounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -7.6 IOB: 1.153 Activity: 0.0176 at 06:44:09 dev: 0.09 avgDelta: -7.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -7.2 IOB: 1.017 Activity: 0.0167 at 06:49:08 dev: 3.20 avgDelta: -4.00 ISF +start uannnounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -6.7 IOB: 0.887 Activity: 0.0156 at 06:54:08 dev: 6.22 avgDelta: -0.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -6.3 IOB: 1.011 Activity: 0.0147 at 06:59:08 dev: 7.59 avgDelta: 1.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -6.1 IOB: 0.889 Activity: 0.0141 at 07:04:08 dev: 6.58 avgDelta: 0.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -5.7 IOB: 0.771 Activity: 0.0133 at 07:09:08 dev: 2.98 avgDelta: -2.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -5.3 IOB: 0.656 Activity: 0.0124 at 07:14:09 dev: 0.09 avgDelta: -5.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -4.9 IOB: 0.547 Activity: 0.0114 at 07:19:08 dev: -1.84 avgDelta: -6.75 uam +end unannounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -4.4 IOB: 0.392 Activity: 0.0103 at 07:24:09 dev: -2.31 avgDelta: -6.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -3.9 IOB: 0.294 Activity: 0.0091 at 07:29:09 dev: -1.08 avgDelta: -5.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -3.5 IOB: 0.2 Activity: 0.008 at 07:34:09 dev: 0.45 avgDelta: -3.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -2.8 IOB: 0.065 Activity: 0.0066 at 07:39:09 dev: 2.34 avgDelta: -0.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -2.4 IOB: 0.034 Activity: 0.0055 at 07:44:09 dev: 3.37 avgDelta: 1.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -2.1 IOB: 0.549 Activity: 0.0048 at 07:49:08 dev: 3.57 avgDelta: 1.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -2.3 IOB: 0.674 Activity: 0.0053 at 07:54:09 dev: 3.53 avgDelta: 1.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -2.5 IOB: 0.597 Activity: 0.0057 at 07:59:09 dev: 2.71 avgDelta: 0.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -2.5 IOB: 0.468 Activity: 0.0058 at 08:04:09 dev: 1.50 avgDelta: -1.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -2.5 IOB: 0.389 Activity: 0.0057 at 08:09:09 dev: 0.21 avgDelta: -2.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -2.3 IOB: 0.262 Activity: 0.0053 at 08:14:09 dev: -0.47 avgDelta: -2.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -2.1 IOB: 0.186 Activity: 0.0048 at 08:19:09 dev: -0.93 avgDelta: -3.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -1.8 IOB: 0.064 Activity: 0.0041 at 08:24:09 dev: -1.48 avgDelta: -3.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -1.5 IOB: -0.005 Activity: 0.0034 at 08:29:09 dev: -2.03 avgDelta: -3.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -1.1 IOB: -0.12 Activity: 0.0026 at 08:34:09 dev: -2.13 avgDelta: -3.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -0.8 IOB: -0.181 Activity: 0.0018 at 08:39:09 dev: -2.47 avgDelta: -3.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -0.3 IOB: -0.287 Activity: 0.0008 at 08:44:09 dev: -2.41 avgDelta: -2.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: 0.0 IOB: -0.34 Activity: 0 at 08:49:09 dev: -2.50 avgDelta: -2.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: 0.4 IOB: -0.436 Activity: -0.001 at 08:54:09 dev: -2.68 avgDelta: -2.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: 0.8 IOB: -0.48 Activity: -0.0018 at 08:59:09 dev: -2.28 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 1.1 IOB: -0.519 Activity: -0.0026 at 09:04:09 dev: -1.12 avgDelta: 0.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 1.5 IOB: -0.554 Activity: -0.0034 at 09:09:09 dev: 0.00 avgDelta: 1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 1.8 IOB: -0.585 Activity: -0.0041 at 09:14:09 dev: 0.00 avgDelta: 2.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 2.1 IOB: -0.662 Activity: -0.0049 at 09:19:09 dev: 0.39 avgDelta: 2.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 2.4 IOB: -0.687 Activity: -0.0055 at 09:24:08 dev: -0.37 avgDelta: 2.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 2.6 IOB: -0.708 Activity: -0.0061 at 09:29:09 dev: -0.13 avgDelta: 2.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 2.8 IOB: -0.726 Activity: -0.0066 at 09:34:09 dev: 0.41 avgDelta: 3.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 3.1 IOB: -0.351 Activity: -0.0071 at 09:39:08 dev: 1.19 avgDelta: 4.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 2.8 IOB: -0.218 Activity: -0.0064 at 09:44:09 dev: 2.99 avgDelta: 5.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: 2.4 IOB: -0.088 Activity: -0.0055 at 09:49:09 dev: 4.63 avgDelta: 7.00 basal +start uannnounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -1.0 IOB: 13.594 Activity: 0.0023 at 09:54:09 dev: 8.74 avgDelta: 7.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -14.3 IOB: 13.552 Activity: 0.0331 at 09:59:09 dev: 23.02 avgDelta: 8.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -24.7 IOB: 13.224 Activity: 0.0573 at 10:04:09 dev: 33.70 avgDelta: 9.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -32.8 IOB: 12.838 Activity: 0.076 at 10:09:08 dev: 40.76 avgDelta: 8.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -38.8 IOB: 12.322 Activity: 0.09 at 10:14:09 dev: 45.04 avgDelta: 6.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -43.1 IOB: 11.794 Activity: 0.1001 at 10:19:09 dev: 46.89 avgDelta: 3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -46.0 IOB: 11.177 Activity: 0.1068 at 10:24:09 dev: 47.03 avgDelta: 1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -47.8 IOB: 10.58 Activity: 0.111 at 10:29:09 dev: 45.84 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -48.7 IOB: 9.919 Activity: 0.1129 at 10:34:09 dev: 43.66 avgDelta: -5.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -48.7 IOB: 9.254 Activity: 0.1129 at 10:39:09 dev: 41.41 avgDelta: -7.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -48.0 IOB: 8.643 Activity: 0.1114 at 10:44:09 dev: 39.51 avgDelta: -8.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -46.9 IOB: 7.992 Activity: 0.1088 at 10:49:09 dev: 39.39 avgDelta: -7.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -45.4 IOB: 7.406 Activity: 0.1053 at 10:54:08 dev: 40.13 avgDelta: -5.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.7 BGI: -43.6 IOB: 7.111 Activity: 0.1012 at 10:59:09 dev: 41.37 avgDelta: -2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -41.9 IOB: 6.515 Activity: 0.0971 at 11:04:09 dev: 42.35 avgDelta: 0.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -40.0 IOB: 5.99 Activity: 0.0927 at 11:09:09 dev: 42.70 avgDelta: 2.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -37.8 IOB: 5.439 Activity: 0.0878 at 11:14:08 dev: 42.09 avgDelta: 4.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -35.7 IOB: 4.962 Activity: 0.0828 at 11:19:09 dev: 39.69 avgDelta: 4.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -33.4 IOB: 4.462 Activity: 0.0775 at 11:24:08 dev: 35.65 avgDelta: 2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -31.2 IOB: 4.036 Activity: 0.0724 at 11:29:09 dev: 31.45 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -29.0 IOB: 3.638 Activity: 0.0672 at 11:34:09 dev: 27.46 avgDelta: -1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -26.8 IOB: 3.214 Activity: 0.0621 at 11:39:08 dev: 25.02 avgDelta: -1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -24.6 IOB: 2.866 Activity: 0.0571 at 11:44:09 dev: 23.61 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -22.5 IOB: 2.494 Activity: 0.0522 at 11:49:09 dev: 21.75 avgDelta: -0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -20.5 IOB: 2.193 Activity: 0.0476 at 11:54:09 dev: 20.52 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: -18.6 IOB: 1.867 Activity: 0.0431 at 11:59:09 dev: 18.83 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -16.7 IOB: 1.563 Activity: 0.0388 at 12:04:09 dev: 16.97 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -15.0 IOB: 1.329 Activity: 0.0347 at 12:09:08 dev: 14.46 avgDelta: -0.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -13.3 IOB: 1.115 Activity: 0.0309 at 12:14:09 dev: 11.32 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -11.7 IOB: 0.87 Activity: 0.0272 at 12:19:09 dev: 7.97 avgDelta: -3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -10.3 IOB: 0.692 Activity: 0.0239 at 12:24:09 dev: 5.80 avgDelta: -4.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -8.9 IOB: 0.482 Activity: 0.0206 at 12:29:08 dev: 4.88 avgDelta: -4.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -7.6 IOB: 0.287 Activity: 0.0176 at 12:34:09 dev: 4.09 avgDelta: -3.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -6.4 IOB: 0.156 Activity: 0.0148 at 12:39:08 dev: 3.88 avgDelta: -2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -5.3 IOB: 0.038 Activity: 0.0122 at 12:44:08 dev: 3.26 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -4.3 IOB: -0.067 Activity: 0.0099 at 12:49:09 dev: 2.27 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -3.4 IOB: -0.161 Activity: 0.0078 at 12:54:08 dev: 1.36 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -2.6 IOB: -0.195 Activity: 0.006 at 12:59:08 dev: 0.09 avgDelta: -2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -1.9 IOB: -0.271 Activity: 0.0044 at 13:04:09 dev: -1.10 avgDelta: -3.00 uam +end unannounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -1.3 IOB: -0.339 Activity: 0.0029 at 13:09:09 dev: -1.00 avgDelta: -2.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -0.7 IOB: -0.4 Activity: 0.0015 at 13:14:09 dev: 0.90 avgDelta: 0.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -0.3 IOB: -0.155 Activity: 0.0007 at 13:19:08 dev: 3.80 avgDelta: 3.50 basal +start uannnounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -1.9 IOB: 8.11 Activity: 0.0045 at 13:24:09 dev: 8.94 avgDelta: 7.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -9.6 IOB: 7.992 Activity: 0.0222 at 13:29:09 dev: 18.57 avgDelta: 9.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -15.5 IOB: 7.745 Activity: 0.0359 at 13:34:09 dev: 23.47 avgDelta: 8.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -20.0 IOB: 7.488 Activity: 0.0465 at 13:39:09 dev: 24.04 avgDelta: 4.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -23.3 IOB: 7.136 Activity: 0.0541 at 13:44:09 dev: 21.32 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -25.7 IOB: 6.8 Activity: 0.0596 at 13:49:09 dev: 17.94 avgDelta: -7.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -27.3 IOB: 6.441 Activity: 0.0633 at 13:54:09 dev: 0.00 avgDelta: -10.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.3 BGI: -28.1 IOB: 6.022 Activity: 0.0651 at 13:59:09 dev: 0.00 avgDelta: -9.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -28.3 IOB: 5.644 Activity: 0.0657 at 14:04:09 dev: 0.00 avgDelta: -6.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -28.1 IOB: 5.216 Activity: 0.0653 at 14:09:09 dev: 0.00 avgDelta: -2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -27.8 IOB: 4.962 Activity: 0.0644 at 14:14:09 dev: 0.00 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -27.0 IOB: 4.544 Activity: 0.0627 at 14:19:09 dev: 0.00 avgDelta: 0.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -26.1 IOB: 4.185 Activity: 0.0606 at 14:24:09 dev: 0.00 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -25.0 IOB: 3.839 Activity: 0.058 at 14:29:09 dev: 0.00 avgDelta: -1.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -23.7 IOB: 3.456 Activity: 0.055 at 14:34:09 dev: 0.00 avgDelta: -2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -22.4 IOB: 3.139 Activity: 0.0519 at 14:39:09 dev: 0.00 avgDelta: -2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -20.9 IOB: 2.788 Activity: 0.0486 at 14:44:09 dev: 0.00 avgDelta: -1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -19.5 IOB: 2.503 Activity: 0.0453 at 14:49:10 dev: 0.00 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -18.0 IOB: 2.186 Activity: 0.0418 at 14:54:09 dev: 0.00 avgDelta: 2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -17.5 IOB: 3.17 Activity: 0.0407 at 14:59:09 dev: 22.04 avgDelta: 4.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -17.8 IOB: 3.956 Activity: 0.0413 at 15:04:09 dev: 23.80 avgDelta: 6.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.1 IOB: 3.648 Activity: 0.042 at 15:09:09 dev: 23.85 avgDelta: 5.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.5 IOB: 4.126 Activity: 0.043 at 15:14:09 dev: 22.28 avgDelta: 3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.8 IOB: 3.81 Activity: 0.0437 at 15:19:10 dev: 20.58 avgDelta: 1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.8 IOB: 3.541 Activity: 0.0437 at 15:24:10 dev: 19.08 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.6 IOB: 3.272 Activity: 0.0431 at 15:29:09 dev: 19.33 avgDelta: 0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.4 IOB: 3.588 Activity: 0.0428 at 15:34:09 dev: 21.20 avgDelta: 2.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.6 IOB: 3.875 Activity: 0.0431 at 15:39:09 dev: 23.83 avgDelta: 5.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -18.7 IOB: 3.608 Activity: 0.0434 at 15:44:08 dev: 25.46 avgDelta: 6.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -19.1 IOB: 4.271 Activity: 0.0442 at 15:49:09 dev: 26.05 avgDelta: 7.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -19.5 IOB: 3.996 Activity: 0.0452 at 15:54:09 dev: 25.98 avgDelta: 6.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -19.9 IOB: 4.298 Activity: 0.0462 at 15:59:08 dev: 26.16 avgDelta: 6.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -20.2 IOB: 4.015 Activity: 0.0468 at 16:04:09 dev: 26.67 avgDelta: 6.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -20.7 IOB: 4.538 Activity: 0.0481 at 16:09:09 dev: 27.98 avgDelta: 7.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -21.1 IOB: 4.245 Activity: 0.0489 at 16:14:09 dev: 28.33 avgDelta: 7.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -21.6 IOB: 4.729 Activity: 0.05 at 16:19:09 dev: 28.30 avgDelta: 6.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -21.9 IOB: 4.426 Activity: 0.0508 at 16:24:09 dev: 28.64 avgDelta: 6.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -22.0 IOB: 4.353 Activity: 0.051 at 16:29:09 dev: 28.73 avgDelta: 6.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -21.9 IOB: 4.049 Activity: 0.0507 at 16:34:10 dev: 28.10 avgDelta: 6.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -21.5 IOB: 3.747 Activity: 0.0498 at 16:39:09 dev: 25.96 avgDelta: 4.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -20.8 IOB: 3.402 Activity: 0.0483 at 16:44:09 dev: 22.32 avgDelta: 1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -20.0 IOB: 3.115 Activity: 0.0464 at 16:49:10 dev: 19.00 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -19.0 IOB: 2.788 Activity: 0.0441 at 16:54:09 dev: 17.01 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -18.0 IOB: 2.524 Activity: 0.0417 at 16:59:09 dev: 15.97 avgDelta: -2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -16.9 IOB: 2.271 Activity: 0.0391 at 17:04:09 dev: 16.10 avgDelta: -0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -15.7 IOB: 2.033 Activity: 0.0365 at 17:09:10 dev: 15.48 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -14.6 IOB: 1.807 Activity: 0.0338 at 17:14:10 dev: 14.57 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -13.4 IOB: 1.594 Activity: 0.0312 at 17:19:09 dev: 13.70 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -12.3 IOB: 1.395 Activity: 0.0286 at 17:24:10 dev: 12.58 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -11.3 IOB: 1.258 Activity: 0.0262 at 17:29:09 dev: 11.54 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -10.2 IOB: 1.034 Activity: 0.0236 at 17:34:09 dev: 10.17 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -9.3 IOB: 0.971 Activity: 0.0215 at 17:39:09 dev: 9.02 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -8.5 IOB: 1.008 Activity: 0.0197 at 17:44:09 dev: 7.74 avgDelta: -0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -7.9 IOB: 0.963 Activity: 0.0183 at 17:49:09 dev: 6.89 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -7.4 IOB: 1.046 Activity: 0.0171 at 17:54:10 dev: 7.12 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -6.9 IOB: 0.912 Activity: 0.0161 at 17:59:09 dev: 6.94 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -6.7 IOB: 1.254 Activity: 0.0156 at 18:04:09 dev: 6.97 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -6.6 IOB: 1.176 Activity: 0.0154 at 18:09:09 dev: 6.64 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -6.4 IOB: 1.051 Activity: 0.0149 at 18:14:10 dev: 5.67 avgDelta: -0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -6.1 IOB: 0.928 Activity: 0.0142 at 18:19:09 dev: 5.12 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -6.0 IOB: 1.008 Activity: 0.0138 at 18:24:09 dev: 4.45 avgDelta: -1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -5.7 IOB: 0.89 Activity: 0.0133 at 18:29:09 dev: 3.48 avgDelta: -2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -5.5 IOB: 0.775 Activity: 0.0127 at 18:34:09 dev: 2.47 avgDelta: -3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -5.1 IOB: 0.664 Activity: 0.0118 at 18:39:09 dev: 1.59 avgDelta: -3.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -4.7 IOB: 0.606 Activity: 0.011 at 18:44:09 dev: 1.74 avgDelta: -3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -4.5 IOB: 0.703 Activity: 0.0105 at 18:49:09 dev: 3.03 avgDelta: -1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -4.3 IOB: 0.702 Activity: 0.0101 at 18:54:09 dev: 4.10 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 4.7 BGI: -4.3 IOB: 0.902 Activity: 0.0101 at 18:59:09 dev: 4.35 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -4.3 IOB: 0.801 Activity: 0.0101 at 19:04:09 dev: 2.10 avgDelta: -2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -4.2 IOB: 0.701 Activity: 0.0098 at 19:09:09 dev: -1.03 avgDelta: -5.25 uam +end unannounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -4.0 IOB: 0.603 Activity: 0.0094 at 19:14:09 dev: -4.95 avgDelta: -9.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -3.8 IOB: 0.508 Activity: 0.0088 at 19:19:09 dev: -8.21 avgDelta: -12.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -3.5 IOB: 0.415 Activity: 0.0081 at 19:24:09 dev: -9.76 avgDelta: -13.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -3.2 IOB: 0.327 Activity: 0.0074 at 19:29:09 dev: -8.06 avgDelta: -11.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -2.8 IOB: 0.242 Activity: 0.0066 at 19:34:09 dev: -3.91 avgDelta: -6.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -2.5 IOB: 0.161 Activity: 0.0058 at 19:39:09 dev: 2.00 avgDelta: -0.50 ISF +start uannnounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -2.2 IOB: 0.134 Activity: 0.005 at 19:44:09 dev: 7.16 avgDelta: 5.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -2.1 IOB: 0.4 Activity: 0.0048 at 19:49:09 dev: 9.57 avgDelta: 7.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -2.1 IOB: 0.475 Activity: 0.0049 at 19:54:09 dev: 8.86 avgDelta: 6.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.3 BGI: -2.2 IOB: 0.401 Activity: 0.005 at 19:59:10 dev: 5.91 avgDelta: 3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -2.1 IOB: 0.327 Activity: 0.0048 at 20:04:10 dev: 2.82 avgDelta: 0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -1.9 IOB: 0.203 Activity: 0.0044 at 20:09:09 dev: -0.35 avgDelta: -2.25 uam +end unannounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -1.7 IOB: 0.132 Activity: 0.004 at 20:14:09 dev: -1.78 avgDelta: -3.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -1.5 IOB: 0.064 Activity: 0.0034 at 20:19:09 dev: -2.28 avgDelta: -3.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -1.2 IOB: -0.002 Activity: 0.0028 at 20:24:09 dev: -1.54 avgDelta: -2.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -0.9 IOB: -0.064 Activity: 0.0022 at 20:29:10 dev: -1.05 avgDelta: -2.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -0.7 IOB: -0.073 Activity: 0.0016 at 20:34:09 dev: -0.81 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -0.5 IOB: -0.08 Activity: 0.0011 at 20:39:09 dev: -1.03 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -0.3 IOB: -0.085 Activity: 0.0007 at 20:44:09 dev: -1.45 avgDelta: -1.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -0.2 IOB: -0.087 Activity: 0.0004 at 20:49:09 dev: -1.33 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -0.0 IOB: -0.088 Activity: 0.0001 at 20:54:09 dev: -1.21 avgDelta: -1.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: 0.0 IOB: -0.088 Activity: -0.0001 at 20:59:09 dev: -0.79 avgDelta: -0.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.2 IOB: -0.137 Activity: -0.0004 at 21:04:09 dev: -0.92 avgDelta: -0.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.3 IOB: -0.184 Activity: -0.0007 at 21:09:10 dev: -0.80 avgDelta: -0.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.4 IOB: -0.18 Activity: -0.001 at 21:14:09 dev: -0.68 avgDelta: -0.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.5 IOB: -0.175 Activity: -0.0012 at 21:19:09 dev: -1.02 avgDelta: -0.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.6 IOB: -0.168 Activity: -0.0014 at 21:24:09 dev: -1.35 avgDelta: -0.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.7 IOB: -0.211 Activity: -0.0015 at 21:29:10 dev: -1.65 avgDelta: -1.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.7 IOB: -0.203 Activity: -0.0017 at 21:34:09 dev: -1.98 avgDelta: -1.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 0.9 IOB: -0.243 Activity: -0.002 at 21:39:10 dev: -2.36 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.0 IOB: -0.282 Activity: -0.0023 at 21:44:10 dev: -2.49 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.1 IOB: -0.32 Activity: -0.0026 at 21:49:09 dev: -2.62 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.3 IOB: -0.357 Activity: -0.0029 at 21:54:10 dev: -2.25 avgDelta: -1.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.4 IOB: -0.391 Activity: -0.0032 at 21:59:10 dev: -1.38 avgDelta: 0.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.5 IOB: -0.375 Activity: -0.0035 at 22:04:09 dev: -0.01 avgDelta: 1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.6 IOB: -0.357 Activity: -0.0036 at 22:09:09 dev: 1.45 avgDelta: 3.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.5 IOB: -0.149 Activity: -0.0035 at 22:14:09 dev: 3.49 avgDelta: 5.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: 1.3 IOB: -0.132 Activity: -0.0031 at 22:19:10 dev: 5.91 avgDelta: 7.25 basal +start uannnounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -6.5 IOB: 9.296 Activity: 0.015 at 22:24:09 dev: 15.96 avgDelta: 9.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -14.3 IOB: 9.123 Activity: 0.0332 at 22:29:10 dev: 25.06 avgDelta: 10.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -20.4 IOB: 8.96 Activity: 0.0474 at 22:34:09 dev: 29.43 avgDelta: 9.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -25.2 IOB: 8.644 Activity: 0.0584 at 22:39:10 dev: 29.92 avgDelta: 4.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -28.6 IOB: 8.282 Activity: 0.0664 at 22:44:10 dev: 27.37 avgDelta: -1.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -30.9 IOB: 7.835 Activity: 0.0718 at 22:49:09 dev: 24.70 avgDelta: -6.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -32.5 IOB: 7.416 Activity: 0.0753 at 22:54:10 dev: 23.70 avgDelta: -8.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.2 BGI: -33.3 IOB: 6.984 Activity: 0.0772 at 22:59:09 dev: 24.52 avgDelta: -8.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -33.5 IOB: 6.547 Activity: 0.0776 at 23:04:09 dev: 26.70 avgDelta: -6.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -33.1 IOB: 6.061 Activity: 0.0769 at 23:09:10 dev: 28.39 avgDelta: -4.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -32.5 IOB: 5.68 Activity: 0.0754 at 23:14:10 dev: 29.50 avgDelta: -3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -31.6 IOB: 5.458 Activity: 0.0734 at 23:19:09 dev: 30.14 avgDelta: -1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -30.7 IOB: 5.046 Activity: 0.0712 at 23:24:10 dev: 29.94 avgDelta: -0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -29.7 IOB: 4.925 Activity: 0.069 at 23:29:09 dev: 29.49 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -28.6 IOB: 4.487 Activity: 0.0663 at 23:34:09 dev: 29.08 avgDelta: 0.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -27.3 IOB: 4.113 Activity: 0.0633 at 23:39:10 dev: 28.28 avgDelta: 1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -25.8 IOB: 3.706 Activity: 0.0599 at 23:44:09 dev: 27.57 avgDelta: 1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -24.4 IOB: 3.363 Activity: 0.0566 at 23:49:09 dev: 26.64 avgDelta: 2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -22.8 IOB: 3.039 Activity: 0.053 at 23:54:09 dev: 25.34 avgDelta: 2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -21.3 IOB: 2.733 Activity: 0.0494 at 23:59:10 dev: 23.79 avgDelta: 2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -19.7 IOB: 2.395 Activity: 0.0457 at 00:04:10 dev: 22.20 avgDelta: 2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -18.1 IOB: 2.126 Activity: 0.0421 at 00:09:10 dev: 20.65 avgDelta: 2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -16.6 IOB: 1.824 Activity: 0.0385 at 00:14:10 dev: 18.59 avgDelta: 2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -15.1 IOB: 1.64 Activity: 0.0351 at 00:19:09 dev: 17.13 avgDelta: 2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -13.8 IOB: 1.473 Activity: 0.0319 at 00:24:09 dev: 15.50 avgDelta: 1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -12.4 IOB: 1.273 Activity: 0.0288 at 00:29:10 dev: 14.16 avgDelta: 1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -11.2 IOB: 1.136 Activity: 0.026 at 00:34:10 dev: 12.71 avgDelta: 1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -10.1 IOB: 1.011 Activity: 0.0235 at 00:39:09 dev: 10.13 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -9.1 IOB: 0.852 Activity: 0.021 at 00:44:10 dev: 7.30 avgDelta: -1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -8.2 IOB: 0.752 Activity: 0.0189 at 00:49:10 dev: 4.65 avgDelta: -3.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -7.3 IOB: 0.662 Activity: 0.0169 at 00:54:10 dev: 3.28 avgDelta: -4.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.9 BGI: -6.4 IOB: 0.534 Activity: 0.0149 at 00:59:09 dev: 3.42 avgDelta: -3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -5.7 IOB: 0.463 Activity: 0.0132 at 01:04:09 dev: 4.69 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -5.0 IOB: 0.352 Activity: 0.0115 at 01:09:10 dev: 5.96 avgDelta: 1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.3 IOB: 0.298 Activity: 0.0101 at 01:14:10 dev: 6.60 avgDelta: 2.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.8 IOB: 0.25 Activity: 0.0089 at 01:19:09 dev: 6.84 avgDelta: 3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.4 IOB: 0.329 Activity: 0.0079 at 01:24:10 dev: 6.40 avgDelta: 3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.2 IOB: 0.34 Activity: 0.0074 at 01:29:10 dev: 5.69 avgDelta: 2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -2.9 IOB: 0.304 Activity: 0.0068 at 01:34:10 dev: 5.43 avgDelta: 2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -2.7 IOB: 0.272 Activity: 0.0062 at 01:39:10 dev: 5.67 avgDelta: 3.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -2.6 IOB: 0.512 Activity: 0.006 at 01:44:10 dev: 6.59 avgDelta: 4.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -2.6 IOB: 0.581 Activity: 0.0061 at 01:49:10 dev: 7.38 avgDelta: 4.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.2 IOB: 1.238 Activity: 0.0075 at 01:54:10 dev: 7.98 avgDelta: 4.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.8 IOB: 1.147 Activity: 0.0088 at 01:59:10 dev: 7.54 avgDelta: 3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.2 IOB: 1.151 Activity: 0.0098 at 02:04:10 dev: 6.72 avgDelta: 2.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.5 IOB: 1.05 Activity: 0.0104 at 02:09:09 dev: 5.98 avgDelta: 1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.6 IOB: 0.947 Activity: 0.0107 at 02:14:09 dev: 4.86 avgDelta: 0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.6 IOB: 0.844 Activity: 0.0106 at 02:19:10 dev: 3.82 avgDelta: -0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.5 IOB: 0.741 Activity: 0.0104 at 02:24:10 dev: 2.73 avgDelta: -1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.3 IOB: 0.59 Activity: 0.0099 at 02:29:10 dev: 2.52 avgDelta: -1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -4.0 IOB: 0.542 Activity: 0.0093 at 02:34:09 dev: 3.01 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.8 IOB: 0.497 Activity: 0.0087 at 02:39:09 dev: 3.50 avgDelta: -0.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.5 IOB: 0.456 Activity: 0.0081 at 02:44:10 dev: 1.74 avgDelta: -1.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.3 IOB: 0.516 Activity: 0.0077 at 02:49:09 dev: -1.93 avgDelta: -5.25 uam +end unannounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -3.1 IOB: 0.429 Activity: 0.0072 at 02:54:09 dev: -6.40 avgDelta: -9.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 7.0 BGI: -2.8 IOB: 0.294 Activity: 0.0066 at 02:59:10 dev: -8.66 avgDelta: -11.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: -2.5 IOB: 0.163 Activity: 0.0058 at 03:04:10 dev: -8.25 avgDelta: -10.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: -2.1 IOB: 0.037 Activity: 0.0049 at 03:09:10 dev: -6.39 avgDelta: -8.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: -1.7 IOB: -0.085 Activity: 0.0039 at 03:14:10 dev: -4.32 avgDelta: -6.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: -1.3 IOB: -0.153 Activity: 0.0029 at 03:19:09 dev: -3.75 avgDelta: -5.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: -0.8 IOB: -0.265 Activity: 0.0018 at 03:24:10 dev: -3.72 avgDelta: -4.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: -0.3 IOB: -0.371 Activity: 0.0007 at 03:29:09 dev: -3.45 avgDelta: -3.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: 0.2 IOB: -0.471 Activity: -0.0005 at 03:34:09 dev: -2.22 avgDelta: -2.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: 0.7 IOB: -0.566 Activity: -0.0016 at 03:39:10 dev: -0.94 avgDelta: -0.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: 1.1 IOB: -0.606 Activity: -0.0026 at 03:44:10 dev: 0.00 avgDelta: 1.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: 1.6 IOB: -0.64 Activity: -0.0036 at 03:49:10 dev: 0.45 avgDelta: 2.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 8.0 BGI: 1.9 IOB: -0.67 Activity: -0.0044 at 03:54:10 dev: -0.15 avgDelta: 1.75 basal +--categorize-uam-as-basal=true set: categorizing all UAM data as basal. +oref0-autotune-core autotune.2022-05-21.json profile.json profile.pump.json > newprofile.2022-05-21.json +CRTotalCarbs: 0 CRTotalInsulin: 0 totalCR: NaN +Hour 0 total deviations: 149.72 mg/dL +Hour 0 basal adjustment needed: 0.35 U/hr +Hour 1 total deviations: 76.77 mg/dL +Hour 1 basal adjustment needed: 0.18 U/hr +Hour 2 total deviations: 32.95 mg/dL +Hour 2 basal adjustment needed: 0.08 U/hr +Hour 3 total deviations: -18.1 mg/dL +Hour 3 basal adjustment needed: -0.04 U/hr +Hour 4 total deviations: 128.92 mg/dL +Hour 4 basal adjustment needed: 0.3 U/hr +Hour 5 total deviations: 76.69 mg/dL +Hour 5 basal adjustment needed: 0.18 U/hr +Hour 6 total deviations: 64.53 mg/dL +Hour 6 basal adjustment needed: 0.15 U/hr +Hour 7 total deviations: 7.81 mg/dL +Hour 7 basal adjustment needed: 0.02 U/hr +Hour 8 total deviations: -16.5 mg/dL +Hour 8 basal adjustment needed: -0.04 U/hr +Hour 9 total deviations: 39.75 mg/dL +Hour 9 basal adjustment needed: 0.09 U/hr +Hour 10 total deviations: 504.73 mg/dL +Hour 10 basal adjustment needed: 1.17 U/hr +Hour 11 total deviations: 371.12 mg/dL +Hour 11 basal adjustment needed: 0.86 U/hr +Hour 12 total deviations: 76.35 mg/dL +Hour 12 basal adjustment needed: 0.18 U/hr +Hour 13 total deviations: 116.88 mg/dL +Hour 13 basal adjustment needed: 0.27 U/hr +Hour 14 total deviations: 22.04 mg/dL +Hour 14 basal adjustment needed: 0.05 U/hr +Hour 15 total deviations: 277.6 mg/dL +Hour 15 basal adjustment needed: 0.64 U/hr +Hour 16 total deviations: 297.01 mg/dL +Hour 16 basal adjustment needed: 0.69 U/hr +Hour 17 total deviations: 131.85 mg/dL +Hour 17 basal adjustment needed: 0.31 U/hr +Hour 18 total deviations: 49.61 mg/dL +Hour 18 basal adjustment needed: 0.12 U/hr +Hour 19 total deviations: 32.57 mg/dL +Hour 19 basal adjustment needed: 0.08 U/hr +Hour 20 total deviations: -9.02 mg/dL +Hour 20 basal adjustment needed: -0.02 U/hr +Hour 21 total deviations: -19.5 mg/dL +Hour 21 basal adjustment needed: -0.05 U/hr +Hour 22 total deviations: 211.5 mg/dL +Hour 22 basal adjustment needed: 0.49 U/hr +Hour 23 total deviations: 334.86 mg/dL +Hour 23 basal adjustment needed: 0.78 U/hr +Limiting hour 7 basal to 1.11 (which is 1.3 * pump basal of 0.855 ) +Limiting hour 8 basal to 1.17 (which is 1.3 * pump basal of 0.902 ) +Limiting hour 9 basal to 1.21 (which is 1.3 * pump basal of 0.934 ) +Limiting hour 10 basal to 1.22 (which is 1.3 * pump basal of 0.938 ) +Limiting hour 12 basal to 1.15 (which is 1.3 * pump basal of 0.882 ) +Limiting hour 13 basal to 1.14 (which is 1.3 * pump basal of 0.874 ) +Limiting hour 14 basal to 1.13 (which is 1.3 * pump basal of 0.866 ) +Limiting hour 15 basal to 1.10 (which is 1.3 * pump basal of 0.848 ) +Limiting hour 20 basal to 1.10 (which is 1.3 * pump basal of 0.847 ) +Limiting hour 21 basal to 1.12 (which is 1.3 * pump basal of 0.861 ) +Limiting hour 22 basal to 1.12 (which is 1.3 * pump basal of 0.863 ) +[ { start: '00:00:00', minutes: 0, rate: 1.039, i: 0 }, + { start: '01:00:00', minutes: 60, rate: 1.091, i: 1 }, + { start: '02:00:00', minutes: 120, rate: 1.118, i: 2 }, + { start: '03:00:00', minutes: 180, rate: 1.321, i: 3 }, + { start: '04:00:00', minutes: 240, rate: 1.091, i: 4 }, + { start: '05:00:00', minutes: 300, rate: 0.965, i: 5 }, + { start: '06:00:00', minutes: 360, rate: 0.848, i: 6 }, + { start: '07:00:00', minutes: 420, rate: 1.112, i: 7 }, + { start: '08:00:00', minutes: 480, rate: 1.173, i: 8 }, + { start: '09:00:00', minutes: 540, rate: 1.214, i: 9 }, + { start: '10:00:00', minutes: 600, rate: 1.219, i: 10 }, + { start: '11:00:00', minutes: 660, rate: 1.07, i: 11 }, + { start: '12:00:00', minutes: 720, rate: 1.147, i: 12 }, + { start: '13:00:00', minutes: 780, rate: 1.136, i: 13 }, + { start: '14:00:00', minutes: 840, rate: 1.126, i: 14 }, + { start: '15:00:00', minutes: 900, rate: 1.102, i: 15 }, + { start: '16:00:00', minutes: 960, rate: 0.928, i: 16 }, + { start: '17:00:00', minutes: 1020, rate: 0.71, i: 17 }, + { start: '18:00:00', minutes: 1080, rate: 0.654, i: 18 }, + { start: '19:00:00', minutes: 1140, rate: 0.878, i: 19 }, + { start: '20:00:00', minutes: 1200, rate: 1.101, i: 20 }, + { start: '21:00:00', minutes: 1260, rate: 1.119, i: 21 }, + { start: '22:00:00', minutes: 1320, rate: 1.122, i: 22 }, + { start: '23:00:00', minutes: 1380, rate: 1.047, i: 23 } ] +totalMealCarbs: 0 totalDeviations: 0 oldCSF 14.991 fullNewCSF: 14.991304347826087 newCSF: 14.991 +oldCR: 5.75 fullNewCR: NaN newCR: NaN +Limiting adjusted ISF of 124.90 to 123.14 (which is pump ISF of 86.2 / 0.7 ) +p50deviation: -0.93 p50BGI -2.5 p50ratios: 1.449 Old ISF: 86.2 fullNewISF: 124.904 adjustedISF: 123.143 newISF: 93.589 newDIA: 6 newPeak: 45 + +Autotune pump profile recommendations: +--------------------------------------------------------- +Recommendations Log File: /home/titi/aaps/autotune/aapsorefautotune_recommendations.log + +Parameter | Pump | Autotune | Days Missing +--------------------------------------------------------- +ISF [mg/dL/U] | 86.200 | 93.589 | +Carb Ratio[g/U]| 5.750 | 5.750 | + 00:00 | 0.966 | 1.039 | 0 + 01:00 | 0.977 | 1.091 | 0 + 02:00 | 0.971 | 1.118 | 0 + 03:00 | 1.111 | 1.321 | 0 + 04:00 | 0.974 | 1.091 | 0 + 05:00 | 0.923 | 0.965 | 0 + 06:00 | 0.823 | 0.848 | 0 + 07:00 | 0.855 | 1.112 | 0 + 08:00 | 0.902 | 1.173 | 0 + 09:00 | 0.934 | 1.214 | 0 + 10:00 | 0.938 | 1.219 | 0 + 11:00 | 0.903 | 1.070 | 0 + 12:00 | 0.882 | 1.147 | 0 + 13:00 | 0.874 | 1.136 | 0 + 14:00 | 0.866 | 1.126 | 0 + 15:00 | 0.848 | 1.102 | 0 + 16:00 | 0.758 | 0.928 | 0 + 17:00 | 0.650 | 0.710 | 0 + 18:00 | 0.648 | 0.654 | 0 + 19:00 | 0.738 | 0.878 | 0 + 20:00 | 0.847 | 1.101 | 0 + 21:00 | 0.861 | 1.119 | 0 + 22:00 | 0.863 | 1.122 | 0 + 23:00 | 0.843 | 1.047 | 0 diff --git a/app/src/test/res/autotune/test3/newaapsorefprofile.2022-05-21.json b/app/src/test/res/autotune/test3/newaapsorefprofile.2022-05-21.json new file mode 100644 index 0000000000..e7ae1b4e0e --- /dev/null +++ b/app/src/test/res/autotune/test3/newaapsorefprofile.2022-05-21.json @@ -0,0 +1,173 @@ +{ + "autosens_max": 1.3, + "autosens_min": 0.7, + "basalprofile": [ + { + "i": 0, + "minutes": 0, + "rate": 1.039, + "start": "00:00:00" + }, + { + "i": 1, + "minutes": 60, + "rate": 1.091, + "start": "01:00:00" + }, + { + "i": 2, + "minutes": 120, + "rate": 1.118, + "start": "02:00:00" + }, + { + "i": 3, + "minutes": 180, + "rate": 1.321, + "start": "03:00:00" + }, + { + "i": 4, + "minutes": 240, + "rate": 1.091, + "start": "04:00:00" + }, + { + "i": 5, + "minutes": 300, + "rate": 0.965, + "start": "05:00:00" + }, + { + "i": 6, + "minutes": 360, + "rate": 0.848, + "start": "06:00:00" + }, + { + "i": 7, + "minutes": 420, + "rate": 1.112, + "start": "07:00:00" + }, + { + "i": 8, + "minutes": 480, + "rate": 1.173, + "start": "08:00:00" + }, + { + "i": 9, + "minutes": 540, + "rate": 1.214, + "start": "09:00:00" + }, + { + "i": 10, + "minutes": 600, + "rate": 1.219, + "start": "10:00:00" + }, + { + "i": 11, + "minutes": 660, + "rate": 1.07, + "start": "11:00:00" + }, + { + "i": 12, + "minutes": 720, + "rate": 1.147, + "start": "12:00:00" + }, + { + "i": 13, + "minutes": 780, + "rate": 1.136, + "start": "13:00:00" + }, + { + "i": 14, + "minutes": 840, + "rate": 1.126, + "start": "14:00:00" + }, + { + "i": 15, + "minutes": 900, + "rate": 1.102, + "start": "15:00:00" + }, + { + "i": 16, + "minutes": 960, + "rate": 0.928, + "start": "16:00:00" + }, + { + "i": 17, + "minutes": 1020, + "rate": 0.71, + "start": "17:00:00" + }, + { + "i": 18, + "minutes": 1080, + "rate": 0.654, + "start": "18:00:00" + }, + { + "i": 19, + "minutes": 1140, + "rate": 0.878, + "start": "19:00:00" + }, + { + "i": 20, + "minutes": 1200, + "rate": 1.101, + "start": "20:00:00" + }, + { + "i": 21, + "minutes": 1260, + "rate": 1.119, + "start": "21:00:00" + }, + { + "i": 22, + "minutes": 1320, + "rate": 1.122, + "start": "22:00:00" + }, + { + "i": 23, + "minutes": 1380, + "rate": 1.047, + "start": "23:00:00" + } + ], + "carb_ratio": 5.75, + "csf": 14.991, + "curve": "ultra-rapid", + "dia": 6, + "insulinPeakTime": 45, + "isfProfile": { + "sensitivities": [ + { + "endoffset": 1440, + "i": 0, + "offset": 0, + "sensitivity": 93.589, + "start": "00:00:00", + "x": 0 + } + ] + }, + "min_5m_carbimpact": 8, + "name": "Tuned Dyn2", + "sens": 93.589, + "timezone": "Europe/Paris", + "units": "mg/dl", + "useCustomPeakTime": true +} diff --git a/app/src/test/res/autotune/test3/oaps-iobCalc.2022-05-21.json b/app/src/test/res/autotune/test3/oaps-iobCalc.2022-05-21.json new file mode 100644 index 0000000000..92304dbf45 --- /dev/null +++ b/app/src/test/res/autotune/test3/oaps-iobCalc.2022-05-21.json @@ -0,0 +1,286 @@ +[ + { "iob": 5.249, "activity": 0.0391, "date": 1653099848000}, + { "iob": 5.292, "activity": 0.0438, "date": 1653100148000}, + { "iob": 4.964, "activity": 0.047, "date": 1653100449000}, + { "iob": 4.674, "activity": 0.0489, "date": 1653100748000}, + { "iob": 4.377, "activity": 0.0498, "date": 1653101048000}, + { "iob": 4.077, "activity": 0.0498, "date": 1653101348000}, + { "iob": 3.73, "activity": 0.0491, "date": 1653101648000}, + { "iob": 3.389, "activity": 0.0476, "date": 1653101948000}, + { "iob": 3.055, "activity": 0.0457, "date": 1653102249000}, + { "iob": 2.782, "activity": 0.0436, "date": 1653102548000}, + { "iob": 2.47, "activity": 0.0411, "date": 1653102848000}, + { "iob": 2.22, "activity": 0.0386, "date": 1653103149000}, + { "iob": 1.935, "activity": 0.0358, "date": 1653103448000}, + { "iob": 1.711, "activity": 0.0332, "date": 1653103748000}, + { "iob": 1.452, "activity": 0.0304, "date": 1653104049000}, + { "iob": 1.927, "activity": 0.028, "date": 1653104349000}, + { "iob": 1.84, "activity": 0.027, "date": 1653104648000}, + { "iob": 1.658, "activity": 0.0258, "date": 1653104949000}, + { "iob": 1.482, "activity": 0.0245, "date": 1653105248000}, + { "iob": 1.264, "activity": 0.0229, "date": 1653105549000}, + { "iob": 1.104, "activity": 0.0212, "date": 1653105848000}, + { "iob": 0.952, "activity": 0.0194, "date": 1653106149000}, + { "iob": 1.619, "activity": 0.0181, "date": 1653106449000}, + { "iob": 1.678, "activity": 0.0184, "date": 1653106749000}, + { "iob": 1.775, "activity": 0.0187, "date": 1653107048000}, + { "iob": 1.581, "activity": 0.019, "date": 1653107348000}, + { "iob": 1.437, "activity": 0.0188, "date": 1653107648000}, + { "iob": 1.294, "activity": 0.0183, "date": 1653107948000}, + { "iob": 1.153, "activity": 0.0176, "date": 1653108249000}, + { "iob": 1.017, "activity": 0.0167, "date": 1653108548000}, + { "iob": 0.887, "activity": 0.0156, "date": 1653108848000}, + { "iob": 1.011, "activity": 0.0147, "date": 1653109148000}, + { "iob": 0.889, "activity": 0.0141, "date": 1653109448000}, + { "iob": 0.771, "activity": 0.0133, "date": 1653109748000}, + { "iob": 0.656, "activity": 0.0124, "date": 1653110049000}, + { "iob": 0.547, "activity": 0.0114, "date": 1653110348000}, + { "iob": 0.392, "activity": 0.0103, "date": 1653110649000}, + { "iob": 0.294, "activity": 0.0091, "date": 1653110949000}, + { "iob": 0.2, "activity": 0.008, "date": 1653111249000}, + { "iob": 0.065, "activity": 0.0066, "date": 1653111549000}, + { "iob": 0.034, "activity": 0.0055, "date": 1653111849000}, + { "iob": 0.549, "activity": 0.0048, "date": 1653112148000}, + { "iob": 0.674, "activity": 0.0053, "date": 1653112449000}, + { "iob": 0.597, "activity": 0.0057, "date": 1653112749000}, + { "iob": 0.468, "activity": 0.0058, "date": 1653113049000}, + { "iob": 0.389, "activity": 0.0057, "date": 1653113349000}, + { "iob": 0.262, "activity": 0.0053, "date": 1653113649000}, + { "iob": 0.186, "activity": 0.0048, "date": 1653113949000}, + { "iob": 0.064, "activity": 0.0041, "date": 1653114249000}, + { "iob": -0.005, "activity": 0.0034, "date": 1653114549000}, + { "iob": -0.12, "activity": 0.0026, "date": 1653114849000}, + { "iob": -0.181, "activity": 0.0018, "date": 1653115149000}, + { "iob": -0.287, "activity": 0.0008, "date": 1653115449000}, + { "iob": -0.34, "activity": 0, "date": 1653115749000}, + { "iob": -0.436, "activity": -0.001, "date": 1653116049000}, + { "iob": -0.48, "activity": -0.0018, "date": 1653116349000}, + { "iob": -0.519, "activity": -0.0026, "date": 1653116649000}, + { "iob": -0.554, "activity": -0.0034, "date": 1653116949000}, + { "iob": -0.585, "activity": -0.0041, "date": 1653117249000}, + { "iob": -0.662, "activity": -0.0049, "date": 1653117549000}, + { "iob": -0.687, "activity": -0.0055, "date": 1653117848000}, + { "iob": -0.708, "activity": -0.0061, "date": 1653118149000}, + { "iob": -0.726, "activity": -0.0066, "date": 1653118449000}, + { "iob": -0.351, "activity": -0.0071, "date": 1653118748000}, + { "iob": -0.218, "activity": -0.0064, "date": 1653119049000}, + { "iob": -0.088, "activity": -0.0055, "date": 1653119349000}, + { "iob": 13.594, "activity": 0.0023, "date": 1653119649000}, + { "iob": 13.552, "activity": 0.0331, "date": 1653119949000}, + { "iob": 13.224, "activity": 0.0573, "date": 1653120249000}, + { "iob": 12.838, "activity": 0.076, "date": 1653120548000}, + { "iob": 12.322, "activity": 0.09, "date": 1653120849000}, + { "iob": 11.794, "activity": 0.1001, "date": 1653121149000}, + { "iob": 11.177, "activity": 0.1068, "date": 1653121449000}, + { "iob": 10.58, "activity": 0.111, "date": 1653121749000}, + { "iob": 9.919, "activity": 0.1129, "date": 1653122049000}, + { "iob": 9.254, "activity": 0.1129, "date": 1653122349000}, + { "iob": 8.643, "activity": 0.1114, "date": 1653122649000}, + { "iob": 7.992, "activity": 0.1088, "date": 1653122949000}, + { "iob": 7.406, "activity": 0.1053, "date": 1653123248000}, + { "iob": 7.111, "activity": 0.1012, "date": 1653123549000}, + { "iob": 6.515, "activity": 0.0971, "date": 1653123849000}, + { "iob": 5.99, "activity": 0.0927, "date": 1653124149000}, + { "iob": 5.439, "activity": 0.0878, "date": 1653124448000}, + { "iob": 4.962, "activity": 0.0828, "date": 1653124749000}, + { "iob": 4.462, "activity": 0.0775, "date": 1653125048000}, + { "iob": 4.036, "activity": 0.0724, "date": 1653125349000}, + { "iob": 3.638, "activity": 0.0672, "date": 1653125649000}, + { "iob": 3.214, "activity": 0.0621, "date": 1653125948000}, + { "iob": 2.866, "activity": 0.0571, "date": 1653126249000}, + { "iob": 2.494, "activity": 0.0522, "date": 1653126549000}, + { "iob": 2.193, "activity": 0.0476, "date": 1653126849000}, + { "iob": 1.867, "activity": 0.0431, "date": 1653127149000}, + { "iob": 1.563, "activity": 0.0388, "date": 1653127449000}, + { "iob": 1.329, "activity": 0.0347, "date": 1653127748000}, + { "iob": 1.115, "activity": 0.0309, "date": 1653128049000}, + { "iob": 0.87, "activity": 0.0272, "date": 1653128349000}, + { "iob": 0.692, "activity": 0.0239, "date": 1653128649000}, + { "iob": 0.482, "activity": 0.0206, "date": 1653128948000}, + { "iob": 0.287, "activity": 0.0176, "date": 1653129249000}, + { "iob": 0.156, "activity": 0.0148, "date": 1653129548000}, + { "iob": 0.038, "activity": 0.0122, "date": 1653129848000}, + { "iob": -0.067, "activity": 0.0099, "date": 1653130149000}, + { "iob": -0.161, "activity": 0.0078, "date": 1653130448000}, + { "iob": -0.195, "activity": 0.006, "date": 1653130748000}, + { "iob": -0.271, "activity": 0.0044, "date": 1653131049000}, + { "iob": -0.339, "activity": 0.0029, "date": 1653131349000}, + { "iob": -0.4, "activity": 0.0015, "date": 1653131649000}, + { "iob": -0.155, "activity": 0.0007, "date": 1653131948000}, + { "iob": 8.11, "activity": 0.0045, "date": 1653132249000}, + { "iob": 7.992, "activity": 0.0222, "date": 1653132549000}, + { "iob": 7.745, "activity": 0.0359, "date": 1653132849000}, + { "iob": 7.488, "activity": 0.0465, "date": 1653133149000}, + { "iob": 7.136, "activity": 0.0541, "date": 1653133449000}, + { "iob": 6.8, "activity": 0.0596, "date": 1653133749000}, + { "iob": 6.441, "activity": 0.0633, "date": 1653134049000}, + { "iob": 6.022, "activity": 0.0651, "date": 1653134349000}, + { "iob": 5.644, "activity": 0.0657, "date": 1653134649000}, + { "iob": 5.216, "activity": 0.0653, "date": 1653134949000}, + { "iob": 4.962, "activity": 0.0644, "date": 1653135249000}, + { "iob": 4.544, "activity": 0.0627, "date": 1653135549000}, + { "iob": 4.185, "activity": 0.0606, "date": 1653135849000}, + { "iob": 3.839, "activity": 0.058, "date": 1653136149000}, + { "iob": 3.456, "activity": 0.055, "date": 1653136449000}, + { "iob": 3.139, "activity": 0.0519, "date": 1653136749000}, + { "iob": 2.788, "activity": 0.0486, "date": 1653137049000}, + { "iob": 2.503, "activity": 0.0453, "date": 1653137350000}, + { "iob": 2.186, "activity": 0.0418, "date": 1653137649000}, + { "iob": 3.17, "activity": 0.0407, "date": 1653137949000}, + { "iob": 3.956, "activity": 0.0413, "date": 1653138249000}, + { "iob": 3.648, "activity": 0.042, "date": 1653138549000}, + { "iob": 4.126, "activity": 0.043, "date": 1653138849000}, + { "iob": 3.81, "activity": 0.0437, "date": 1653139150000}, + { "iob": 3.541, "activity": 0.0437, "date": 1653139450000}, + { "iob": 3.272, "activity": 0.0431, "date": 1653139749000}, + { "iob": 3.588, "activity": 0.0428, "date": 1653140049000}, + { "iob": 3.875, "activity": 0.0431, "date": 1653140349000}, + { "iob": 3.608, "activity": 0.0434, "date": 1653140648000}, + { "iob": 4.271, "activity": 0.0442, "date": 1653140949000}, + { "iob": 3.996, "activity": 0.0452, "date": 1653141249000}, + { "iob": 4.298, "activity": 0.0462, "date": 1653141548000}, + { "iob": 4.015, "activity": 0.0468, "date": 1653141849000}, + { "iob": 4.538, "activity": 0.0481, "date": 1653142149000}, + { "iob": 4.245, "activity": 0.0489, "date": 1653142449000}, + { "iob": 4.729, "activity": 0.05, "date": 1653142749000}, + { "iob": 4.426, "activity": 0.0508, "date": 1653143049000}, + { "iob": 4.353, "activity": 0.051, "date": 1653143349000}, + { "iob": 4.049, "activity": 0.0507, "date": 1653143650000}, + { "iob": 3.747, "activity": 0.0498, "date": 1653143949000}, + { "iob": 3.402, "activity": 0.0483, "date": 1653144249000}, + { "iob": 3.115, "activity": 0.0464, "date": 1653144550000}, + { "iob": 2.788, "activity": 0.0441, "date": 1653144849000}, + { "iob": 2.524, "activity": 0.0417, "date": 1653145149000}, + { "iob": 2.271, "activity": 0.0391, "date": 1653145449000}, + { "iob": 2.033, "activity": 0.0365, "date": 1653145750000}, + { "iob": 1.807, "activity": 0.0338, "date": 1653146050000}, + { "iob": 1.594, "activity": 0.0312, "date": 1653146349000}, + { "iob": 1.395, "activity": 0.0286, "date": 1653146650000}, + { "iob": 1.258, "activity": 0.0262, "date": 1653146949000}, + { "iob": 1.034, "activity": 0.0236, "date": 1653147249000}, + { "iob": 0.971, "activity": 0.0215, "date": 1653147549000}, + { "iob": 1.008, "activity": 0.0197, "date": 1653147849000}, + { "iob": 0.963, "activity": 0.0183, "date": 1653148149000}, + { "iob": 1.046, "activity": 0.0171, "date": 1653148450000}, + { "iob": 0.912, "activity": 0.0161, "date": 1653148749000}, + { "iob": 1.254, "activity": 0.0156, "date": 1653149049000}, + { "iob": 1.176, "activity": 0.0154, "date": 1653149349000}, + { "iob": 1.051, "activity": 0.0149, "date": 1653149650000}, + { "iob": 0.928, "activity": 0.0142, "date": 1653149949000}, + { "iob": 1.008, "activity": 0.0138, "date": 1653150249000}, + { "iob": 0.89, "activity": 0.0133, "date": 1653150549000}, + { "iob": 0.775, "activity": 0.0127, "date": 1653150849000}, + { "iob": 0.664, "activity": 0.0118, "date": 1653151149000}, + { "iob": 0.606, "activity": 0.011, "date": 1653151449000}, + { "iob": 0.703, "activity": 0.0105, "date": 1653151749000}, + { "iob": 0.702, "activity": 0.0101, "date": 1653152049000}, + { "iob": 0.902, "activity": 0.0101, "date": 1653152349000}, + { "iob": 0.801, "activity": 0.0101, "date": 1653152649000}, + { "iob": 0.701, "activity": 0.0098, "date": 1653152949000}, + { "iob": 0.603, "activity": 0.0094, "date": 1653153249000}, + { "iob": 0.508, "activity": 0.0088, "date": 1653153549000}, + { "iob": 0.415, "activity": 0.0081, "date": 1653153849000}, + { "iob": 0.327, "activity": 0.0074, "date": 1653154149000}, + { "iob": 0.242, "activity": 0.0066, "date": 1653154449000}, + { "iob": 0.161, "activity": 0.0058, "date": 1653154749000}, + { "iob": 0.134, "activity": 0.005, "date": 1653155049000}, + { "iob": 0.4, "activity": 0.0048, "date": 1653155349000}, + { "iob": 0.475, "activity": 0.0049, "date": 1653155649000}, + { "iob": 0.401, "activity": 0.005, "date": 1653155950000}, + { "iob": 0.327, "activity": 0.0048, "date": 1653156250000}, + { "iob": 0.203, "activity": 0.0044, "date": 1653156549000}, + { "iob": 0.132, "activity": 0.004, "date": 1653156849000}, + { "iob": 0.064, "activity": 0.0034, "date": 1653157149000}, + { "iob": -0.002, "activity": 0.0028, "date": 1653157449000}, + { "iob": -0.064, "activity": 0.0022, "date": 1653157750000}, + { "iob": -0.073, "activity": 0.0016, "date": 1653158049000}, + { "iob": -0.08, "activity": 0.0011, "date": 1653158349000}, + { "iob": -0.085, "activity": 0.0007, "date": 1653158649000}, + { "iob": -0.087, "activity": 0.0004, "date": 1653158949000}, + { "iob": -0.088, "activity": 0.0001, "date": 1653159249000}, + { "iob": -0.088, "activity": -0.0001, "date": 1653159549000}, + { "iob": -0.137, "activity": -0.0004, "date": 1653159849000}, + { "iob": -0.184, "activity": -0.0007, "date": 1653160150000}, + { "iob": -0.18, "activity": -0.001, "date": 1653160449000}, + { "iob": -0.175, "activity": -0.0012, "date": 1653160749000}, + { "iob": -0.168, "activity": -0.0014, "date": 1653161049000}, + { "iob": -0.211, "activity": -0.0015, "date": 1653161350000}, + { "iob": -0.203, "activity": -0.0017, "date": 1653161649000}, + { "iob": -0.243, "activity": -0.002, "date": 1653161950000}, + { "iob": -0.282, "activity": -0.0023, "date": 1653162250000}, + { "iob": -0.32, "activity": -0.0026, "date": 1653162549000}, + { "iob": -0.357, "activity": -0.0029, "date": 1653162850000}, + { "iob": -0.391, "activity": -0.0032, "date": 1653163150000}, + { "iob": -0.375, "activity": -0.0035, "date": 1653163449000}, + { "iob": -0.357, "activity": -0.0036, "date": 1653163749000}, + { "iob": -0.149, "activity": -0.0035, "date": 1653164049000}, + { "iob": -0.132, "activity": -0.0031, "date": 1653164350000}, + { "iob": 9.296, "activity": 0.015, "date": 1653164649000}, + { "iob": 9.123, "activity": 0.0332, "date": 1653164950000}, + { "iob": 8.96, "activity": 0.0474, "date": 1653165249000}, + { "iob": 8.644, "activity": 0.0584, "date": 1653165550000}, + { "iob": 8.282, "activity": 0.0664, "date": 1653165850000}, + { "iob": 7.835, "activity": 0.0718, "date": 1653166149000}, + { "iob": 7.416, "activity": 0.0753, "date": 1653166450000}, + { "iob": 6.984, "activity": 0.0772, "date": 1653166749000}, + { "iob": 6.547, "activity": 0.0776, "date": 1653167049000}, + { "iob": 6.061, "activity": 0.0769, "date": 1653167350000}, + { "iob": 5.68, "activity": 0.0754, "date": 1653167650000}, + { "iob": 5.458, "activity": 0.0734, "date": 1653167949000}, + { "iob": 5.046, "activity": 0.0712, "date": 1653168250000}, + { "iob": 4.925, "activity": 0.069, "date": 1653168549000}, + { "iob": 4.487, "activity": 0.0663, "date": 1653168849000}, + { "iob": 4.113, "activity": 0.0633, "date": 1653169150000}, + { "iob": 3.706, "activity": 0.0599, "date": 1653169449000}, + { "iob": 3.363, "activity": 0.0566, "date": 1653169749000}, + { "iob": 3.039, "activity": 0.053, "date": 1653170049000}, + { "iob": 2.733, "activity": 0.0494, "date": 1653170350000}, + { "iob": 2.395, "activity": 0.0457, "date": 1653170650000}, + { "iob": 2.126, "activity": 0.0421, "date": 1653170950000}, + { "iob": 1.824, "activity": 0.0385, "date": 1653171250000}, + { "iob": 1.64, "activity": 0.0351, "date": 1653171549000}, + { "iob": 1.473, "activity": 0.0319, "date": 1653171849000}, + { "iob": 1.273, "activity": 0.0288, "date": 1653172150000}, + { "iob": 1.136, "activity": 0.026, "date": 1653172450000}, + { "iob": 1.011, "activity": 0.0235, "date": 1653172749000}, + { "iob": 0.852, "activity": 0.021, "date": 1653173050000}, + { "iob": 0.752, "activity": 0.0189, "date": 1653173350000}, + { "iob": 0.662, "activity": 0.0169, "date": 1653173650000}, + { "iob": 0.534, "activity": 0.0149, "date": 1653173949000}, + { "iob": 0.463, "activity": 0.0132, "date": 1653174249000}, + { "iob": 0.352, "activity": 0.0115, "date": 1653174550000}, + { "iob": 0.298, "activity": 0.0101, "date": 1653174850000}, + { "iob": 0.25, "activity": 0.0089, "date": 1653175149000}, + { "iob": 0.329, "activity": 0.0079, "date": 1653175450000}, + { "iob": 0.34, "activity": 0.0074, "date": 1653175750000}, + { "iob": 0.304, "activity": 0.0068, "date": 1653176050000}, + { "iob": 0.272, "activity": 0.0062, "date": 1653176350000}, + { "iob": 0.512, "activity": 0.006, "date": 1653176650000}, + { "iob": 0.581, "activity": 0.0061, "date": 1653176950000}, + { "iob": 1.238, "activity": 0.0075, "date": 1653177250000}, + { "iob": 1.147, "activity": 0.0088, "date": 1653177550000}, + { "iob": 1.151, "activity": 0.0098, "date": 1653177850000}, + { "iob": 1.05, "activity": 0.0104, "date": 1653178149000}, + { "iob": 0.947, "activity": 0.0107, "date": 1653178449000}, + { "iob": 0.844, "activity": 0.0106, "date": 1653178750000}, + { "iob": 0.741, "activity": 0.0104, "date": 1653179050000}, + { "iob": 0.59, "activity": 0.0099, "date": 1653179350000}, + { "iob": 0.542, "activity": 0.0093, "date": 1653179649000}, + { "iob": 0.497, "activity": 0.0087, "date": 1653179949000}, + { "iob": 0.456, "activity": 0.0081, "date": 1653180250000}, + { "iob": 0.516, "activity": 0.0077, "date": 1653180549000}, + { "iob": 0.429, "activity": 0.0072, "date": 1653180849000}, + { "iob": 0.294, "activity": 0.0066, "date": 1653181150000}, + { "iob": 0.163, "activity": 0.0058, "date": 1653181450000}, + { "iob": 0.037, "activity": 0.0049, "date": 1653181750000}, + { "iob": -0.085, "activity": 0.0039, "date": 1653182050000}, + { "iob": -0.153, "activity": 0.0029, "date": 1653182349000}, + { "iob": -0.265, "activity": 0.0018, "date": 1653182650000}, + { "iob": -0.371, "activity": 0.0007, "date": 1653182949000}, + { "iob": -0.471, "activity": -0.0005, "date": 1653183249000}, + { "iob": -0.566, "activity": -0.0016, "date": 1653183550000}, + { "iob": -0.606, "activity": -0.0026, "date": 1653183850000}, + { "iob": -0.64, "activity": -0.0036, "date": 1653184150000}, + { "iob": -0.67, "activity": -0.0044, "date": 1653184450000} +] + diff --git a/app/src/test/res/autotune/test3/profile.pump.json b/app/src/test/res/autotune/test3/profile.pump.json new file mode 100644 index 0000000000..eefadabacb --- /dev/null +++ b/app/src/test/res/autotune/test3/profile.pump.json @@ -0,0 +1,147 @@ +{ + "name": "Tuned Dyn2", + "min_5m_carbimpact": 8, + "dia": 6, + "curve": "ultra-rapid", + "useCustomPeakTime": true, + "insulinPeakTime": 45, + "basalprofile": [ + { + "start": "00:00:00", + "minutes": 0, + "rate": 0.966 + }, + { + "start": "01:00:00", + "minutes": 60, + "rate": 0.977 + }, + { + "start": "02:00:00", + "minutes": 120, + "rate": 0.971 + }, + { + "start": "03:00:00", + "minutes": 180, + "rate": 1.111 + }, + { + "start": "04:00:00", + "minutes": 240, + "rate": 0.974 + }, + { + "start": "05:00:00", + "minutes": 300, + "rate": 0.923 + }, + { + "start": "06:00:00", + "minutes": 360, + "rate": 0.823 + }, + { + "start": "07:00:00", + "minutes": 420, + "rate": 0.855 + }, + { + "start": "08:00:00", + "minutes": 480, + "rate": 0.902 + }, + { + "start": "09:00:00", + "minutes": 540, + "rate": 0.934 + }, + { + "start": "10:00:00", + "minutes": 600, + "rate": 0.938 + }, + { + "start": "11:00:00", + "minutes": 660, + "rate": 0.903 + }, + { + "start": "12:00:00", + "minutes": 720, + "rate": 0.882 + }, + { + "start": "13:00:00", + "minutes": 780, + "rate": 0.874 + }, + { + "start": "14:00:00", + "minutes": 840, + "rate": 0.866 + }, + { + "start": "15:00:00", + "minutes": 900, + "rate": 0.848 + }, + { + "start": "16:00:00", + "minutes": 960, + "rate": 0.758 + }, + { + "start": "17:00:00", + "minutes": 1020, + "rate": 0.65 + }, + { + "start": "18:00:00", + "minutes": 1080, + "rate": 0.648 + }, + { + "start": "19:00:00", + "minutes": 1140, + "rate": 0.738 + }, + { + "start": "20:00:00", + "minutes": 1200, + "rate": 0.847 + }, + { + "start": "21:00:00", + "minutes": 1260, + "rate": 0.861 + }, + { + "start": "22:00:00", + "minutes": 1320, + "rate": 0.863 + }, + { + "start": "23:00:00", + "minutes": 1380, + "rate": 0.843 + } + ], + "isfProfile": { + "sensitivities": [ + { + "i": 0, + "start": "00:00:00", + "sensitivity": 86.2, + "offset": 0, + "x": 0, + "endoffset": 1440 + } + ] + }, + "carb_ratio": 5.75, + "autosens_max": 1.3, + "autosens_min": 0.7, + "units": "mg/dl", + "timezone": "Europe/Paris" +} From 9bfbbcf442a30a95d600a20a8195dd42c8396968 Mon Sep 17 00:00:00 2001 From: Philoul Date: Sat, 25 Jun 2022 20:19:33 +0200 Subject: [PATCH 015/154] Add Unit Test to check AutotsensMax limitation (note here OAPS calculation done with NS Queries) --- .../general/autotune/AutotuneCoreTest.kt | 24 +- .../general/autotune/AutotunePrepTest.kt | 1 - .../autotune/test4/autotune.2022-05-30.json | 1 + .../test4/autotune.2022-06-25-195325.log | 454 + .../autotune/test4/newprofile.2022-05-30.json | 194 + .../autotune/test4/ns-entries.2022-05-30.json | 2906 +++++++ .../test4/ns-treatments.2022-05-30.json | 7512 +++++++++++++++++ .../autotune/test4/profile.2022-05-30.json | 192 + .../test/res/autotune/test4/profile.pump.json | 147 + 9 files changed, 11429 insertions(+), 2 deletions(-) create mode 100644 app/src/test/res/autotune/test4/autotune.2022-05-30.json create mode 100644 app/src/test/res/autotune/test4/autotune.2022-06-25-195325.log create mode 100644 app/src/test/res/autotune/test4/newprofile.2022-05-30.json create mode 100644 app/src/test/res/autotune/test4/ns-entries.2022-05-30.json create mode 100644 app/src/test/res/autotune/test4/ns-treatments.2022-05-30.json create mode 100644 app/src/test/res/autotune/test4/profile.2022-05-30.json create mode 100644 app/src/test/res/autotune/test4/profile.pump.json diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneCoreTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneCoreTest.kt index fccbc12121..2eb422e717 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneCoreTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneCoreTest.kt @@ -41,7 +41,7 @@ class AutotuneCoreTest : TestBaseWithProfile() { } @Test - fun autotuneCoreTest() { // Test if load from file of OpenAPS categorisation is Ok + fun autotuneCoreTest1() { // Test if AutotuneCore with input files of OpenAPS categorisation gives correct ouput profile val prepjson = File("src/test/res/autotune/test1/autotune.2022-05-21.json").readText() val inputProfileJson = File("src/test/res/autotune/test1/profile.pump.json").readText() val inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! @@ -62,6 +62,28 @@ class AutotuneCoreTest : TestBaseWithProfile() { ?:Assert.fail() } + @Test + fun autotuneCoreTest4() { // Test if limiting modification with Min Max Autosens parameter works (18h on basal and on ISF value) + val prepjson = File("src/test/res/autotune/test4/autotune.2022-05-30.json").readText() + val inputProfileJson = File("src/test/res/autotune/test4/profile.2022-05-30.json").readText() + val inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! + val pumpProfileJson = File("src/test/res/autotune/test4/profile.pump.json").readText() + val pumpProfile = atProfileFromOapsJson(JSONObject(pumpProfileJson), dateUtil)!! + val prep = PreppedGlucose(JSONObject(prepjson), dateUtil) + `when`(sp.getDouble(R.string.key_openapsama_autosens_max, 1.2)).thenReturn(autotuneMax) + `when`(sp.getDouble(R.string.key_openapsama_autosens_min, 0.7)).thenReturn(autotuneMin) + `when`(sp.getDouble(R.string.key_openapsama_min_5m_carbimpact, 3.0)).thenReturn(min5mCarbImpact) + val OapsOutputProfileJson = File("src/test/res/autotune/test4/newprofile.2022-05-30.json").readText() + val OapsOutputProfile = atProfileFromOapsJson(JSONObject(OapsOutputProfileJson),dateUtil) + val outProfile = autotuneCore.tuneAllTheThings(prep, inputProfile, pumpProfile) + OapsOutputProfile?.let { + Assert.assertEquals(OapsOutputProfile.isf, outProfile.isf, 0.0) + Assert.assertEquals(OapsOutputProfile.ic, outProfile.ic, 0.0) + for (i in 0..23) + Assert.assertEquals(OapsOutputProfile.basal[i], outProfile.basal[i], 0.0) + } + ?:Assert.fail() + } /** diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt index e36843b2da..9ac1c3272f 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt @@ -44,7 +44,6 @@ class AutotunePrepTest : TestBaseWithProfile() { var autotuneMax = 0.0 var startDayTime = 0L - @Before fun initData() { TimeZone.setDefault(TimeZone.getTimeZone("GMT+2")) diff --git a/app/src/test/res/autotune/test4/autotune.2022-05-30.json b/app/src/test/res/autotune/test4/autotune.2022-05-30.json new file mode 100644 index 0000000000..461ffc542c --- /dev/null +++ b/app/src/test/res/autotune/test4/autotune.2022-05-30.json @@ -0,0 +1 @@ +{"CRData":[{"CRInitialIOB":-0.087,"CRInitialBG":92,"CRInitialCarbTime":"2022-05-30T06:09:21.000Z","CREndIOB":0.396,"CREndBG":131,"CREndTime":"2022-05-30T09:29:21.000Z","CRCarbs":75,"CRInsulin":14.47},{"CRInitialIOB":-0.454,"CRInitialBG":77,"CRInitialCarbTime":"2022-05-30T10:44:21.000Z","CREndIOB":0.339,"CREndBG":100,"CREndTime":"2022-05-30T14:14:22.000Z","CRCarbs":50,"CRInsulin":10.84},{"CRInitialIOB":-0.947,"CRInitialBG":87,"CRInitialCarbTime":"2022-05-30T16:04:22.000Z","CREndIOB":-0.346,"CREndBG":130,"CREndTime":"2022-05-30T17:44:22.000Z","CRCarbs":10,"CRInsulin":0.01}],"CSFGlucoseData":[{"_id":"62945faad2cadd0004350d89","device":"AndroidAPS-DexcomG6","date":1653890961000,"dateString":"2022-05-30T06:09:21.000Z","isValid":true,"sgv":92,"direction":"Flat","type":"sgv","created_at":"2022-05-30T06:09:46.664Z","glucose":92,"avgDelta":"-0.50","BGI":-0.62,"deviation":"0.12","mealAbsorption":"start","mealCarbs":75},{"_id":"629460cdb82b320004ef5ec4","device":"AndroidAPS-DexcomG6","date":1653891261000,"dateString":"2022-05-30T06:14:21.000Z","isValid":true,"sgv":101,"direction":"Flat","type":"sgv","created_at":"2022-05-30T06:14:37.040Z","glucose":101,"avgDelta":"2.25","BGI":-0.42,"deviation":"2.67","mealCarbs":75},{"_id":"62946214b82b320004ef5ec6","device":"AndroidAPS-DexcomG6","date":1653891561000,"dateString":"2022-05-30T06:19:21.000Z","isValid":true,"sgv":118,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T06:20:04.840Z","glucose":118,"avgDelta":"7.00","BGI":-0.21,"deviation":"7.21","mealCarbs":75},{"_id":"6294632ab82b320004ef5ecc","device":"AndroidAPS-DexcomG6","date":1653891861000,"dateString":"2022-05-30T06:24:21.000Z","isValid":true,"sgv":137,"direction":"SingleUp","type":"sgv","created_at":"2022-05-30T06:24:42.093Z","glucose":137,"avgDelta":"12.00","BGI":-12.66,"deviation":"24.66","mealCarbs":75},{"_id":"62946458b82b320004ef5ecf","device":"AndroidAPS-DexcomG6","date":1653892161000,"dateString":"2022-05-30T06:29:21.000Z","isValid":true,"sgv":157,"direction":"DoubleUp","type":"sgv","created_at":"2022-05-30T06:29:44.223Z","glucose":157,"avgDelta":"16.25","BGI":-25.36,"deviation":"41.61","mealCarbs":75},{"_id":"62946586b82b320004ef5ed1","device":"AndroidAPS-DexcomG6","date":1653892461000,"dateString":"2022-05-30T06:34:21.000Z","isValid":true,"sgv":173,"direction":"DoubleUp","type":"sgv","created_at":"2022-05-30T06:34:46.169Z","glucose":173,"avgDelta":"18.00","BGI":-35.2,"deviation":"53.20","mealCarbs":75},{"_id":"629466b3b82b320004ef5ed3","device":"AndroidAPS-DexcomG6","date":1653892761000,"dateString":"2022-05-30T06:39:21.000Z","isValid":true,"sgv":185,"direction":"DoubleUp","type":"sgv","created_at":"2022-05-30T06:39:47.469Z","glucose":185,"avgDelta":"16.75","BGI":-42.67,"deviation":"59.42","mealCarbs":75},{"_id":"629467e1b82b320004ef5ed5","device":"AndroidAPS-DexcomG6","date":1653893061000,"dateString":"2022-05-30T06:44:21.000Z","isValid":true,"sgv":193,"direction":"SingleUp","type":"sgv","created_at":"2022-05-30T06:44:49.181Z","glucose":193,"avgDelta":"14.00","BGI":-48.07,"deviation":"62.07","mealCarbs":75},{"_id":"629469166e1b8e0004363dfc","device":"AndroidAPS-DexcomG6","date":1653893361000,"dateString":"2022-05-30T06:49:21.000Z","isValid":true,"sgv":198,"direction":"SingleUp","type":"sgv","created_at":"2022-05-30T06:49:58.419Z","glucose":198,"avgDelta":"10.25","BGI":-51.84,"deviation":"62.09","mealCarbs":75},{"_id":"62946a5e6e1b8e0004363dfe","device":"AndroidAPS-DexcomG6","date":1653893661000,"dateString":"2022-05-30T06:54:21.000Z","isValid":true,"sgv":201,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T06:55:26.117Z","glucose":201,"avgDelta":"7.00","BGI":-54.17,"deviation":"61.17","mealCarbs":75},{"_id":"62946b8a6e1b8e0004363e01","device":"AndroidAPS-DexcomG6","date":1653893961000,"dateString":"2022-05-30T06:59:21.000Z","isValid":true,"sgv":203,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T07:00:26.210Z","glucose":203,"avgDelta":"4.50","BGI":-55.41,"deviation":"59.91","mealCarbs":75},{"_id":"62946c9e6e1b8e0004363e03","device":"AndroidAPS-DexcomG6","date":1653894260000,"dateString":"2022-05-30T07:04:20.000Z","isValid":true,"sgv":203,"direction":"Flat","type":"sgv","created_at":"2022-05-30T07:05:02.549Z","glucose":203,"avgDelta":"2.50","BGI":-55.7,"deviation":"58.20","mealCarbs":75},{"_id":"62946db36e1b8e0004363e05","device":"AndroidAPS-DexcomG6","date":1653894562000,"dateString":"2022-05-30T07:09:22.000Z","isValid":true,"sgv":202,"direction":"Flat","type":"sgv","created_at":"2022-05-30T07:09:39.329Z","glucose":202,"avgDelta":"1.00","BGI":-55.25,"deviation":"56.25","mealCarbs":75},{"_id":"62946ee06e1b8e0004363e07","device":"AndroidAPS-DexcomG6","date":1653894861000,"dateString":"2022-05-30T07:14:21.000Z","isValid":true,"sgv":201,"direction":"Flat","type":"sgv","created_at":"2022-05-30T07:14:40.201Z","glucose":201,"avgDelta":"0.00","BGI":-54.21,"deviation":"54.21","mealCarbs":75},{"_id":"6294700d6e1b8e0004363e09","device":"AndroidAPS-DexcomG6","date":1653895162000,"dateString":"2022-05-30T07:19:22.000Z","isValid":true,"sgv":202,"direction":"Flat","type":"sgv","created_at":"2022-05-30T07:19:41.498Z","glucose":202,"avgDelta":"-0.25","BGI":-52.63,"deviation":"52.38","mealCarbs":75},{"_id":"629471377e1237000471bf42","device":"AndroidAPS-DexcomG6","date":1653895461000,"dateString":"2022-05-30T07:24:21.000Z","isValid":true,"sgv":204,"direction":"Flat","type":"sgv","created_at":"2022-05-30T07:24:39.113Z","glucose":204,"avgDelta":"0.25","BGI":-50.76,"deviation":"51.01","mealCarbs":75},{"_id":"629472647e1237000471bf44","device":"AndroidAPS-DexcomG6","date":1653895761000,"dateString":"2022-05-30T07:29:21.000Z","isValid":true,"sgv":208,"direction":"Flat","type":"sgv","created_at":"2022-05-30T07:29:40.917Z","glucose":208,"avgDelta":"1.50","BGI":-48.56,"deviation":"50.06","mealCarbs":75},{"_id":"629473927e1237000471bf46","device":"AndroidAPS-DexcomG6","date":1653896061000,"dateString":"2022-05-30T07:34:21.000Z","isValid":true,"sgv":213,"direction":"Flat","type":"sgv","created_at":"2022-05-30T07:34:42.398Z","glucose":213,"avgDelta":"3.00","BGI":-46.24,"deviation":"49.24","mealCarbs":75},{"_id":"629474c07e1237000471bf48","device":"AndroidAPS-DexcomG6","date":1653896361000,"dateString":"2022-05-30T07:39:21.000Z","isValid":true,"sgv":217,"direction":"Flat","type":"sgv","created_at":"2022-05-30T07:39:44.449Z","glucose":217,"avgDelta":"3.75","BGI":-43.87,"deviation":"47.62","mealCarbs":75},{"_id":"629475ed7e1237000471bf4a","device":"AndroidAPS-DexcomG6","date":1653896662000,"dateString":"2022-05-30T07:44:22.000Z","isValid":true,"sgv":218,"direction":"Flat","type":"sgv","created_at":"2022-05-30T07:44:45.778Z","glucose":218,"avgDelta":"3.50","BGI":-41.47,"deviation":"44.97","mealCarbs":75},{"_id":"6294771a7e1237000471bf4c","device":"AndroidAPS-DexcomG6","date":1653896961000,"dateString":"2022-05-30T07:49:21.000Z","isValid":true,"sgv":219,"direction":"Flat","type":"sgv","created_at":"2022-05-30T07:49:46.684Z","glucose":219,"avgDelta":"2.75","BGI":-39.06,"deviation":"41.81","mealCarbs":75},{"_id":"629478477e1237000471bf4e","device":"AndroidAPS-DexcomG6","date":1653897262000,"dateString":"2022-05-30T07:54:22.000Z","isValid":true,"sgv":219,"direction":"Flat","type":"sgv","created_at":"2022-05-30T07:54:47.898Z","glucose":219,"avgDelta":"1.50","BGI":-36.69,"deviation":"38.19","mealCarbs":75},{"_id":"62947975d10aeb0004cd3fe5","device":"AndroidAPS-DexcomG6","date":1653897561000,"dateString":"2022-05-30T07:59:21.000Z","isValid":true,"sgv":217,"direction":"Flat","type":"sgv","created_at":"2022-05-30T07:59:49.147Z","glucose":217,"avgDelta":"0.00","BGI":-33.21,"deviation":"33.21","mealCarbs":75},{"_id":"62947aa2d10aeb0004cd3fe7","device":"AndroidAPS-DexcomG6","date":1653897861000,"dateString":"2022-05-30T08:04:21.000Z","isValid":true,"sgv":213,"direction":"Flat","type":"sgv","created_at":"2022-05-30T08:04:50.320Z","glucose":213,"avgDelta":"-1.25","BGI":-30.67,"deviation":"29.42","mealCarbs":75},{"_id":"62947bcfd10aeb0004cd3fe9","device":"AndroidAPS-DexcomG6","date":1653898161000,"dateString":"2022-05-30T08:09:21.000Z","isValid":true,"sgv":209,"direction":"Flat","type":"sgv","created_at":"2022-05-30T08:09:51.204Z","glucose":209,"avgDelta":"-2.50","BGI":-28.22,"deviation":"25.72","mealCarbs":75},{"_id":"62947cfcd10aeb0004cd3feb","device":"AndroidAPS-DexcomG6","date":1653898461000,"dateString":"2022-05-30T08:14:21.000Z","isValid":true,"sgv":207,"direction":"Flat","type":"sgv","created_at":"2022-05-30T08:14:52.631Z","glucose":207,"avgDelta":"-3.00","BGI":-25.86,"deviation":"22.86","mealCarbs":75},{"_id":"62947e29d10aeb0004cd3fed","device":"AndroidAPS-DexcomG6","date":1653898761000,"dateString":"2022-05-30T08:19:21.000Z","isValid":true,"sgv":206,"direction":"Flat","type":"sgv","created_at":"2022-05-30T08:19:53.852Z","glucose":206,"avgDelta":"-2.75","BGI":-23.58,"deviation":"20.83","mealCarbs":75},{"_id":"62947f56d10aeb0004cd3ff0","device":"AndroidAPS-DexcomG6","date":1653899062000,"dateString":"2022-05-30T08:24:22.000Z","isValid":true,"sgv":205,"direction":"Flat","type":"sgv","created_at":"2022-05-30T08:24:54.980Z","glucose":205,"avgDelta":"-2.00","BGI":-21.42,"deviation":"19.42","mealCarbs":75},{"_id":"62948083d10aeb0004cd3ff4","device":"AndroidAPS-DexcomG6","date":1653899361000,"dateString":"2022-05-30T08:29:21.000Z","isValid":true,"sgv":202,"direction":"Flat","type":"sgv","created_at":"2022-05-30T08:29:55.869Z","glucose":202,"avgDelta":"-1.75","BGI":-19.47,"deviation":"17.72","mealCarbs":75},{"_id":"629481a58ecbb3000401e2cd","device":"AndroidAPS-DexcomG6","date":1653899661000,"dateString":"2022-05-30T08:34:21.000Z","isValid":true,"sgv":199,"direction":"Flat","type":"sgv","created_at":"2022-05-30T08:34:45.627Z","glucose":199,"avgDelta":"-2.00","BGI":-17.72,"deviation":"15.72","mealCarbs":75},{"_id":"629482d28ecbb3000401e2d0","device":"AndroidAPS-DexcomG6","date":1653899961000,"dateString":"2022-05-30T08:39:21.000Z","isValid":true,"sgv":197,"direction":"Flat","type":"sgv","created_at":"2022-05-30T08:39:46.821Z","glucose":197,"avgDelta":"-2.25","BGI":-16.02,"deviation":"13.77","mealCarbs":75},{"_id":"629484008ecbb3000401e2d3","device":"AndroidAPS-DexcomG6","date":1653900261000,"dateString":"2022-05-30T08:44:21.000Z","isValid":true,"sgv":195,"direction":"Flat","type":"sgv","created_at":"2022-05-30T08:44:48.348Z","glucose":195,"avgDelta":"-2.50","BGI":-14.49,"deviation":"11.99","mealCarbs":75},{"_id":"6294852d8ecbb3000401e2d7","device":"AndroidAPS-DexcomG6","date":1653900561000,"dateString":"2022-05-30T08:49:21.000Z","isValid":true,"sgv":193,"direction":"Flat","type":"sgv","created_at":"2022-05-30T08:49:49.550Z","glucose":193,"avgDelta":"-2.25","BGI":-13.28,"deviation":"11.03","mealCarbs":75},{"_id":"6294865a8ecbb3000401e2da","device":"AndroidAPS-DexcomG6","date":1653900861000,"dateString":"2022-05-30T08:54:21.000Z","isValid":true,"sgv":189,"direction":"Flat","type":"sgv","created_at":"2022-05-30T08:54:50.449Z","glucose":189,"avgDelta":"-2.50","BGI":-12.2,"deviation":"9.70","mealCarbs":75},{"_id":"629487878ecbb3000401e2dc","device":"AndroidAPS-DexcomG6","date":1653901161000,"dateString":"2022-05-30T08:59:21.000Z","isValid":true,"sgv":183,"direction":"Flat","type":"sgv","created_at":"2022-05-30T08:59:51.963Z","glucose":183,"avgDelta":"-3.50","BGI":-11.21,"deviation":"7.71","mealCarbs":75},{"_id":"629488b58ecbb3000401e2de","device":"AndroidAPS-DexcomG6","date":1653901461000,"dateString":"2022-05-30T09:04:21.000Z","isValid":true,"sgv":175,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T09:04:53.220Z","glucose":175,"avgDelta":"-5.00","BGI":-10.29,"deviation":"5.29","mealCarbs":75},{"_id":"62948a0776174b0004fbd21d","device":"AndroidAPS-DexcomG6","date":1653901761000,"dateString":"2022-05-30T09:09:21.000Z","isValid":true,"sgv":166,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T09:10:31.409Z","glucose":166,"avgDelta":"-6.75","BGI":-9.38,"deviation":"2.63","mealCarbs":75},{"_id":"62948b0276174b0004fbd21f","device":"AndroidAPS-DexcomG6","date":1653902061000,"dateString":"2022-05-30T09:14:21.000Z","isValid":true,"sgv":156,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T09:14:42.378Z","glucose":156,"avgDelta":"-8.25","BGI":-8.47,"deviation":"0.22","mealCarbs":75},{"_id":"62948c4876174b0004fbd222","device":"AndroidAPS-DexcomG6","date":1653902361000,"dateString":"2022-05-30T09:19:21.000Z","isValid":true,"sgv":146,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T09:20:08.645Z","glucose":146,"avgDelta":"-9.25","BGI":-7.6,"deviation":"-1.65","mealCarbs":0,"mealAbsorption":"end"},{"_id":"6294a02dc2e464000413b7a6","device":"AndroidAPS-DexcomG6","date":1653907461000,"dateString":"2022-05-30T10:44:21.000Z","isValid":true,"sgv":77,"direction":"Flat","type":"sgv","created_at":"2022-05-30T10:45:01.559Z","glucose":77,"avgDelta":"-1.25","BGI":1.45,"deviation":"-2.70","mealAbsorption":"start","mealCarbs":50},{"_id":"6294a15bc2e464000413b7a8","device":"AndroidAPS-DexcomG6","date":1653907762000,"dateString":"2022-05-30T10:49:22.000Z","isValid":true,"sgv":76,"direction":"Flat","type":"sgv","created_at":"2022-05-30T10:50:03.007Z","glucose":76,"avgDelta":"-1.00","BGI":1.66,"deviation":"-2.66","mealCarbs":50},{"_id":"6294a274ac54000004308874","device":"AndroidAPS-DexcomG6","date":1653908062000,"dateString":"2022-05-30T10:54:22.000Z","isValid":true,"sgv":77,"direction":"Flat","type":"sgv","created_at":"2022-05-30T10:54:44.532Z","glucose":77,"avgDelta":"-0.50","BGI":1.78,"deviation":"-2.28","mealCarbs":50},{"_id":"6294a3a3ac54000004308877","device":"AndroidAPS-DexcomG6","date":1653908361000,"dateString":"2022-05-30T10:59:21.000Z","isValid":true,"sgv":81,"direction":"Flat","type":"sgv","created_at":"2022-05-30T10:59:47.232Z","glucose":81,"avgDelta":"0.75","BGI":1.87,"deviation":"-1.12","mealCarbs":50},{"_id":"6294a4d1ac5400000430887a","device":"AndroidAPS-DexcomG6","date":1653908662000,"dateString":"2022-05-30T11:04:22.000Z","isValid":true,"sgv":88,"direction":"Flat","type":"sgv","created_at":"2022-05-30T11:04:49.434Z","glucose":88,"avgDelta":"2.75","BGI":1.95,"deviation":"0.80","mealCarbs":50},{"_id":"6294a60eac5400000430887d","device":"AndroidAPS-DexcomG6","date":1653908962000,"dateString":"2022-05-30T11:09:22.000Z","isValid":true,"sgv":102,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T11:10:06.733Z","glucose":102,"avgDelta":"6.50","BGI":1.99,"deviation":"4.51","mealCarbs":50},{"_id":"6294a723ac54000004308881","device":"AndroidAPS-DexcomG6","date":1653909261000,"dateString":"2022-05-30T11:14:21.000Z","isValid":true,"sgv":122,"direction":"SingleUp","type":"sgv","created_at":"2022-05-30T11:14:43.529Z","glucose":122,"avgDelta":"11.25","BGI":1.66,"deviation":"9.59","mealCarbs":50},{"_id":"6294a851ac54000004308883","device":"AndroidAPS-DexcomG6","date":1653909561000,"dateString":"2022-05-30T11:19:21.000Z","isValid":true,"sgv":146,"direction":"DoubleUp","type":"sgv","created_at":"2022-05-30T11:19:45.466Z","glucose":146,"avgDelta":"16.25","BGI":1,"deviation":"15.25","mealCarbs":50},{"_id":"6294a97eac54000004308887","device":"AndroidAPS-DexcomG6","date":1653909861000,"dateString":"2022-05-30T11:24:21.000Z","isValid":true,"sgv":172,"direction":"DoubleUp","type":"sgv","created_at":"2022-05-30T11:24:46.490Z","glucose":172,"avgDelta":"21.00","BGI":-0.46,"deviation":"21.46","mealCarbs":50},{"_id":"6294aaabac5400000430888a","device":"AndroidAPS-DexcomG6","date":1653910161000,"dateString":"2022-05-30T11:29:21.000Z","isValid":true,"sgv":195,"direction":"DoubleUp","type":"sgv","created_at":"2022-05-30T11:29:47.695Z","glucose":195,"avgDelta":"23.25","BGI":-2.2,"deviation":"25.45","mealCarbs":50},{"_id":"6294abd9ac5400000430888e","device":"AndroidAPS-DexcomG6","date":1653910462000,"dateString":"2022-05-30T11:34:22.000Z","isValid":true,"sgv":215,"direction":"DoubleUp","type":"sgv","created_at":"2022-05-30T11:34:49.146Z","glucose":215,"avgDelta":"23.25","BGI":-3.86,"deviation":"27.11","mealCarbs":50},{"_id":"6294ad1b0f39100004ec41e2","device":"AndroidAPS-DexcomG6","date":1653910761000,"dateString":"2022-05-30T11:39:21.000Z","isValid":true,"sgv":230,"direction":"DoubleUp","type":"sgv","created_at":"2022-05-30T11:40:11.205Z","glucose":230,"avgDelta":"21.00","BGI":-5.27,"deviation":"26.27","mealCarbs":50},{"_id":"6294ae2f0f39100004ec41e7","device":"AndroidAPS-DexcomG6","date":1653911061000,"dateString":"2022-05-30T11:44:21.000Z","isValid":true,"sgv":240,"direction":"DoubleUp","type":"sgv","created_at":"2022-05-30T11:44:47.323Z","glucose":240,"avgDelta":"17.00","BGI":-14.24,"deviation":"31.24","mealCarbs":50},{"_id":"6294af5c0f39100004ec41ed","device":"AndroidAPS-DexcomG6","date":1653911361000,"dateString":"2022-05-30T11:49:21.000Z","isValid":true,"sgv":246,"direction":"SingleUp","type":"sgv","created_at":"2022-05-30T11:49:48.926Z","glucose":246,"avgDelta":"12.75","BGI":-22.99,"deviation":"35.74","mealCarbs":50},{"_id":"6294b08a0f39100004ec41ef","device":"AndroidAPS-DexcomG6","date":1653911662000,"dateString":"2022-05-30T11:54:22.000Z","isValid":true,"sgv":249,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T11:54:50.545Z","glucose":249,"avgDelta":"8.50","BGI":-29.72,"deviation":"38.22","mealCarbs":50},{"_id":"6294b1d10f39100004ec41f1","device":"AndroidAPS-DexcomG6","date":1653911961000,"dateString":"2022-05-30T11:59:21.000Z","isValid":true,"sgv":251,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T12:00:17.223Z","glucose":251,"avgDelta":"5.25","BGI":-34.7,"deviation":"39.95","mealCarbs":50},{"_id":"6294b2e50f39100004ec41f3","device":"AndroidAPS-DexcomG6","date":1653912261000,"dateString":"2022-05-30T12:04:21.000Z","isValid":true,"sgv":251,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T12:04:53.216Z","glucose":251,"avgDelta":"2.75","BGI":-38.27,"deviation":"41.02","mealCarbs":50},{"_id":"6294b4130f39100004ec41f5","device":"AndroidAPS-DexcomG6","date":1653912562000,"dateString":"2022-05-30T12:09:22.000Z","isValid":true,"sgv":248,"direction":"Flat","type":"sgv","created_at":"2022-05-30T12:09:55.708Z","glucose":248,"avgDelta":"0.50","BGI":-40.64,"deviation":"41.14","mealCarbs":50},{"_id":"6294b53dff39db0004546852","device":"AndroidAPS-DexcomG6","date":1653912862000,"dateString":"2022-05-30T12:14:22.000Z","isValid":true,"sgv":242,"direction":"Flat","type":"sgv","created_at":"2022-05-30T12:14:53.986Z","glucose":242,"avgDelta":"-1.75","BGI":-42.05,"deviation":"40.30","mealCarbs":50},{"_id":"6294b66bff39db0004546853","device":"AndroidAPS-DexcomG6","date":1653913162000,"dateString":"2022-05-30T12:19:22.000Z","isValid":true,"sgv":232,"direction":"Flat","type":"sgv","created_at":"2022-05-30T12:19:55.640Z","glucose":232,"avgDelta":"-4.75","BGI":-42.67,"deviation":"37.92","mealCarbs":50},{"_id":"6294b799ff39db0004546858","device":"AndroidAPS-DexcomG6","date":1653913462000,"dateString":"2022-05-30T12:24:22.000Z","isValid":true,"sgv":223,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T12:24:57.749Z","glucose":223,"avgDelta":"-7.00","BGI":-42.63,"deviation":"35.63","mealCarbs":50},{"_id":"6294b8c7ff39db000454685b","device":"AndroidAPS-DexcomG6","date":1653913762000,"dateString":"2022-05-30T12:29:22.000Z","isValid":true,"sgv":213,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T12:29:59.741Z","glucose":213,"avgDelta":"-8.75","BGI":-42.09,"deviation":"33.34","mealCarbs":50},{"_id":"6294b9f6ff39db000454685e","device":"AndroidAPS-DexcomG6","date":1653914062000,"dateString":"2022-05-30T12:34:22.000Z","isValid":true,"sgv":203,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T12:35:02.052Z","glucose":203,"avgDelta":"-9.75","BGI":-41.09,"deviation":"31.34","mealCarbs":50},{"_id":"6294bb0bff39db0004546861","device":"AndroidAPS-DexcomG6","date":1653914362000,"dateString":"2022-05-30T12:39:22.000Z","isValid":true,"sgv":195,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T12:39:39.194Z","glucose":195,"avgDelta":"-9.25","BGI":-39.72,"deviation":"30.47","mealCarbs":50},{"_id":"6294bc52ff39db0004546864","device":"AndroidAPS-DexcomG6","date":1653914661000,"dateString":"2022-05-30T12:44:21.000Z","isValid":true,"sgv":188,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T12:45:06.129Z","glucose":188,"avgDelta":"-8.75","BGI":-38.19,"deviation":"29.44","mealCarbs":50},{"_id":"6294bd7352bed20004c9a2ac","device":"AndroidAPS-DexcomG6","date":1653914962000,"dateString":"2022-05-30T12:49:22.000Z","isValid":true,"sgv":182,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T12:49:55.775Z","glucose":182,"avgDelta":"-7.75","BGI":-36.4,"deviation":"28.65","mealCarbs":50},{"_id":"6294bea052bed20004c9a2af","device":"AndroidAPS-DexcomG6","date":1653915262000,"dateString":"2022-05-30T12:54:22.000Z","isValid":true,"sgv":176,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T12:54:56.765Z","glucose":176,"avgDelta":"-6.75","BGI":-34.41,"deviation":"27.66","mealCarbs":50},{"_id":"6294bfce52bed20004c9a2b2","device":"AndroidAPS-DexcomG6","date":1653915561000,"dateString":"2022-05-30T12:59:21.000Z","isValid":true,"sgv":170,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T12:59:58.302Z","glucose":170,"avgDelta":"-6.25","BGI":-32.42,"deviation":"26.17","mealCarbs":50},{"_id":"6294c0fb52bed20004c9a2b5","device":"AndroidAPS-DexcomG6","date":1653915862000,"dateString":"2022-05-30T13:04:22.000Z","isValid":true,"sgv":164,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T13:04:59.247Z","glucose":164,"avgDelta":"-6.00","BGI":-30.38,"deviation":"24.38","mealCarbs":50},{"_id":"6294c22852bed20004c9a2b7","device":"AndroidAPS-DexcomG6","date":1653916162000,"dateString":"2022-05-30T13:09:22.000Z","isValid":true,"sgv":158,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T13:10:00.478Z","glucose":158,"avgDelta":"-6.00","BGI":-28.31,"deviation":"22.31","mealCarbs":50},{"_id":"6294c35552bed20004c9a2ba","device":"AndroidAPS-DexcomG6","date":1653916461000,"dateString":"2022-05-30T13:14:21.000Z","isValid":true,"sgv":152,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T13:15:01.720Z","glucose":152,"avgDelta":"-6.00","BGI":-26.23,"deviation":"20.23","mealCarbs":50},{"_id":"6294c48252bed20004c9a2bc","device":"AndroidAPS-DexcomG6","date":1653916762000,"dateString":"2022-05-30T13:19:22.000Z","isValid":true,"sgv":147,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T13:20:02.947Z","glucose":147,"avgDelta":"-5.75","BGI":-24.2,"deviation":"18.45","mealCarbs":50},{"_id":"6294c5a6b8c0c10004ff0007","device":"AndroidAPS-DexcomG6","date":1653917062000,"dateString":"2022-05-30T13:24:22.000Z","isValid":true,"sgv":141,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T13:24:54.571Z","glucose":141,"avgDelta":"-5.75","BGI":-22.21,"deviation":"16.46","mealCarbs":50},{"_id":"6294c6d3b8c0c10004ff0009","device":"AndroidAPS-DexcomG6","date":1653917362000,"dateString":"2022-05-30T13:29:22.000Z","isValid":true,"sgv":136,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T13:29:55.794Z","glucose":136,"avgDelta":"-5.50","BGI":-20.34,"deviation":"14.84","mealCarbs":50},{"_id":"6294c801b8c0c10004ff000b","device":"AndroidAPS-DexcomG6","date":1653917662000,"dateString":"2022-05-30T13:34:22.000Z","isValid":true,"sgv":130,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T13:34:57.267Z","glucose":130,"avgDelta":"-5.50","BGI":-18.47,"deviation":"12.97","mealCarbs":50},{"_id":"6294c92eb8c0c10004ff000d","device":"AndroidAPS-DexcomG6","date":1653917962000,"dateString":"2022-05-30T13:39:22.000Z","isValid":true,"sgv":126,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T13:39:58.439Z","glucose":126,"avgDelta":"-5.25","BGI":-16.73,"deviation":"11.48","mealCarbs":50},{"_id":"6294ca5bb8c0c10004ff0010","device":"AndroidAPS-DexcomG6","date":1653918262000,"dateString":"2022-05-30T13:44:22.000Z","isValid":true,"sgv":121,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T13:44:59.703Z","glucose":121,"avgDelta":"-5.00","BGI":-15.11,"deviation":"10.11","mealCarbs":50},{"_id":"6294cb88b8c0c10004ff0012","device":"AndroidAPS-DexcomG6","date":1653918561000,"dateString":"2022-05-30T13:49:21.000Z","isValid":true,"sgv":117,"direction":"Flat","type":"sgv","created_at":"2022-05-30T13:50:00.678Z","glucose":117,"avgDelta":"-4.75","BGI":-13.49,"deviation":"8.74","mealCarbs":50},{"_id":"6294cc9cb8c0c10004ff0014","device":"AndroidAPS-DexcomG6","date":1653918862000,"dateString":"2022-05-30T13:54:22.000Z","isValid":true,"sgv":113,"direction":"Flat","type":"sgv","created_at":"2022-05-30T13:54:36.799Z","glucose":113,"avgDelta":"-4.25","BGI":-12.04,"deviation":"7.79","mealCarbs":50},{"_id":"6294cdccdac1e20004fde58d","device":"AndroidAPS-DexcomG6","date":1653919161000,"dateString":"2022-05-30T13:59:21.000Z","isValid":true,"sgv":110,"direction":"Flat","type":"sgv","created_at":"2022-05-30T13:59:40.487Z","glucose":110,"avgDelta":"-4.00","BGI":-10.63,"deviation":"6.63","mealCarbs":50},{"_id":"6294cf12dac1e20004fde58f","device":"AndroidAPS-DexcomG6","date":1653919462000,"dateString":"2022-05-30T14:04:22.000Z","isValid":true,"sgv":106,"direction":"Flat","type":"sgv","created_at":"2022-05-30T14:05:06.902Z","glucose":106,"avgDelta":"-3.75","BGI":-9.26,"deviation":"5.51","mealCarbs":50},{"_id":"6294d026dac1e20004fde592","device":"AndroidAPS-DexcomG6","date":1653919761000,"dateString":"2022-05-30T14:09:21.000Z","isValid":true,"sgv":103,"direction":"Flat","type":"sgv","created_at":"2022-05-30T14:09:42.740Z","glucose":103,"avgDelta":"-3.50","BGI":-7.97,"deviation":"4.47","mealCarbs":50},{"_id":"6294d154dac1e20004fde594","device":"AndroidAPS-DexcomG6","date":1653920062000,"dateString":"2022-05-30T14:14:22.000Z","isValid":true,"sgv":100,"direction":"Flat","type":"sgv","created_at":"2022-05-30T14:14:44.142Z","glucose":100,"avgDelta":"-3.25","BGI":-6.85,"deviation":"3.60","mealCarbs":0,"mealAbsorption":"end"},{"_id":"6294eb2bb23f340004e841d8","device":"AndroidAPS-DexcomG6","date":1653926662000,"dateString":"2022-05-30T16:04:22.000Z","isValid":true,"sgv":87,"direction":"Flat","type":"sgv","created_at":"2022-05-30T16:04:59.310Z","glucose":87,"avgDelta":"2.25","BGI":3.86,"deviation":"-1.61","mealAbsorption":"start","mealCarbs":10},{"_id":"6294ec59b23f340004e841da","device":"AndroidAPS-DexcomG6","date":1653926962000,"dateString":"2022-05-30T16:09:22.000Z","isValid":true,"sgv":97,"direction":"Flat","type":"sgv","created_at":"2022-05-30T16:10:01.438Z","glucose":97,"avgDelta":"4.50","BGI":4.03,"deviation":"0.47","mealCarbs":10},{"_id":"6294ed6eb23f340004e841de","device":"AndroidAPS-DexcomG6","date":1653927262000,"dateString":"2022-05-30T16:14:22.000Z","isValid":true,"sgv":111,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T16:14:38.319Z","glucose":111,"avgDelta":"7.50","BGI":4.07,"deviation":"3.43","mealCarbs":10},{"_id":"6294eeb5b23f340004e841e1","device":"AndroidAPS-DexcomG6","date":1653927562000,"dateString":"2022-05-30T16:19:22.000Z","isValid":true,"sgv":123,"direction":"SingleUp","type":"sgv","created_at":"2022-05-30T16:20:05.391Z","glucose":123,"avgDelta":"10.25","BGI":3.94,"deviation":"6.31","mealCarbs":10},{"_id":"6294efcab23f340004e841e5","device":"AndroidAPS-DexcomG6","date":1653927861000,"dateString":"2022-05-30T16:24:21.000Z","isValid":true,"sgv":131,"direction":"SingleUp","type":"sgv","created_at":"2022-05-30T16:24:42.057Z","glucose":131,"avgDelta":"11.00","BGI":3.49,"deviation":"7.51","mealCarbs":10},{"_id":"6294f0f8b23f340004e841e8","device":"AndroidAPS-DexcomG6","date":1653928161000,"dateString":"2022-05-30T16:29:21.000Z","isValid":true,"sgv":133,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T16:29:44.123Z","glucose":133,"avgDelta":"9.00","BGI":2.91,"deviation":"6.09","mealCarbs":10},{"_id":"6294f23fb23f340004e841eb","device":"AndroidAPS-DexcomG6","date":1653928462000,"dateString":"2022-05-30T16:34:22.000Z","isValid":true,"sgv":132,"direction":"Flat","type":"sgv","created_at":"2022-05-30T16:35:11.666Z","glucose":132,"avgDelta":"5.25","BGI":2.49,"deviation":"2.76","mealCarbs":10},{"_id":"6294f35555b9dd00048a547a","device":"AndroidAPS-DexcomG6","date":1653928761000,"dateString":"2022-05-30T16:39:21.000Z","isValid":true,"sgv":128,"direction":"Flat","type":"sgv","created_at":"2022-05-30T16:39:49.489Z","glucose":128,"avgDelta":"1.25","BGI":2.2,"deviation":"-0.95","mealCarbs":10},{"_id":"6294f4db55b9dd00048a547d","device":"AndroidAPS-DexcomG6","date":1653929062000,"dateString":"2022-05-30T16:44:22.000Z","isValid":true,"sgv":125,"direction":"Flat","type":"sgv","created_at":"2022-05-30T16:46:19.989Z","glucose":125,"avgDelta":"-1.50","BGI":1.95,"deviation":"-3.45","mealCarbs":10},{"_id":"6294f5bd55b9dd00048a547f","device":"AndroidAPS-DexcomG6","date":1653929361000,"dateString":"2022-05-30T16:49:21.000Z","isValid":true,"sgv":123,"direction":"Flat","type":"sgv","created_at":"2022-05-30T16:50:05.068Z","glucose":123,"avgDelta":"-2.50","BGI":1.83,"deviation":"-4.33","mealCarbs":10},{"_id":"6294f6ea55b9dd00048a5481","device":"AndroidAPS-DexcomG6","date":1653929662000,"dateString":"2022-05-30T16:54:22.000Z","isValid":true,"sgv":121,"direction":"Flat","type":"sgv","created_at":"2022-05-30T16:55:06.087Z","glucose":121,"avgDelta":"-2.75","BGI":1.83,"deviation":"-4.58","mealCarbs":10},{"_id":"6294f7fe55b9dd00048a5483","device":"AndroidAPS-DexcomG6","date":1653929962000,"dateString":"2022-05-30T16:59:22.000Z","isValid":true,"sgv":120,"direction":"Flat","type":"sgv","created_at":"2022-05-30T16:59:42.653Z","glucose":120,"avgDelta":"-2.00","BGI":1.78,"deviation":"-3.78","mealCarbs":10},{"_id":"6294f92d55b9dd00048a5486","device":"AndroidAPS-DexcomG6","date":1653930261000,"dateString":"2022-05-30T17:04:21.000Z","isValid":true,"sgv":120,"direction":"Flat","type":"sgv","created_at":"2022-05-30T17:04:45.622Z","glucose":120,"avgDelta":"-1.25","BGI":1.78,"deviation":"-3.03","mealCarbs":10},{"_id":"6294fa6255b9dd00048a5488","device":"AndroidAPS-DexcomG6","date":1653930562000,"dateString":"2022-05-30T17:09:22.000Z","isValid":true,"sgv":119,"direction":"Flat","type":"sgv","created_at":"2022-05-30T17:09:54.701Z","glucose":119,"avgDelta":"-1.00","BGI":1.91,"deviation":"-2.91","mealCarbs":10},{"_id":"6294fb9155b9dd00048a548a","device":"AndroidAPS-DexcomG6","date":1653930862000,"dateString":"2022-05-30T17:14:22.000Z","isValid":true,"sgv":119,"direction":"Flat","type":"sgv","created_at":"2022-05-30T17:14:57.054Z","glucose":119,"avgDelta":"-0.50","BGI":1.95,"deviation":"-2.45","mealCarbs":10},{"_id":"6294fcbf55b9dd00048a548c","device":"AndroidAPS-DexcomG6","date":1653931162000,"dateString":"2022-05-30T17:19:22.000Z","isValid":true,"sgv":119,"direction":"Flat","type":"sgv","created_at":"2022-05-30T17:19:59.153Z","glucose":119,"avgDelta":"-0.25","BGI":1.99,"deviation":"-2.24","mealCarbs":10},{"_id":"6294fded55b9dd00048a548e","device":"AndroidAPS-DexcomG6","date":1653931462000,"dateString":"2022-05-30T17:24:22.000Z","isValid":true,"sgv":121,"direction":"Flat","type":"sgv","created_at":"2022-05-30T17:25:01.436Z","glucose":121,"avgDelta":"0.25","BGI":2.03,"deviation":"-1.78","mealCarbs":10},{"_id":"6294ff1c55b9dd00048a5490","device":"AndroidAPS-DexcomG6","date":1653931761000,"dateString":"2022-05-30T17:29:21.000Z","isValid":true,"sgv":123,"direction":"Flat","type":"sgv","created_at":"2022-05-30T17:30:04.244Z","glucose":123,"avgDelta":"1.00","BGI":1.99,"deviation":"-0.99","mealCarbs":10},{"_id":"6295003055b9dd00048a5493","device":"AndroidAPS-DexcomG6","date":1653932061000,"dateString":"2022-05-30T17:34:21.000Z","isValid":true,"sgv":125,"direction":"Flat","type":"sgv","created_at":"2022-05-30T17:34:40.905Z","glucose":125,"avgDelta":"1.50","BGI":1.95,"deviation":"-0.45","mealCarbs":10},{"_id":"6295015e55b9dd00048a5495","device":"AndroidAPS-DexcomG6","date":1653932362000,"dateString":"2022-05-30T17:39:22.000Z","isValid":true,"sgv":127,"direction":"Flat","type":"sgv","created_at":"2022-05-30T17:39:42.833Z","glucose":127,"avgDelta":"2.00","BGI":1.99,"deviation":"0.01","mealCarbs":10},{"_id":"6295029d409703000484d1b7","device":"AndroidAPS-DexcomG6","date":1653932662000,"dateString":"2022-05-30T17:44:22.000Z","isValid":true,"sgv":130,"direction":"Flat","type":"sgv","created_at":"2022-05-30T17:45:01.816Z","glucose":130,"avgDelta":"2.25","BGI":1.95,"deviation":"0.30","mealCarbs":0,"mealAbsorption":"end"},{"_id":"62953178e3aedd00046f3879","device":"AndroidAPS-DexcomG6","date":1653944662000,"dateString":"2022-05-30T21:04:22.000Z","isValid":true,"sgv":163,"direction":"Flat","type":"sgv","created_at":"2022-05-30T21:04:56.492Z","glucose":163,"avgDelta":"-2.50","BGI":-6.64,"deviation":"4.14","mealAbsorption":"start","mealCarbs":35},{"_id":"629532a6e3aedd00046f387c","device":"AndroidAPS-DexcomG6","date":1653944962000,"dateString":"2022-05-30T21:09:22.000Z","isValid":true,"sgv":161,"direction":"Flat","type":"sgv","created_at":"2022-05-30T21:09:58.543Z","glucose":161,"avgDelta":"-2.50","BGI":-11.7,"deviation":"9.20","mealCarbs":35},{"_id":"629533d3e3aedd00046f387e","device":"AndroidAPS-DexcomG6","date":1653945263000,"dateString":"2022-05-30T21:14:23.000Z","isValid":true,"sgv":162,"direction":"Flat","type":"sgv","created_at":"2022-05-30T21:14:59.957Z","glucose":162,"avgDelta":"-1.75","BGI":-15.52,"deviation":"13.77","mealCarbs":35},{"_id":"62953501e3aedd00046f3880","device":"AndroidAPS-DexcomG6","date":1653945562000,"dateString":"2022-05-30T21:19:22.000Z","isValid":true,"sgv":167,"direction":"Flat","type":"sgv","created_at":"2022-05-30T21:20:01.384Z","glucose":167,"avgDelta":"0.25","BGI":-18.39,"deviation":"18.64","mealCarbs":35},{"_id":"6295362fe3aedd00046f3884","device":"AndroidAPS-DexcomG6","date":1653945863000,"dateString":"2022-05-30T21:24:23.000Z","isValid":true,"sgv":176,"direction":"Flat","type":"sgv","created_at":"2022-05-30T21:25:03.893Z","glucose":176,"avgDelta":"3.25","BGI":-20.5,"deviation":"23.75","mealCarbs":35},{"_id":"6295374986a3df0004eb44f6","device":"AndroidAPS-DexcomG6","date":1653946162000,"dateString":"2022-05-30T21:29:22.000Z","isValid":true,"sgv":187,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T21:29:45.117Z","glucose":187,"avgDelta":"6.50","BGI":-21.87,"deviation":"28.37","mealCarbs":35},{"_id":"6295387786a3df0004eb44f9","device":"AndroidAPS-DexcomG6","date":1653946462000,"dateString":"2022-05-30T21:34:22.000Z","isValid":true,"sgv":192,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T21:34:47.953Z","glucose":192,"avgDelta":"7.50","BGI":-22.83,"deviation":"30.33","mealCarbs":35},{"_id":"629539a586a3df0004eb44fb","device":"AndroidAPS-DexcomG6","date":1653946762000,"dateString":"2022-05-30T21:39:22.000Z","isValid":true,"sgv":188,"direction":"Flat","type":"sgv","created_at":"2022-05-30T21:39:49.822Z","glucose":188,"avgDelta":"5.25","BGI":-23.37,"deviation":"28.62","mealCarbs":35},{"_id":"62953ad486a3df0004eb44fd","device":"AndroidAPS-DexcomG6","date":1653947062000,"dateString":"2022-05-30T21:44:22.000Z","isValid":true,"sgv":181,"direction":"Flat","type":"sgv","created_at":"2022-05-30T21:44:52.471Z","glucose":181,"avgDelta":"1.25","BGI":-23.33,"deviation":"24.58","mealCarbs":35},{"_id":"62953c0286a3df0004eb4500","device":"AndroidAPS-DexcomG6","date":1653947361000,"dateString":"2022-05-30T21:49:21.000Z","isValid":true,"sgv":177,"direction":"Flat","type":"sgv","created_at":"2022-05-30T21:49:54.555Z","glucose":177,"avgDelta":"-2.50","BGI":-23.08,"deviation":"20.58","mealCarbs":35},{"_id":"62953d3086a3df0004eb4502","device":"AndroidAPS-DexcomG6","date":1653947662000,"dateString":"2022-05-30T21:54:22.000Z","isValid":true,"sgv":177,"direction":"Flat","type":"sgv","created_at":"2022-05-30T21:54:56.505Z","glucose":177,"avgDelta":"-3.75","BGI":-22.5,"deviation":"18.75","mealCarbs":35},{"_id":"62953e5d86a3df0004eb4504","device":"AndroidAPS-DexcomG6","date":1653947962000,"dateString":"2022-05-30T21:59:22.000Z","isValid":true,"sgv":181,"direction":"Flat","type":"sgv","created_at":"2022-05-30T21:59:57.963Z","glucose":181,"avgDelta":"-1.75","BGI":-21.71,"deviation":"19.96","mealCarbs":35},{"_id":"62953f7e1ded00000454b737","device":"AndroidAPS-DexcomG6","date":1653948262000,"dateString":"2022-05-30T22:04:22.000Z","isValid":true,"sgv":185,"direction":"Flat","type":"sgv","created_at":"2022-05-30T22:04:46.798Z","glucose":185,"avgDelta":"1.00","BGI":-20.8,"deviation":"21.80","mealCarbs":35},{"_id":"629540ac1ded00000454b739","device":"AndroidAPS-DexcomG6","date":1653948562000,"dateString":"2022-05-30T22:09:22.000Z","isValid":true,"sgv":188,"direction":"Flat","type":"sgv","created_at":"2022-05-30T22:09:48.384Z","glucose":188,"avgDelta":"2.75","BGI":-19.72,"deviation":"22.47","mealCarbs":35},{"_id":"629541da1ded00000454b73d","device":"AndroidAPS-DexcomG6","date":1653948861000,"dateString":"2022-05-30T22:14:21.000Z","isValid":true,"sgv":189,"direction":"Flat","type":"sgv","created_at":"2022-05-30T22:14:50.845Z","glucose":189,"avgDelta":"3.00","BGI":-18.64,"deviation":"21.64","mealCarbs":35},{"_id":"629543081ded00000454b740","device":"AndroidAPS-DexcomG6","date":1653949162000,"dateString":"2022-05-30T22:19:22.000Z","isValid":true,"sgv":188,"direction":"Flat","type":"sgv","created_at":"2022-05-30T22:19:52.210Z","glucose":188,"avgDelta":"1.75","BGI":-17.47,"deviation":"19.22","mealCarbs":35},{"_id":"629544361ded00000454b742","device":"AndroidAPS-DexcomG6","date":1653949462000,"dateString":"2022-05-30T22:24:22.000Z","isValid":true,"sgv":186,"direction":"Flat","type":"sgv","created_at":"2022-05-30T22:24:54.381Z","glucose":186,"avgDelta":"0.25","BGI":-16.27,"deviation":"16.52","mealCarbs":35},{"_id":"629545651ded00000454b744","device":"AndroidAPS-DexcomG6","date":1653949762000,"dateString":"2022-05-30T22:29:22.000Z","isValid":true,"sgv":183,"direction":"Flat","type":"sgv","created_at":"2022-05-30T22:29:57.528Z","glucose":183,"avgDelta":"-1.25","BGI":-15.03,"deviation":"13.78","mealCarbs":35},{"_id":"629546941ded00000454b746","device":"AndroidAPS-DexcomG6","date":1653950062000,"dateString":"2022-05-30T22:34:22.000Z","isValid":true,"sgv":180,"direction":"Flat","type":"sgv","created_at":"2022-05-30T22:35:00.013Z","glucose":180,"avgDelta":"-2.25","BGI":-13.82,"deviation":"11.57","mealCarbs":35},{"_id":"629547acf89bc40004df9f57","device":"AndroidAPS-DexcomG6","date":1653950362000,"dateString":"2022-05-30T22:39:22.000Z","isValid":true,"sgv":177,"direction":"Flat","type":"sgv","created_at":"2022-05-30T22:39:40.750Z","glucose":177,"avgDelta":"-2.75","BGI":-12.58,"deviation":"9.83","mealCarbs":35},{"_id":"629548f3f89bc40004df9f5a","device":"AndroidAPS-DexcomG6","date":1653950662000,"dateString":"2022-05-30T22:44:22.000Z","isValid":true,"sgv":174,"direction":"Flat","type":"sgv","created_at":"2022-05-30T22:45:07.405Z","glucose":174,"avgDelta":"-3.00","BGI":-11.41,"deviation":"8.41","mealCarbs":35},{"_id":"62954a21f89bc40004df9f5d","device":"AndroidAPS-DexcomG6","date":1653950961000,"dateString":"2022-05-30T22:49:21.000Z","isValid":true,"sgv":172,"direction":"Flat","type":"sgv","created_at":"2022-05-30T22:50:09.405Z","glucose":172,"avgDelta":"-2.75","BGI":-10.34,"deviation":"7.59","mealCarbs":35},{"_id":"62954b36f89bc40004df9f60","device":"AndroidAPS-DexcomG6","date":1653951262000,"dateString":"2022-05-30T22:54:22.000Z","isValid":true,"sgv":170,"direction":"Flat","type":"sgv","created_at":"2022-05-30T22:54:46.692Z","glucose":170,"avgDelta":"-2.50","BGI":-9.3,"deviation":"6.80","mealCarbs":35},{"_id":"6295687de4f1e400046e05b4","device":"AndroidAPS-DexcomG6","date":1653958762000,"dateString":"2022-05-31T00:59:22.000Z","isValid":true,"sgv":121,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-31T00:59:41.709Z","glucose":121,"avgDelta":"-14.00","BGI":-0.91,"deviation":"-13.09","mealCarbs":35},{"_id":"629569abe4f1e400046e05b8","device":"AndroidAPS-DexcomG6","date":1653959062000,"dateString":"2022-05-31T01:04:22.000Z","isValid":true,"sgv":117,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-31T01:04:43.046Z","glucose":117,"avgDelta":"-14.25","BGI":-0.95,"deviation":"-13.30","mealCarbs":35},{"_id":"62956adae4f1e400046e05bb","device":"AndroidAPS-DexcomG6","date":1653959362000,"dateString":"2022-05-31T01:09:22.000Z","isValid":true,"sgv":112,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-31T01:09:46.322Z","glucose":112,"avgDelta":"-15.00","BGI":-1,"deviation":"-14.00","mealCarbs":35},{"_id":"62956c07e4f1e400046e05be","device":"AndroidAPS-DexcomG6","date":1653959662000,"dateString":"2022-05-31T01:14:22.000Z","isValid":true,"sgv":108,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-31T01:14:47.990Z","glucose":108,"avgDelta":"-15.50","BGI":-1,"deviation":"-14.50","mealCarbs":35},{"_id":"62956d35e4f1e400046e05c1","device":"AndroidAPS-DexcomG6","date":1653959962000,"dateString":"2022-05-31T01:19:22.000Z","isValid":true,"sgv":105,"direction":"Flat","type":"sgv","created_at":"2022-05-31T01:19:49.260Z","glucose":105,"avgDelta":"-4.00","BGI":-0.91,"deviation":"-3.09","mealCarbs":35},{"_id":"62956e62e4f1e400046e05c3","device":"AndroidAPS-DexcomG6","date":1653960262000,"dateString":"2022-05-31T01:24:22.000Z","isValid":true,"sgv":107,"direction":"Flat","type":"sgv","created_at":"2022-05-31T01:24:50.951Z","glucose":107,"avgDelta":"-2.50","BGI":-0.75,"deviation":"-1.75","mealCarbs":35},{"_id":"62956f90e4f1e400046e05c7","device":"AndroidAPS-DexcomG6","date":1653960561000,"dateString":"2022-05-31T01:29:21.000Z","isValid":true,"sgv":112,"direction":"Flat","type":"sgv","created_at":"2022-05-31T01:29:52.070Z","glucose":112,"avgDelta":"0.00","BGI":-0.54,"deviation":"0.54","mealCarbs":35},{"_id":"629570bb9bc0370004b42b77","device":"AndroidAPS-DexcomG6","date":1653960862000,"dateString":"2022-05-31T01:34:22.000Z","isValid":true,"sgv":116,"direction":"Flat","type":"sgv","created_at":"2022-05-31T01:34:51.145Z","glucose":116,"avgDelta":"2.00","BGI":-0.5,"deviation":"2.50","mealCarbs":35},{"_id":"629571e89bc0370004b42b7a","device":"AndroidAPS-DexcomG6","date":1653961162000,"dateString":"2022-05-31T01:39:22.000Z","isValid":true,"sgv":119,"direction":"Flat","type":"sgv","created_at":"2022-05-31T01:39:52.509Z","glucose":119,"avgDelta":"3.50","BGI":-0.58,"deviation":"4.08","mealCarbs":35},{"_id":"629573159bc0370004b42b7d","device":"AndroidAPS-DexcomG6","date":1653961462000,"dateString":"2022-05-31T01:44:22.000Z","isValid":true,"sgv":117,"direction":"Flat","type":"sgv","created_at":"2022-05-31T01:44:53.650Z","glucose":117,"avgDelta":"2.50","BGI":-0.71,"deviation":"3.21","mealCarbs":35},{"_id":"629574429bc0370004b42b80","device":"AndroidAPS-DexcomG6","date":1653961763000,"dateString":"2022-05-31T01:49:23.000Z","isValid":true,"sgv":112,"direction":"Flat","type":"sgv","created_at":"2022-05-31T01:49:54.739Z","glucose":112,"avgDelta":"0.00","BGI":-0.83,"deviation":"0.83","mealCarbs":35},{"_id":"6295756f9bc0370004b42b83","device":"AndroidAPS-DexcomG6","date":1653962062000,"dateString":"2022-05-31T01:54:22.000Z","isValid":true,"sgv":103,"direction":"Flat","type":"sgv","created_at":"2022-05-31T01:54:55.893Z","glucose":103,"avgDelta":"-3.25","BGI":-0.83,"deviation":"-2.42","mealCarbs":35}],"ISFGlucoseData":[{"_id":"62943b53a743da00044e28e2","device":"AndroidAPS-DexcomG6","date":1653881661000,"dateString":"2022-05-30T03:34:21.000Z","isValid":true,"sgv":131,"direction":"Flat","type":"sgv","created_at":"2022-05-30T03:34:43.850Z","glucose":131,"avgDelta":"1.50","BGI":-1.62,"deviation":"3.12"},{"_id":"62943c81a743da00044e28e5","device":"AndroidAPS-DexcomG6","date":1653881961000,"dateString":"2022-05-30T03:39:21.000Z","isValid":true,"sgv":128,"direction":"Flat","type":"sgv","created_at":"2022-05-30T03:39:45.390Z","glucose":128,"avgDelta":"0.00","BGI":-2.32,"deviation":"2.32"},{"_id":"62943daea743da00044e28e7","device":"AndroidAPS-DexcomG6","date":1653882261000,"dateString":"2022-05-30T03:44:21.000Z","isValid":true,"sgv":126,"direction":"Flat","type":"sgv","created_at":"2022-05-30T03:44:46.579Z","glucose":126,"avgDelta":"-1.25","BGI":-2.78,"deviation":"1.53"},{"_id":"62943edca743da00044e28e9","device":"AndroidAPS-DexcomG6","date":1653882561000,"dateString":"2022-05-30T03:49:21.000Z","isValid":true,"sgv":124,"direction":"Flat","type":"sgv","created_at":"2022-05-30T03:49:48.266Z","glucose":124,"avgDelta":"-1.75","BGI":-3.07,"deviation":"1.32"},{"_id":"6294400aa743da00044e28eb","device":"AndroidAPS-DexcomG6","date":1653882861000,"dateString":"2022-05-30T03:54:21.000Z","isValid":true,"sgv":121,"direction":"Flat","type":"sgv","created_at":"2022-05-30T03:54:50.162Z","glucose":121,"avgDelta":"-2.50","BGI":-3.15,"deviation":"0.65"},{"_id":"6294413fc319020004344fb0","device":"AndroidAPS-DexcomG6","date":1653883161000,"dateString":"2022-05-30T03:59:21.000Z","isValid":true,"sgv":119,"direction":"Flat","type":"sgv","created_at":"2022-05-30T03:59:59.474Z","glucose":119,"avgDelta":"-2.25","BGI":-3.15,"deviation":"0.90"},{"_id":"6294426dc319020004344fb4","device":"AndroidAPS-DexcomG6","date":1653883461000,"dateString":"2022-05-30T04:04:21.000Z","isValid":true,"sgv":116,"direction":"Flat","type":"sgv","created_at":"2022-05-30T04:05:01.284Z","glucose":116,"avgDelta":"-2.50","BGI":-3.07,"deviation":"0.57"},{"_id":"6294439ac319020004344fb7","device":"AndroidAPS-DexcomG6","date":1653883761000,"dateString":"2022-05-30T04:09:21.000Z","isValid":true,"sgv":115,"direction":"Flat","type":"sgv","created_at":"2022-05-30T04:10:02.526Z","glucose":115,"avgDelta":"-2.25","BGI":-2.95,"deviation":"0.70"},{"_id":"629444afc319020004344fba","device":"AndroidAPS-DexcomG6","date":1653884061000,"dateString":"2022-05-30T04:14:21.000Z","isValid":true,"sgv":114,"direction":"Flat","type":"sgv","created_at":"2022-05-30T04:14:39.235Z","glucose":114,"avgDelta":"-1.75","BGI":-2.82,"deviation":"1.07"},{"_id":"629445f6c319020004344fbe","device":"AndroidAPS-DexcomG6","date":1653884361000,"dateString":"2022-05-30T04:19:21.000Z","isValid":true,"sgv":115,"direction":"Flat","type":"sgv","created_at":"2022-05-30T04:20:06.094Z","glucose":115,"avgDelta":"-1.00","BGI":-2.78,"deviation":"1.78"},{"_id":"6294470ac319020004344fc1","device":"AndroidAPS-DexcomG6","date":1653884661000,"dateString":"2022-05-30T04:24:21.000Z","isValid":true,"sgv":114,"direction":"Flat","type":"sgv","created_at":"2022-05-30T04:24:42.523Z","glucose":114,"avgDelta":"-0.50","BGI":-2.82,"deviation":"2.32"},{"_id":"62944846c0f24700048ea5e4","device":"AndroidAPS-DexcomG6","date":1653884961000,"dateString":"2022-05-30T04:29:21.000Z","isValid":true,"sgv":112,"direction":"Flat","type":"sgv","created_at":"2022-05-30T04:29:58.536Z","glucose":112,"avgDelta":"-0.75","BGI":-2.99,"deviation":"2.24"},{"_id":"62944973c0f24700048ea5e7","device":"AndroidAPS-DexcomG6","date":1653885261000,"dateString":"2022-05-30T04:34:21.000Z","isValid":true,"sgv":112,"direction":"Flat","type":"sgv","created_at":"2022-05-30T04:34:59.937Z","glucose":112,"avgDelta":"-0.50","BGI":-3.03,"deviation":"2.53"},{"_id":"62944aa1c0f24700048ea5e9","device":"AndroidAPS-DexcomG6","date":1653885561000,"dateString":"2022-05-30T04:39:21.000Z","isValid":true,"sgv":112,"direction":"Flat","type":"sgv","created_at":"2022-05-30T04:40:01.830Z","glucose":112,"avgDelta":"-0.75","BGI":-2.99,"deviation":"2.24"},{"_id":"62944bb6c0f24700048ea5ee","device":"AndroidAPS-DexcomG6","date":1653885861000,"dateString":"2022-05-30T04:44:21.000Z","isValid":true,"sgv":112,"direction":"Flat","type":"sgv","created_at":"2022-05-30T04:44:38.372Z","glucose":112,"avgDelta":"-0.50","BGI":-3.03,"deviation":"2.53"},{"_id":"62944ce3c0f24700048ea5f1","device":"AndroidAPS-DexcomG6","date":1653886161000,"dateString":"2022-05-30T04:49:21.000Z","isValid":true,"sgv":110,"direction":"Flat","type":"sgv","created_at":"2022-05-30T04:49:39.435Z","glucose":110,"avgDelta":"-0.50","BGI":-3.11,"deviation":"2.61"},{"_id":"62944e11c0f24700048ea5f3","device":"AndroidAPS-DexcomG6","date":1653886461000,"dateString":"2022-05-30T04:54:21.000Z","isValid":true,"sgv":108,"direction":"Flat","type":"sgv","created_at":"2022-05-30T04:54:41.186Z","glucose":108,"avgDelta":"-1.00","BGI":-3.07,"deviation":"2.07"},{"_id":"62944f3fc0f24700048ea5f6","device":"AndroidAPS-DexcomG6","date":1653886761000,"dateString":"2022-05-30T04:59:21.000Z","isValid":true,"sgv":105,"direction":"Flat","type":"sgv","created_at":"2022-05-30T04:59:43.617Z","glucose":105,"avgDelta":"-1.75","BGI":-2.95,"deviation":"1.20"},{"_id":"6294506dc0f24700048ea5f8","device":"AndroidAPS-DexcomG6","date":1653887061000,"dateString":"2022-05-30T05:04:21.000Z","isValid":true,"sgv":102,"direction":"Flat","type":"sgv","created_at":"2022-05-30T05:04:45.582Z","glucose":102,"avgDelta":"-2.50","BGI":-2.82,"deviation":"0.32"},{"_id":"629451ab13be4d00048f99d4","device":"AndroidAPS-DexcomG6","date":1653887361000,"dateString":"2022-05-30T05:09:21.000Z","isValid":true,"sgv":99,"direction":"Flat","type":"sgv","created_at":"2022-05-30T05:10:03.174Z","glucose":99,"avgDelta":"-2.75","BGI":-2.66,"deviation":"-0.09"},{"_id":"629452bf13be4d00048f99d7","device":"AndroidAPS-DexcomG6","date":1653887661000,"dateString":"2022-05-30T05:14:21.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","created_at":"2022-05-30T05:14:39.295Z","glucose":98,"avgDelta":"-2.50","BGI":-2.45,"deviation":"-0.05"},{"_id":"6294540513be4d00048f99d9","device":"AndroidAPS-DexcomG6","date":1653887961000,"dateString":"2022-05-30T05:19:21.000Z","isValid":true,"sgv":99,"direction":"Flat","type":"sgv","created_at":"2022-05-30T05:20:05.981Z","glucose":99,"avgDelta":"-1.50","BGI":-2.2,"deviation":"0.70"},{"_id":"6294551a13be4d00048f99dd","device":"AndroidAPS-DexcomG6","date":1653888261000,"dateString":"2022-05-30T05:24:21.000Z","isValid":true,"sgv":100,"direction":"Flat","type":"sgv","created_at":"2022-05-30T05:24:42.074Z","glucose":100,"avgDelta":"-0.50","BGI":-1.99,"deviation":"1.49"},{"_id":"6294564813be4d00048f99e0","device":"AndroidAPS-DexcomG6","date":1653888561000,"dateString":"2022-05-30T05:29:21.000Z","isValid":true,"sgv":101,"direction":"Flat","type":"sgv","created_at":"2022-05-30T05:29:44.188Z","glucose":101,"avgDelta":"0.50","BGI":-1.99,"deviation":"2.49"},{"_id":"6294577513be4d00048f99e3","device":"AndroidAPS-DexcomG6","date":1653888862000,"dateString":"2022-05-30T05:34:22.000Z","isValid":true,"sgv":99,"direction":"Flat","type":"sgv","created_at":"2022-05-30T05:34:45.547Z","glucose":99,"avgDelta":"0.25","BGI":-1.91,"deviation":"2.16"},{"_id":"629458b0d2cadd0004350d76","device":"AndroidAPS-DexcomG6","date":1653889161000,"dateString":"2022-05-30T05:39:21.000Z","isValid":true,"sgv":98,"direction":"Flat","type":"sgv","created_at":"2022-05-30T05:40:00.401Z","glucose":98,"avgDelta":"-0.25","BGI":-1.83,"deviation":"1.58"},{"_id":"629459ddd2cadd0004350d7a","device":"AndroidAPS-DexcomG6","date":1653889461000,"dateString":"2022-05-30T05:44:21.000Z","isValid":true,"sgv":96,"direction":"Flat","type":"sgv","created_at":"2022-05-30T05:45:01.449Z","glucose":96,"avgDelta":"-1.00","BGI":-1.66,"deviation":"0.66"},{"_id":"62945b0bd2cadd0004350d7d","device":"AndroidAPS-DexcomG6","date":1653889761000,"dateString":"2022-05-30T05:49:21.000Z","isValid":true,"sgv":94,"direction":"Flat","type":"sgv","created_at":"2022-05-30T05:50:03.127Z","glucose":94,"avgDelta":"-1.75","BGI":-1.49,"deviation":"-0.26"},{"_id":"62948d5d76174b0004fbd225","device":"AndroidAPS-DexcomG6","date":1653902661000,"dateString":"2022-05-30T09:24:21.000Z","isValid":true,"sgv":138,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T09:24:45.006Z","glucose":138,"avgDelta":"-9.25","BGI":-6.77,"deviation":"-2.48"},{"_id":"62948ebc76174b0004fbd227","device":"AndroidAPS-DexcomG6","date":1653902961000,"dateString":"2022-05-30T09:29:21.000Z","isValid":true,"sgv":131,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T09:30:36.089Z","glucose":131,"avgDelta":"-8.75","BGI":-5.94,"deviation":"-2.81"},{"_id":"62948fb776174b0004fbd229","device":"AndroidAPS-DexcomG6","date":1653903261000,"dateString":"2022-05-30T09:34:21.000Z","isValid":true,"sgv":125,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T09:34:47.315Z","glucose":125,"avgDelta":"-7.75","BGI":-5.19,"deviation":"-2.56"},{"_id":"629490e476174b0004fbd22b","device":"AndroidAPS-DexcomG6","date":1653903561000,"dateString":"2022-05-30T09:39:21.000Z","isValid":true,"sgv":119,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T09:39:48.475Z","glucose":119,"avgDelta":"-6.75","BGI":-4.44,"deviation":"-2.31"},{"_id":"6294920b5989a90004f0c223","device":"AndroidAPS-DexcomG6","date":1653903861000,"dateString":"2022-05-30T09:44:21.000Z","isValid":true,"sgv":112,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T09:44:43.997Z","glucose":112,"avgDelta":"-6.50","BGI":-3.65,"deviation":"-2.85"},{"_id":"629493395989a90004f0c225","device":"AndroidAPS-DexcomG6","date":1653904161000,"dateString":"2022-05-30T09:49:21.000Z","isValid":true,"sgv":107,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T09:49:45.193Z","glucose":107,"avgDelta":"-6.00","BGI":-2.99,"deviation":"-3.01"},{"_id":"629494665989a90004f0c228","device":"AndroidAPS-DexcomG6","date":1653904461000,"dateString":"2022-05-30T09:54:21.000Z","isValid":true,"sgv":102,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T09:54:46.582Z","glucose":102,"avgDelta":"-5.75","BGI":-2.32,"deviation":"-3.43"},{"_id":"629495ac5989a90004f0c22a","device":"AndroidAPS-DexcomG6","date":1653904761000,"dateString":"2022-05-30T09:59:21.000Z","isValid":true,"sgv":99,"direction":"FortyFiveDown","type":"sgv","created_at":"2022-05-30T10:00:12.873Z","glucose":99,"avgDelta":"-5.00","BGI":-1.66,"deviation":"-3.34"},{"_id":"6294d281dac1e20004fde596","device":"AndroidAPS-DexcomG6","date":1653920361000,"dateString":"2022-05-30T14:19:21.000Z","isValid":true,"sgv":97,"direction":"Flat","type":"sgv","created_at":"2022-05-30T14:19:45.303Z","glucose":97,"avgDelta":"-3.25","BGI":-5.85,"deviation":"2.60"},{"_id":"6294d3aedac1e20004fde598","device":"AndroidAPS-DexcomG6","date":1653920661000,"dateString":"2022-05-30T14:24:21.000Z","isValid":true,"sgv":93,"direction":"Flat","type":"sgv","created_at":"2022-05-30T14:24:46.261Z","glucose":93,"avgDelta":"-3.25","BGI":-4.98,"deviation":"1.73"},{"_id":"6294d4dbdac1e20004fde59a","device":"AndroidAPS-DexcomG6","date":1653920961000,"dateString":"2022-05-30T14:29:21.000Z","isValid":true,"sgv":89,"direction":"Flat","type":"sgv","created_at":"2022-05-30T14:29:47.439Z","glucose":89,"avgDelta":"-3.50","BGI":-4.23,"deviation":"0.73"},{"_id":"6294d6005f047100042886ba","device":"AndroidAPS-DexcomG6","date":1653921261000,"dateString":"2022-05-30T14:34:21.000Z","isValid":true,"sgv":87,"direction":"Flat","type":"sgv","created_at":"2022-05-30T14:34:40.716Z","glucose":87,"avgDelta":"-3.25","BGI":-3.53,"deviation":"0.28"},{"_id":"6294d72e5f047100042886bc","device":"AndroidAPS-DexcomG6","date":1653921561000,"dateString":"2022-05-30T14:39:21.000Z","isValid":true,"sgv":85,"direction":"Flat","type":"sgv","created_at":"2022-05-30T14:39:42.170Z","glucose":85,"avgDelta":"-3.00","BGI":-2.82,"deviation":"-0.18"},{"_id":"6294d85b5f047100042886be","device":"AndroidAPS-DexcomG6","date":1653921862000,"dateString":"2022-05-30T14:44:22.000Z","isValid":true,"sgv":84,"direction":"Flat","type":"sgv","created_at":"2022-05-30T14:44:43.154Z","glucose":84,"avgDelta":"-2.25","BGI":-2.2,"deviation":"-0.05"},{"_id":"6294da065f047100042886c0","device":"AndroidAPS-DexcomG6","date":1653922161000,"dateString":"2022-05-30T14:49:21.000Z","isValid":true,"sgv":82,"direction":"Flat","type":"sgv","created_at":"2022-05-30T14:51:50.006Z","glucose":82,"avgDelta":"-1.75","BGI":-1.62,"deviation":"-0.13"}],"basalGlucoseData":[{"_id":"62942af6ee9e6e00046d7fe8","device":"AndroidAPS-DexcomG6","date":1653877461000,"dateString":"2022-05-30T02:24:21.000Z","isValid":true,"sgv":76,"direction":"Flat","type":"sgv","created_at":"2022-05-30T02:24:54.787Z","glucose":76,"avgDelta":"2.25","BGI":6.52,"deviation":"-4.27"},{"_id":"62942c24ee9e6e00046d7fea","device":"AndroidAPS-DexcomG6","date":1653877761000,"dateString":"2022-05-30T02:29:21.000Z","isValid":true,"sgv":78,"direction":"Flat","type":"sgv","created_at":"2022-05-30T02:29:56.392Z","glucose":78,"avgDelta":"1.75","BGI":6.56,"deviation":"-4.81"},{"_id":"62942d51ee9e6e00046d7fec","device":"AndroidAPS-DexcomG6","date":1653878061000,"dateString":"2022-05-30T02:34:21.000Z","isValid":true,"sgv":82,"direction":"Flat","type":"sgv","created_at":"2022-05-30T02:34:57.498Z","glucose":82,"avgDelta":"2.00","BGI":6.56,"deviation":"-4.56"},{"_id":"62942e7fee9e6e00046d7fef","device":"AndroidAPS-DexcomG6","date":1653878361000,"dateString":"2022-05-30T02:39:21.000Z","isValid":true,"sgv":86,"direction":"Flat","type":"sgv","created_at":"2022-05-30T02:39:59.070Z","glucose":86,"avgDelta":"2.75","BGI":6.56,"deviation":"-3.81"},{"_id":"62942facee9e6e00046d7ff2","device":"AndroidAPS-DexcomG6","date":1653878661000,"dateString":"2022-05-30T02:44:21.000Z","isValid":true,"sgv":91,"direction":"Flat","type":"sgv","created_at":"2022-05-30T02:45:00.369Z","glucose":91,"avgDelta":"3.75","BGI":6.52,"deviation":"-2.77"},{"_id":"629430c1ee9e6e00046d7ff7","device":"AndroidAPS-DexcomG6","date":1653878961000,"dateString":"2022-05-30T02:49:21.000Z","isValid":true,"sgv":96,"direction":"Flat","type":"sgv","created_at":"2022-05-30T02:49:37.117Z","glucose":96,"avgDelta":"4.50","BGI":6.27,"deviation":"-1.77"},{"_id":"629431f9a365640004d83cb9","device":"AndroidAPS-DexcomG6","date":1653879261000,"dateString":"2022-05-30T02:54:21.000Z","isValid":true,"sgv":102,"direction":"Flat","type":"sgv","created_at":"2022-05-30T02:54:49.321Z","glucose":102,"avgDelta":"5.00","BGI":5.77,"deviation":"-0.77"},{"_id":"62943327a365640004d83cbe","device":"AndroidAPS-DexcomG6","date":1653879561000,"dateString":"2022-05-30T02:59:21.000Z","isValid":true,"sgv":108,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T02:59:51.442Z","glucose":108,"avgDelta":"5.50","BGI":5.11,"deviation":"0.39"},{"_id":"62943454a365640004d83cc0","device":"AndroidAPS-DexcomG6","date":1653879861000,"dateString":"2022-05-30T03:04:21.000Z","isValid":true,"sgv":114,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T03:04:52.790Z","glucose":114,"avgDelta":"5.75","BGI":4.23,"deviation":"1.52"},{"_id":"62943582a365640004d83cc3","device":"AndroidAPS-DexcomG6","date":1653880161000,"dateString":"2022-05-30T03:09:21.000Z","isValid":true,"sgv":119,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T03:09:54.494Z","glucose":119,"avgDelta":"5.75","BGI":3.32,"deviation":"2.43"},{"_id":"629436b0a365640004d83cc5","device":"AndroidAPS-DexcomG6","date":1653880461000,"dateString":"2022-05-30T03:14:21.000Z","isValid":true,"sgv":125,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T03:14:56.027Z","glucose":125,"avgDelta":"5.75","BGI":2.41,"deviation":"3.34"},{"_id":"629437dfa365640004d83cc9","device":"AndroidAPS-DexcomG6","date":1653880761000,"dateString":"2022-05-30T03:19:21.000Z","isValid":true,"sgv":128,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T03:19:59.695Z","glucose":128,"avgDelta":"5.00","BGI":1.37,"deviation":"3.63"},{"_id":"629438f8a743da00044e28dc","device":"AndroidAPS-DexcomG6","date":1653881062000,"dateString":"2022-05-30T03:24:22.000Z","isValid":true,"sgv":131,"direction":"Flat","type":"sgv","created_at":"2022-05-30T03:24:40.834Z","glucose":131,"avgDelta":"4.25","BGI":0.17,"deviation":"4.08"},{"_id":"62943a26a743da00044e28de","device":"AndroidAPS-DexcomG6","date":1653881361000,"dateString":"2022-05-30T03:29:21.000Z","isValid":true,"sgv":131,"direction":"Flat","type":"sgv","created_at":"2022-05-30T03:29:42.328Z","glucose":131,"avgDelta":"3.00","BGI":-0.75,"deviation":"3.75"},{"_id":"62945c38d2cadd0004350d80","device":"AndroidAPS-DexcomG6","date":1653890061000,"dateString":"2022-05-30T05:54:21.000Z","isValid":true,"sgv":92,"direction":"Flat","type":"sgv","created_at":"2022-05-30T05:55:04.735Z","glucose":92,"avgDelta":"-1.75","BGI":-1.25,"deviation":"-0.50"},{"_id":"62945d4dd2cadd0004350d83","device":"AndroidAPS-DexcomG6","date":1653890361000,"dateString":"2022-05-30T05:59:21.000Z","isValid":true,"sgv":90,"direction":"Flat","type":"sgv","created_at":"2022-05-30T05:59:41.863Z","glucose":90,"avgDelta":"-2.00","BGI":-1.08,"deviation":"-0.92"},{"_id":"62945e7cd2cadd0004350d86","device":"AndroidAPS-DexcomG6","date":1653890661000,"dateString":"2022-05-30T06:04:21.000Z","isValid":true,"sgv":89,"direction":"Flat","type":"sgv","created_at":"2022-05-30T06:04:44.141Z","glucose":89,"avgDelta":"-1.75","BGI":-0.83,"deviation":"-0.92"},{"_id":"629496c15989a90004f0c22d","device":"AndroidAPS-DexcomG6","date":1653905061000,"dateString":"2022-05-30T10:04:21.000Z","isValid":true,"sgv":94,"direction":"Flat","type":"sgv","created_at":"2022-05-30T10:04:49.010Z","glucose":94,"avgDelta":"-4.50","BGI":-1.12,"deviation":"-3.38"},{"_id":"629497ee5989a90004f0c230","device":"AndroidAPS-DexcomG6","date":1653905362000,"dateString":"2022-05-30T10:09:22.000Z","isValid":true,"sgv":91,"direction":"Flat","type":"sgv","created_at":"2022-05-30T10:09:50.202Z","glucose":91,"avgDelta":"-4.00","BGI":-0.62,"deviation":"-3.38"},{"_id":"6294991b5989a90004f0c233","device":"AndroidAPS-DexcomG6","date":1653905661000,"dateString":"2022-05-30T10:14:21.000Z","isValid":true,"sgv":87,"direction":"Flat","type":"sgv","created_at":"2022-05-30T10:14:51.432Z","glucose":87,"avgDelta":"-3.75","BGI":-0.21,"deviation":"-3.54"},{"_id":"62949a4ac2e464000413b79a","device":"AndroidAPS-DexcomG6","date":1653905961000,"dateString":"2022-05-30T10:19:21.000Z","isValid":true,"sgv":84,"direction":"Flat","type":"sgv","created_at":"2022-05-30T10:19:54.421Z","glucose":84,"avgDelta":"-3.75","BGI":0.17,"deviation":"-3.92"},{"_id":"62949b77c2e464000413b79d","device":"AndroidAPS-DexcomG6","date":1653906262000,"dateString":"2022-05-30T10:24:22.000Z","isValid":true,"sgv":82,"direction":"Flat","type":"sgv","created_at":"2022-05-30T10:24:55.547Z","glucose":82,"avgDelta":"-3.00","BGI":0.46,"deviation":"-3.46"},{"_id":"62949ca4c2e464000413b79f","device":"AndroidAPS-DexcomG6","date":1653906561000,"dateString":"2022-05-30T10:29:21.000Z","isValid":true,"sgv":80,"direction":"Flat","type":"sgv","created_at":"2022-05-30T10:29:56.711Z","glucose":80,"avgDelta":"-2.75","BGI":0.79,"deviation":"-3.54"},{"_id":"62949debc2e464000413b7a1","device":"AndroidAPS-DexcomG6","date":1653906861000,"dateString":"2022-05-30T10:34:21.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","created_at":"2022-05-30T10:35:23.163Z","glucose":79,"avgDelta":"-2.00","BGI":1,"deviation":"-3.00"},{"_id":"62949f00c2e464000413b7a3","device":"AndroidAPS-DexcomG6","date":1653907162000,"dateString":"2022-05-30T10:39:22.000Z","isValid":true,"sgv":78,"direction":"Flat","type":"sgv","created_at":"2022-05-30T10:40:00.055Z","glucose":78,"avgDelta":"-1.50","BGI":1.29,"deviation":"-2.79"},{"_id":"6294db4c5f047100042886c3","device":"AndroidAPS-DexcomG6","date":1653922461000,"dateString":"2022-05-30T14:54:21.000Z","isValid":true,"sgv":81,"direction":"Flat","type":"sgv","created_at":"2022-05-30T14:57:16.389Z","glucose":81,"avgDelta":"-1.50","BGI":-1,"deviation":"-0.50"},{"_id":"6294dcde5f047100042886c5","device":"AndroidAPS-DexcomG6","date":1653922761000,"dateString":"2022-05-30T14:59:21.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","created_at":"2022-05-30T15:03:58.124Z","glucose":79,"avgDelta":"-1.50","BGI":-0.46,"deviation":"-1.04"},{"_id":"6294ddc7706f120004b7d152","device":"AndroidAPS-DexcomG6","date":1653923061000,"dateString":"2022-05-30T15:04:21.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","created_at":"2022-05-30T15:07:51.780Z","glucose":79,"avgDelta":"-1.25","BGI":0.04,"deviation":"-1.29"},{"_id":"6294df40706f120004b7d154","device":"AndroidAPS-DexcomG6","date":1653923361000,"dateString":"2022-05-30T15:09:21.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","created_at":"2022-05-30T15:14:08.395Z","glucose":79,"avgDelta":"-0.75","BGI":0.5,"deviation":"-1.25"},{"_id":"6294dfbd706f120004b7d156","device":"AndroidAPS-DexcomG6","date":1653923662000,"dateString":"2022-05-30T15:14:22.000Z","isValid":true,"sgv":80,"direction":"Flat","type":"sgv","created_at":"2022-05-30T15:16:13.728Z","glucose":80,"avgDelta":"-0.25","BGI":0.95,"deviation":"-1.20"},{"_id":"6294e09f706f120004b7d158","device":"AndroidAPS-DexcomG6","date":1653923961000,"dateString":"2022-05-30T15:19:21.000Z","isValid":true,"sgv":80,"direction":"Flat","type":"sgv","created_at":"2022-05-30T15:19:59.752Z","glucose":80,"avgDelta":"0.25","BGI":1.33,"deviation":"-1.08"},{"_id":"6294e1cd706f120004b7d15a","device":"AndroidAPS-DexcomG6","date":1653924262000,"dateString":"2022-05-30T15:24:22.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","created_at":"2022-05-30T15:25:01.236Z","glucose":79,"avgDelta":"0.00","BGI":1.66,"deviation":"-1.66"},{"_id":"6294e2fa706f120004b7d15c","device":"AndroidAPS-DexcomG6","date":1653924562000,"dateString":"2022-05-30T15:29:22.000Z","isValid":true,"sgv":78,"direction":"Flat","type":"sgv","created_at":"2022-05-30T15:30:02.194Z","glucose":78,"avgDelta":"-0.25","BGI":2.08,"deviation":"-2.33"},{"_id":"6294e427706f120004b7d15f","device":"AndroidAPS-DexcomG6","date":1653924862000,"dateString":"2022-05-30T15:34:22.000Z","isValid":true,"sgv":77,"direction":"Flat","type":"sgv","created_at":"2022-05-30T15:35:03.426Z","glucose":77,"avgDelta":"-0.75","BGI":2.41,"deviation":"-3.16"},{"_id":"6294e554706f120004b7d161","device":"AndroidAPS-DexcomG6","date":1653925162000,"dateString":"2022-05-30T15:39:22.000Z","isValid":true,"sgv":77,"direction":"Flat","type":"sgv","created_at":"2022-05-30T15:40:04.657Z","glucose":77,"avgDelta":"-0.75","BGI":2.7,"deviation":"-3.45"},{"_id":"6294e66eb23f340004e841cf","device":"AndroidAPS-DexcomG6","date":1653925462000,"dateString":"2022-05-30T15:44:22.000Z","isValid":true,"sgv":78,"direction":"Flat","type":"sgv","created_at":"2022-05-30T15:44:46.677Z","glucose":78,"avgDelta":"-0.25","BGI":2.99,"deviation":"-3.24"},{"_id":"6294e79bb23f340004e841d1","device":"AndroidAPS-DexcomG6","date":1653925761000,"dateString":"2022-05-30T15:49:21.000Z","isValid":true,"sgv":79,"direction":"Flat","type":"sgv","created_at":"2022-05-30T15:49:47.886Z","glucose":79,"avgDelta":"0.25","BGI":3.24,"deviation":"-2.99"},{"_id":"6294e8c9b23f340004e841d3","device":"AndroidAPS-DexcomG6","date":1653926062000,"dateString":"2022-05-30T15:54:22.000Z","isValid":true,"sgv":81,"direction":"Flat","type":"sgv","created_at":"2022-05-30T15:54:49.400Z","glucose":81,"avgDelta":"1.00","BGI":3.4,"deviation":"-2.40"},{"_id":"6294ea10b23f340004e841d5","device":"AndroidAPS-DexcomG6","date":1653926362000,"dateString":"2022-05-30T15:59:22.000Z","isValid":true,"sgv":82,"direction":"Flat","type":"sgv","created_at":"2022-05-30T16:00:16.597Z","glucose":82,"avgDelta":"1.25","BGI":3.69,"deviation":"-2.44"},{"_id":"629503cb409703000484d1ba","device":"AndroidAPS-DexcomG6","date":1653932962000,"dateString":"2022-05-30T17:49:22.000Z","isValid":true,"sgv":133,"direction":"Flat","type":"sgv","created_at":"2022-05-30T17:50:03.997Z","glucose":133,"avgDelta":"2.50","BGI":1.87,"deviation":"0.63"},{"_id":"629504e1409703000484d1be","device":"AndroidAPS-DexcomG6","date":1653933262000,"dateString":"2022-05-30T17:54:22.000Z","isValid":true,"sgv":135,"direction":"Flat","type":"sgv","created_at":"2022-05-30T17:54:41.141Z","glucose":135,"avgDelta":"2.50","BGI":1.74,"deviation":"0.76"},{"_id":"6295060f409703000484d1c1","device":"AndroidAPS-DexcomG6","date":1653933562000,"dateString":"2022-05-30T17:59:22.000Z","isValid":true,"sgv":136,"direction":"Flat","type":"sgv","created_at":"2022-05-30T17:59:43.089Z","glucose":136,"avgDelta":"2.25","BGI":1.62,"deviation":"0.63"},{"_id":"6295073d409703000484d1c4","device":"AndroidAPS-DexcomG6","date":1653933862000,"dateString":"2022-05-30T18:04:22.000Z","isValid":true,"sgv":137,"direction":"Flat","type":"sgv","created_at":"2022-05-30T18:04:45.808Z","glucose":137,"avgDelta":"1.75","BGI":1.58,"deviation":"0.17"},{"_id":"6295086b409703000484d1c6","device":"AndroidAPS-DexcomG6","date":1653934162000,"dateString":"2022-05-30T18:09:22.000Z","isValid":true,"sgv":140,"direction":"Flat","type":"sgv","created_at":"2022-05-30T18:09:47.806Z","glucose":140,"avgDelta":"1.75","BGI":1.49,"deviation":"0.26"},{"_id":"6295099a409703000484d1c9","device":"AndroidAPS-DexcomG6","date":1653934461000,"dateString":"2022-05-30T18:14:21.000Z","isValid":true,"sgv":144,"direction":"Flat","type":"sgv","created_at":"2022-05-30T18:14:50.027Z","glucose":144,"avgDelta":"2.25","BGI":1.45,"deviation":"0.80"},{"_id":"62950acb0f8c2e000428308d","device":"AndroidAPS-DexcomG6","date":1653934761000,"dateString":"2022-05-30T18:19:21.000Z","isValid":true,"sgv":147,"direction":"Flat","type":"sgv","created_at":"2022-05-30T18:19:55.662Z","glucose":147,"avgDelta":"2.75","BGI":1.37,"deviation":"1.38"},{"_id":"62950bf90f8c2e0004283091","device":"AndroidAPS-DexcomG6","date":1653935062000,"dateString":"2022-05-30T18:24:22.000Z","isValid":true,"sgv":150,"direction":"Flat","type":"sgv","created_at":"2022-05-30T18:24:57.761Z","glucose":150,"avgDelta":"3.25","BGI":1.16,"deviation":"2.09"},{"_id":"62950d280f8c2e0004283094","device":"AndroidAPS-DexcomG6","date":1653935363000,"dateString":"2022-05-30T18:29:23.000Z","isValid":true,"sgv":156,"direction":"Flat","type":"sgv","created_at":"2022-05-30T18:30:00.224Z","glucose":156,"avgDelta":"4.00","BGI":0.91,"deviation":"3.09"},{"_id":"62950e3d0f8c2e0004283099","device":"AndroidAPS-DexcomG6","date":1653935663000,"dateString":"2022-05-30T18:34:23.000Z","isValid":true,"sgv":164,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T18:34:37.460Z","glucose":164,"avgDelta":"5.00","BGI":0.58,"deviation":"4.42"},{"_id":"62950f6b0f8c2e000428309c","device":"AndroidAPS-DexcomG6","date":1653935962000,"dateString":"2022-05-30T18:39:22.000Z","isValid":true,"sgv":172,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T18:39:39.460Z","glucose":172,"avgDelta":"6.25","BGI":0.12,"deviation":"6.13","uamAbsorption":"start"},{"_id":"629510990f8c2e000428309f","device":"AndroidAPS-DexcomG6","date":1653936262000,"dateString":"2022-05-30T18:44:22.000Z","isValid":true,"sgv":175,"direction":"FortyFiveUp","type":"sgv","created_at":"2022-05-30T18:44:41.570Z","glucose":175,"avgDelta":"6.25","BGI":-1.04,"deviation":"7.29"},{"_id":"629511c70f8c2e00042830a2","device":"AndroidAPS-DexcomG6","date":1653936563000,"dateString":"2022-05-30T18:49:23.000Z","isValid":true,"sgv":177,"direction":"Flat","type":"sgv","created_at":"2022-05-30T18:49:43.497Z","glucose":177,"avgDelta":"5.25","BGI":-2.08,"deviation":"7.33"},{"_id":"629512fcf63c010004ea5cf7","device":"AndroidAPS-DexcomG6","date":1653936863000,"dateString":"2022-05-30T18:54:23.000Z","isValid":true,"sgv":179,"direction":"Flat","type":"sgv","created_at":"2022-05-30T18:54:52.395Z","glucose":179,"avgDelta":"3.75","BGI":-2.86,"deviation":"6.61"},{"_id":"6295142af63c010004ea5cfa","device":"AndroidAPS-DexcomG6","date":1653937162000,"dateString":"2022-05-30T18:59:22.000Z","isValid":true,"sgv":180,"direction":"Flat","type":"sgv","created_at":"2022-05-30T18:59:54.428Z","glucose":180,"avgDelta":"2.00","BGI":-3.45,"deviation":"5.45"},{"_id":"62951558f63c010004ea5cfc","device":"AndroidAPS-DexcomG6","date":1653937462000,"dateString":"2022-05-30T19:04:22.000Z","isValid":true,"sgv":181,"direction":"Flat","type":"sgv","created_at":"2022-05-30T19:04:56.708Z","glucose":181,"avgDelta":"1.50","BGI":-3.78,"deviation":"5.28"},{"_id":"62951683f63c010004ea5cff","device":"AndroidAPS-DexcomG6","date":1653937762000,"dateString":"2022-05-30T19:09:22.000Z","isValid":true,"sgv":181,"direction":"Flat","type":"sgv","created_at":"2022-05-30T19:09:55.010Z","glucose":181,"avgDelta":"1.00","BGI":-4.03,"deviation":"5.03"},{"_id":"629517b0f63c010004ea5d01","device":"AndroidAPS-DexcomG6","date":1653938062000,"dateString":"2022-05-30T19:14:22.000Z","isValid":true,"sgv":182,"direction":"Flat","type":"sgv","created_at":"2022-05-30T19:14:56.712Z","glucose":182,"avgDelta":"0.75","BGI":-4.11,"deviation":"4.86"},{"_id":"629518def63c010004ea5d04","device":"AndroidAPS-DexcomG6","date":1653938362000,"dateString":"2022-05-30T19:19:22.000Z","isValid":true,"sgv":183,"direction":"Flat","type":"sgv","created_at":"2022-05-30T19:19:58.457Z","glucose":183,"avgDelta":"0.75","BGI":-4.11,"deviation":"4.86"},{"_id":"62951a0ef63c010004ea5d08","device":"AndroidAPS-DexcomG6","date":1653938661000,"dateString":"2022-05-30T19:24:21.000Z","isValid":true,"sgv":184,"direction":"Flat","type":"sgv","created_at":"2022-05-30T19:25:02.070Z","glucose":184,"avgDelta":"0.75","BGI":-4.23,"deviation":"4.98"},{"_id":"62951b23f63c010004ea5d0b","device":"AndroidAPS-DexcomG6","date":1653938962000,"dateString":"2022-05-30T19:29:22.000Z","isValid":true,"sgv":185,"direction":"Flat","type":"sgv","created_at":"2022-05-30T19:29:39.093Z","glucose":185,"avgDelta":"1.00","BGI":-4.32,"deviation":"5.32"},{"_id":"62951c51f63c010004ea5d0f","device":"AndroidAPS-DexcomG6","date":1653939262000,"dateString":"2022-05-30T19:34:22.000Z","isValid":true,"sgv":186,"direction":"Flat","type":"sgv","created_at":"2022-05-30T19:34:41.514Z","glucose":186,"avgDelta":"1.00","BGI":-4.48,"deviation":"5.48"},{"_id":"62951d7ff63c010004ea5d12","device":"AndroidAPS-DexcomG6","date":1653939561000,"dateString":"2022-05-30T19:39:21.000Z","isValid":true,"sgv":187,"direction":"Flat","type":"sgv","created_at":"2022-05-30T19:39:43.397Z","glucose":187,"avgDelta":"1.00","BGI":-4.57,"deviation":"5.57"},{"_id":"62951eddf63c010004ea5d16","device":"AndroidAPS-DexcomG6","date":1653939861000,"dateString":"2022-05-30T19:44:21.000Z","isValid":true,"sgv":186,"direction":"Flat","type":"sgv","created_at":"2022-05-30T19:45:33.306Z","glucose":186,"avgDelta":"0.50","BGI":-4.73,"deviation":"5.23"},{"_id":"62951fd8f63c010004ea5d1a","device":"AndroidAPS-DexcomG6","date":1653940161000,"dateString":"2022-05-30T19:49:21.000Z","isValid":true,"sgv":185,"direction":"Flat","type":"sgv","created_at":"2022-05-30T19:49:44.530Z","glucose":185,"avgDelta":"0.00","BGI":-4.9,"deviation":"4.90"},{"_id":"6295211ef63c010004ea5d1c","device":"AndroidAPS-DexcomG6","date":1653940461000,"dateString":"2022-05-30T19:54:21.000Z","isValid":true,"sgv":184,"direction":"Flat","type":"sgv","created_at":"2022-05-30T19:55:10.510Z","glucose":184,"avgDelta":"-0.50","BGI":-4.98,"deviation":"4.48"},{"_id":"62952232f63c010004ea5d1f","device":"AndroidAPS-DexcomG6","date":1653940762000,"dateString":"2022-05-30T19:59:22.000Z","isValid":true,"sgv":183,"direction":"Flat","type":"sgv","created_at":"2022-05-30T19:59:46.536Z","glucose":183,"avgDelta":"-1.00","BGI":-4.94,"deviation":"3.94"},{"_id":"62952379f63c010004ea5d22","device":"AndroidAPS-DexcomG6","date":1653941062000,"dateString":"2022-05-30T20:04:22.000Z","isValid":true,"sgv":182,"direction":"Flat","type":"sgv","created_at":"2022-05-30T20:05:13.099Z","glucose":182,"avgDelta":"-1.00","BGI":-4.77,"deviation":"3.77"},{"_id":"629524a6f63c010004ea5d26","device":"AndroidAPS-DexcomG6","date":1653941361000,"dateString":"2022-05-30T20:09:21.000Z","isValid":true,"sgv":181,"direction":"Flat","type":"sgv","created_at":"2022-05-30T20:10:14.057Z","glucose":181,"avgDelta":"-1.00","BGI":-4.65,"deviation":"3.65"},{"_id":"629525baf63c010004ea5d29","device":"AndroidAPS-DexcomG6","date":1653941662000,"dateString":"2022-05-30T20:14:22.000Z","isValid":true,"sgv":180,"direction":"Flat","type":"sgv","created_at":"2022-05-30T20:14:50.164Z","glucose":180,"avgDelta":"-1.00","BGI":-4.44,"deviation":"3.44"},{"_id":"629526eee3aedd00046f3855","device":"AndroidAPS-DexcomG6","date":1653941961000,"dateString":"2022-05-30T20:19:21.000Z","isValid":true,"sgv":179,"direction":"Flat","type":"sgv","created_at":"2022-05-30T20:19:58.496Z","glucose":179,"avgDelta":"-1.00","BGI":-4.36,"deviation":"3.36"},{"_id":"6295284ee3aedd00046f3858","device":"AndroidAPS-DexcomG6","date":1653942262000,"dateString":"2022-05-30T20:24:22.000Z","isValid":true,"sgv":178,"direction":"Flat","type":"sgv","created_at":"2022-05-30T20:25:50.333Z","glucose":178,"avgDelta":"-1.00","BGI":-4.32,"deviation":"3.32"},{"_id":"62952949e3aedd00046f385c","device":"AndroidAPS-DexcomG6","date":1653942563000,"dateString":"2022-05-30T20:29:23.000Z","isValid":true,"sgv":176,"direction":"Flat","type":"sgv","created_at":"2022-05-30T20:30:01.193Z","glucose":176,"avgDelta":"-1.25","BGI":-4.28,"deviation":"3.03"},{"_id":"62952a5de3aedd00046f385f","device":"AndroidAPS-DexcomG6","date":1653942863000,"dateString":"2022-05-30T20:34:23.000Z","isValid":true,"sgv":175,"direction":"Flat","type":"sgv","created_at":"2022-05-30T20:34:37.302Z","glucose":175,"avgDelta":"-1.25","BGI":-4.28,"deviation":"3.03"},{"_id":"62952b89e3aedd00046f3866","device":"AndroidAPS-DexcomG6","date":1653943162000,"dateString":"2022-05-30T20:39:22.000Z","isValid":true,"sgv":174,"direction":"Flat","type":"sgv","created_at":"2022-05-30T20:39:37.778Z","glucose":174,"avgDelta":"-1.25","BGI":-4.23,"deviation":"2.98"},{"_id":"62952cb7e3aedd00046f386a","device":"AndroidAPS-DexcomG6","date":1653943462000,"dateString":"2022-05-30T20:44:22.000Z","isValid":true,"sgv":173,"direction":"Flat","type":"sgv","created_at":"2022-05-30T20:44:39.868Z","glucose":173,"avgDelta":"-1.25","BGI":-4.19,"deviation":"2.94"},{"_id":"62952de5e3aedd00046f386d","device":"AndroidAPS-DexcomG6","date":1653943762000,"dateString":"2022-05-30T20:49:22.000Z","isValid":true,"sgv":171,"direction":"Flat","type":"sgv","created_at":"2022-05-30T20:49:41.125Z","glucose":171,"avgDelta":"-1.25","BGI":-4.28,"deviation":"3.03"},{"_id":"62952f1be3aedd00046f3871","device":"AndroidAPS-DexcomG6","date":1653944062000,"dateString":"2022-05-30T20:54:22.000Z","isValid":true,"sgv":169,"direction":"Flat","type":"sgv","created_at":"2022-05-30T20:54:51.953Z","glucose":169,"avgDelta":"-1.50","BGI":-4.32,"deviation":"2.82"},{"_id":"62953049e3aedd00046f3874","device":"AndroidAPS-DexcomG6","date":1653944362000,"dateString":"2022-05-30T20:59:22.000Z","isValid":true,"sgv":166,"direction":"Flat","type":"sgv","created_at":"2022-05-30T20:59:53.874Z","glucose":166,"avgDelta":"-2.00","BGI":-4.32,"deviation":"2.32"}]} diff --git a/app/src/test/res/autotune/test4/autotune.2022-06-25-195325.log b/app/src/test/res/autotune/test4/autotune.2022-06-25-195325.log new file mode 100644 index 0000000000..02c7015e02 --- /dev/null +++ b/app/src/test/res/autotune/test4/autotune.2022-06-25-195325.log @@ -0,0 +1,454 @@ +Compressing old json and log files to save space... +gzip: ns-*.json: No such file or directory +gzip: autotune*.json: No such file or directory +Autotune disk usage: +8.0K . +Overall disk used/avail: +Filesystem Size Used Avail Use% Mounted on +rootfs 930G 432G 499G 47% / +Grabbing NIGHTSCOUT treatments.json and entries/sgv.json for date range... +Query: https://xxxxxxxxxxxx.com entries/sgv.json find%5Bdate%5D%5B%24gte%5D=1653444000000&find%5Bdate%5D%5B%24lte%5D=1653530400000&count=1500 +-rw-r--r-- 1 titi titi 82011 Jun 25 19:53 ns-entries.2022-05-25.json +Query: https://xxxxxxxxxxxx.com treatments.json find%5Bcreated_at%5D%5B%24gte%5D=2022-05-24T06:00+02:00&find%5Bcreated_at%5D%5B%24lte%5D=2022-05-26T18:00+02:00 +-rw-r--r-- 1 titi titi 216847 Jun 25 19:53 ns-treatments.2022-05-25.json + +Log information from 2022-05-25 to 2022-05-29 removed for unit test + +Query: https://xxxxxxxxxxxx.com entries/sgv.json find%5Bdate%5D%5B%24gte%5D=1653876000000&find%5Bdate%5D%5B%24lte%5D=1653962400000&count=1500 +-rw-r--r-- 1 titi titi 75423 Jun 25 19:53 ns-entries.2022-05-30.json +Query: https://xxxxxxxxxxxx.com treatments.json find%5Bcreated_at%5D%5B%24gte%5D=2022-05-29T06:00+02:00&find%5Bcreated_at%5D%5B%24lte%5D=2022-05-31T18:00+02:00 +-rw-r--r-- 1 titi titi 229319 Jun 25 19:53 ns-treatments.2022-05-30.json +oref0-autotune-prep ns-treatments.2022-05-30.json profile.json ns-entries.2022-05-30.json profile.pump.json > autotune.2022-05-30.json +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: 6.5 IOB: -1.341 Activity: -0.0157 at 04:24:21 dev: -4.27 avgDelta: 2.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: 6.6 IOB: -1.362 Activity: -0.0158 at 04:29:21 dev: -4.81 avgDelta: 1.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: 6.6 IOB: -1.333 Activity: -0.0158 at 04:34:21 dev: -4.56 avgDelta: 2.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: 6.6 IOB: -1.304 Activity: -0.0158 at 04:39:21 dev: -3.81 avgDelta: 2.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: 6.5 IOB: -1.275 Activity: -0.0157 at 04:44:21 dev: -2.77 avgDelta: 3.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: 6.3 IOB: -0.888 Activity: -0.0151 at 04:49:21 dev: -1.77 avgDelta: 4.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: 5.8 IOB: -0.715 Activity: -0.0139 at 04:54:21 dev: -0.77 avgDelta: 5.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.5 BGI: 5.1 IOB: -0.279 Activity: -0.0123 at 04:59:21 dev: 0.39 avgDelta: 5.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: 4.2 IOB: -0.073 Activity: -0.0102 at 05:04:21 dev: 1.52 avgDelta: 5.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: 3.3 IOB: 0.233 Activity: -0.008 at 05:09:21 dev: 2.43 avgDelta: 5.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: 2.4 IOB: 0.367 Activity: -0.0058 at 05:14:21 dev: 3.34 avgDelta: 5.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: 1.4 IOB: 1.021 Activity: -0.0033 at 05:19:21 dev: 3.63 avgDelta: 5.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: 0.2 IOB: 0.98 Activity: -0.0004 at 05:24:22 dev: 4.08 avgDelta: 4.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -0.8 IOB: 0.926 Activity: 0.0018 at 05:29:21 dev: 3.75 avgDelta: 3.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -1.6 IOB: 1.122 Activity: 0.0039 at 05:34:21 dev: 3.12 avgDelta: 1.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -2.3 IOB: 1.048 Activity: 0.0056 at 05:39:21 dev: 2.32 avgDelta: 0.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -2.8 IOB: 0.917 Activity: 0.0067 at 05:44:21 dev: 1.53 avgDelta: -1.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -3.1 IOB: 0.832 Activity: 0.0074 at 05:49:21 dev: 1.32 avgDelta: -1.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -3.1 IOB: 0.695 Activity: 0.0076 at 05:54:21 dev: 0.65 avgDelta: -2.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -3.1 IOB: 0.606 Activity: 0.0076 at 05:59:21 dev: 0.90 avgDelta: -2.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -3.1 IOB: 0.518 Activity: 0.0074 at 06:04:21 dev: 0.57 avgDelta: -2.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -3.0 IOB: 0.482 Activity: 0.0071 at 06:09:21 dev: 0.70 avgDelta: -2.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -2.8 IOB: 0.447 Activity: 0.0068 at 06:14:21 dev: 1.07 avgDelta: -1.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -2.8 IOB: 0.584 Activity: 0.0067 at 06:19:21 dev: 1.78 avgDelta: -1.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -2.8 IOB: 0.67 Activity: 0.0068 at 06:24:21 dev: 2.32 avgDelta: -0.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -3.0 IOB: 0.685 Activity: 0.0072 at 06:29:21 dev: 2.24 avgDelta: -0.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -3.0 IOB: 0.649 Activity: 0.0073 at 06:34:21 dev: 2.53 avgDelta: -0.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -3.0 IOB: 0.563 Activity: 0.0072 at 06:39:21 dev: 2.24 avgDelta: -0.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -3.0 IOB: 0.737 Activity: 0.0073 at 06:44:21 dev: 2.53 avgDelta: -0.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -3.1 IOB: 0.65 Activity: 0.0075 at 06:49:21 dev: 2.61 avgDelta: -0.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -3.1 IOB: 0.562 Activity: 0.0074 at 06:54:21 dev: 2.07 avgDelta: -1.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: -3.0 IOB: 0.476 Activity: 0.0071 at 06:59:21 dev: 1.20 avgDelta: -1.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -2.8 IOB: 0.441 Activity: 0.0068 at 07:04:21 dev: 0.32 avgDelta: -2.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -2.7 IOB: 0.358 Activity: 0.0064 at 07:09:21 dev: -0.09 avgDelta: -2.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -2.5 IOB: 0.277 Activity: 0.0059 at 07:14:21 dev: -0.05 avgDelta: -2.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -2.2 IOB: 0.199 Activity: 0.0053 at 07:19:21 dev: 0.70 avgDelta: -1.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -2.0 IOB: 0.274 Activity: 0.0048 at 07:24:21 dev: 1.49 avgDelta: -0.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -2.0 IOB: 0.35 Activity: 0.0048 at 07:29:21 dev: 2.49 avgDelta: 0.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -1.9 IOB: 0.327 Activity: 0.0046 at 07:34:22 dev: 2.16 avgDelta: 0.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -1.8 IOB: 0.254 Activity: 0.0044 at 07:39:21 dev: 1.58 avgDelta: -0.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -1.7 IOB: 0.183 Activity: 0.004 at 07:44:21 dev: 0.66 avgDelta: -1.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -1.5 IOB: 0.114 Activity: 0.0036 at 07:49:21 dev: -0.26 avgDelta: -1.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -1.3 IOB: 0.048 Activity: 0.003 at 07:54:21 dev: -0.50 avgDelta: -1.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -1.1 IOB: 0.034 Activity: 0.0026 at 07:59:21 dev: -0.92 avgDelta: -2.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.1 BGI: -0.8 IOB: -0.028 Activity: 0.002 at 08:04:21 dev: -0.92 avgDelta: -1.75 basal +CRInitialIOB: -0.087 CRInitialBG: 92 CRInitialCarbTime: 2022-05-30T06:09:21.000Z +start carb absorption +0 mealCOB: 74.5 mealCarbs: 75 basalBGI: 6.1 BGI: -0.6 IOB: -0.087 Activity: 0.0015 at 08:09:21 dev: 0.12 avgDelta: -0.50 csf +0 mealCOB: 74.0 mealCarbs: 75 basalBGI: 6.1 BGI: -0.4 IOB: -0.093 Activity: 0.001 at 08:14:21 dev: 2.67 avgDelta: 2.25 csf +0 mealCOB: 73.5 mealCarbs: 75 basalBGI: 6.1 BGI: -0.2 IOB: -0.147 Activity: 0.0005 at 08:19:21 dev: 7.21 avgDelta: 7.00 csf +1 mealCOB: 72.1 mealCarbs: 75 basalBGI: 6.1 BGI: -12.7 IOB: 16.05 Activity: 0.0305 at 08:24:21 dev: 24.66 avgDelta: 12.00 csf +1 mealCOB: 69.5 mealCarbs: 75 basalBGI: 6.1 BGI: -25.4 IOB: 15.767 Activity: 0.0611 at 08:29:21 dev: 41.61 avgDelta: 16.25 csf +1 mealCOB: 66.3 mealCarbs: 75 basalBGI: 6.1 BGI: -35.2 IOB: 15.3 Activity: 0.0848 at 08:34:21 dev: 53.20 avgDelta: 18.00 csf +1 mealCOB: 62.7 mealCarbs: 75 basalBGI: 6.1 BGI: -42.7 IOB: 14.779 Activity: 0.1028 at 08:39:21 dev: 59.42 avgDelta: 16.75 csf +1 mealCOB: 59.0 mealCarbs: 75 basalBGI: 6.1 BGI: -48.1 IOB: 14.131 Activity: 0.1158 at 08:44:21 dev: 62.07 avgDelta: 14.00 csf +1 mealCOB: 55.2 mealCarbs: 75 basalBGI: 6.1 BGI: -51.8 IOB: 13.477 Activity: 0.1249 at 08:49:21 dev: 62.09 avgDelta: 10.25 csf +1 mealCOB: 51.5 mealCarbs: 75 basalBGI: 6.1 BGI: -54.2 IOB: 12.739 Activity: 0.1305 at 08:54:21 dev: 61.17 avgDelta: 7.00 csf +1 mealCOB: 47.9 mealCarbs: 75 basalBGI: 6.1 BGI: -55.4 IOB: 12.027 Activity: 0.1335 at 08:59:21 dev: 59.91 avgDelta: 4.50 csf +1 mealCOB: 44.4 mealCarbs: 75 basalBGI: 6.1 BGI: -55.7 IOB: 11.307 Activity: 0.1342 at 09:04:20 dev: 58.20 avgDelta: 2.50 csf +1 mealCOB: 41.0 mealCarbs: 75 basalBGI: 6.1 BGI: -55.3 IOB: 10.538 Activity: 0.1331 at 09:09:22 dev: 56.25 avgDelta: 1.00 csf +1 mealCOB: 37.7 mealCarbs: 75 basalBGI: 6.1 BGI: -54.2 IOB: 9.828 Activity: 0.1306 at 09:14:21 dev: 54.21 avgDelta: 0.00 csf +1 mealCOB: 34.5 mealCarbs: 75 basalBGI: 6.1 BGI: -52.6 IOB: 9.085 Activity: 0.1268 at 09:19:22 dev: 52.38 avgDelta: -0.25 csf +1 mealCOB: 31.4 mealCarbs: 75 basalBGI: 6.1 BGI: -50.8 IOB: 8.411 Activity: 0.1223 at 09:24:21 dev: 51.01 avgDelta: 0.25 csf +1 mealCOB: 28.4 mealCarbs: 75 basalBGI: 6.1 BGI: -48.6 IOB: 7.764 Activity: 0.117 at 09:29:21 dev: 50.06 avgDelta: 1.50 csf +1 mealCOB: 25.4 mealCarbs: 75 basalBGI: 6.1 BGI: -46.2 IOB: 7.193 Activity: 0.1114 at 09:34:21 dev: 49.24 avgDelta: 3.00 csf +1 mealCOB: 22.6 mealCarbs: 75 basalBGI: 6.1 BGI: -43.9 IOB: 6.65 Activity: 0.1057 at 09:39:21 dev: 47.62 avgDelta: 3.75 csf +1 mealCOB: 19.8 mealCarbs: 75 basalBGI: 6.1 BGI: -41.5 IOB: 6.136 Activity: 0.0999 at 09:44:22 dev: 44.97 avgDelta: 3.50 csf +1 mealCOB: 17.3 mealCarbs: 75 basalBGI: 6.1 BGI: -39.1 IOB: 5.651 Activity: 0.0941 at 09:49:21 dev: 41.81 avgDelta: 2.75 csf +1 mealCOB: 15.0 mealCarbs: 75 basalBGI: 6.1 BGI: -36.7 IOB: 5.194 Activity: 0.0884 at 09:54:22 dev: 38.19 avgDelta: 1.50 csf +1 mealCOB: 13.0 mealCarbs: 75 basalBGI: 6.1 BGI: -33.2 IOB: 4.302 Activity: 0.08 at 09:59:21 dev: 33.21 avgDelta: 0.00 csf +1 mealCOB: 11.2 mealCarbs: 75 basalBGI: 6.1 BGI: -30.7 IOB: 3.868 Activity: 0.0739 at 10:04:21 dev: 29.42 avgDelta: -1.25 csf +1 mealCOB: 9.7 mealCarbs: 75 basalBGI: 6.1 BGI: -28.2 IOB: 3.413 Activity: 0.068 at 10:09:21 dev: 25.72 avgDelta: -2.50 csf +1 mealCOB: 8.3 mealCarbs: 75 basalBGI: 6.1 BGI: -25.9 IOB: 3.037 Activity: 0.0623 at 10:14:21 dev: 22.86 avgDelta: -3.00 csf +1 mealCOB: 7.0 mealCarbs: 75 basalBGI: 6.1 BGI: -23.6 IOB: 2.64 Activity: 0.0568 at 10:19:21 dev: 20.83 avgDelta: -2.75 csf +1 mealCOB: 5.8 mealCarbs: 75 basalBGI: 6.1 BGI: -21.4 IOB: 2.319 Activity: 0.0516 at 10:24:22 dev: 19.42 avgDelta: -2.00 csf +1 mealCOB: 4.8 mealCarbs: 75 basalBGI: 6.1 BGI: -19.5 IOB: 2.193 Activity: 0.0469 at 10:29:21 dev: 17.72 avgDelta: -1.75 csf +1 mealCOB: 3.8 mealCarbs: 75 basalBGI: 6.1 BGI: -17.7 IOB: 1.919 Activity: 0.0427 at 10:34:21 dev: 15.72 avgDelta: -2.00 csf +1 mealCOB: 3.0 mealCarbs: 75 basalBGI: 6.1 BGI: -16.0 IOB: 1.666 Activity: 0.0386 at 10:39:21 dev: 13.77 avgDelta: -2.25 csf +1 mealCOB: 2.3 mealCarbs: 75 basalBGI: 6.1 BGI: -14.5 IOB: 1.483 Activity: 0.0349 at 10:44:21 dev: 11.99 avgDelta: -2.50 csf +1 mealCOB: 1.6 mealCarbs: 75 basalBGI: 6.1 BGI: -13.3 IOB: 1.606 Activity: 0.032 at 10:49:21 dev: 11.03 avgDelta: -2.25 csf +1 mealCOB: 1.0 mealCarbs: 75 basalBGI: 6.1 BGI: -12.2 IOB: 1.452 Activity: 0.0294 at 10:54:21 dev: 9.70 avgDelta: -2.50 csf +1 mealCOB: 0.5 mealCarbs: 75 basalBGI: 6.1 BGI: -11.2 IOB: 1.311 Activity: 0.027 at 10:59:21 dev: 7.71 avgDelta: -3.50 csf +1 mealCOB: 0.0 mealCarbs: 75 basalBGI: 6.0 BGI: -10.3 IOB: 1.182 Activity: 0.0248 at 11:04:21 dev: 5.29 avgDelta: -5.00 csf +1 mealCOB: 0.0 mealCarbs: 75 basalBGI: 6.0 BGI: -9.4 IOB: 1.013 Activity: 0.0226 at 11:09:21 dev: 2.63 avgDelta: -6.75 csf +1 mealCOB: 0.0 mealCarbs: 75 basalBGI: 6.0 BGI: -8.5 IOB: 0.856 Activity: 0.0204 at 11:14:21 dev: 0.22 avgDelta: -8.25 csf +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: -7.6 IOB: 0.709 Activity: 0.0183 at 11:19:21 dev: -1.65 avgDelta: -9.25 csf +end carb absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: -6.8 IOB: 0.572 Activity: 0.0163 at 11:24:21 dev: -2.48 avgDelta: -9.25 ISF +CREndIOB: 0.396 CREndBG: 131 CREndTime: 2022-05-30T09:29:21.000Z +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: -5.9 IOB: 0.396 Activity: 0.0143 at 11:29:21 dev: -2.81 avgDelta: -8.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: -5.2 IOB: 0.278 Activity: 0.0125 at 11:34:21 dev: -2.56 avgDelta: -7.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: -4.4 IOB: 0.17 Activity: 0.0107 at 11:39:21 dev: -2.31 avgDelta: -6.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: -3.6 IOB: 0.022 Activity: 0.0088 at 11:44:21 dev: -2.85 avgDelta: -6.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: -3.0 IOB: -0.068 Activity: 0.0072 at 11:49:21 dev: -3.01 avgDelta: -6.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: -2.3 IOB: -0.15 Activity: 0.0056 at 11:54:21 dev: -3.43 avgDelta: -5.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: -1.7 IOB: -0.274 Activity: 0.004 at 11:59:21 dev: -3.34 avgDelta: -5.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: -1.1 IOB: -0.29 Activity: 0.0027 at 12:04:21 dev: -3.38 avgDelta: -4.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: -0.6 IOB: -0.301 Activity: 0.0015 at 12:09:22 dev: -3.38 avgDelta: -4.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: -0.2 IOB: -0.356 Activity: 0.0005 at 12:14:21 dev: -3.54 avgDelta: -3.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: 0.2 IOB: -0.356 Activity: -0.0004 at 12:19:21 dev: -3.92 avgDelta: -3.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: 0.5 IOB: -0.402 Activity: -0.0011 at 12:24:22 dev: -3.46 avgDelta: -3.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: 0.8 IOB: -0.445 Activity: -0.0019 at 12:29:21 dev: -3.54 avgDelta: -2.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: 1.0 IOB: -0.435 Activity: -0.0024 at 12:34:21 dev: -3.00 avgDelta: -2.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 6.0 BGI: 1.3 IOB: -0.47 Activity: -0.0031 at 12:39:22 dev: -2.79 avgDelta: -1.50 basal +CRInitialIOB: -0.454 CRInitialBG: 77 CRInitialCarbTime: 2022-05-30T10:44:21.000Z +start carb absorption +0 mealCOB: 49.5 mealCarbs: 50 basalBGI: 6.0 BGI: 1.4 IOB: -0.454 Activity: -0.0035 at 12:44:21 dev: -2.70 avgDelta: -1.25 csf +0 mealCOB: 49.0 mealCarbs: 50 basalBGI: 6.0 BGI: 1.7 IOB: -0.484 Activity: -0.004 at 12:49:22 dev: -2.66 avgDelta: -1.00 csf +0 mealCOB: 48.5 mealCarbs: 50 basalBGI: 6.0 BGI: 1.8 IOB: -0.464 Activity: -0.0043 at 12:54:22 dev: -2.28 avgDelta: -0.50 csf +0 mealCOB: 48.1 mealCarbs: 50 basalBGI: 6.0 BGI: 1.9 IOB: -0.442 Activity: -0.0045 at 12:59:21 dev: -1.12 avgDelta: 0.75 csf +0 mealCOB: 47.6 mealCarbs: 50 basalBGI: 5.9 BGI: 1.9 IOB: -0.469 Activity: -0.0047 at 13:04:22 dev: 0.80 avgDelta: 2.75 csf +0 mealCOB: 47.1 mealCarbs: 50 basalBGI: 5.9 BGI: 2.0 IOB: -0.445 Activity: -0.0048 at 13:09:22 dev: 4.51 avgDelta: 6.50 csf +0 mealCOB: 46.5 mealCarbs: 50 basalBGI: 5.9 BGI: 1.7 IOB: 0.287 Activity: -0.004 at 13:14:21 dev: 9.59 avgDelta: 11.25 csf +1 mealCOB: 45.6 mealCarbs: 50 basalBGI: 5.9 BGI: 1.0 IOB: 0.453 Activity: -0.0024 at 13:19:21 dev: 15.25 avgDelta: 16.25 csf +1 mealCOB: 44.3 mealCarbs: 50 basalBGI: 5.9 BGI: -0.5 IOB: 1.958 Activity: 0.0011 at 13:24:21 dev: 21.46 avgDelta: 21.00 csf +1 mealCOB: 42.8 mealCarbs: 50 basalBGI: 5.9 BGI: -2.2 IOB: 1.892 Activity: 0.0053 at 13:29:21 dev: 25.45 avgDelta: 23.25 csf +1 mealCOB: 41.1 mealCarbs: 50 basalBGI: 5.9 BGI: -3.9 IOB: 2.367 Activity: 0.0093 at 13:34:22 dev: 27.11 avgDelta: 23.25 csf +1 mealCOB: 39.5 mealCarbs: 50 basalBGI: 5.9 BGI: -5.3 IOB: 2.261 Activity: 0.0127 at 13:39:21 dev: 26.27 avgDelta: 21.00 csf +1 mealCOB: 37.6 mealCarbs: 50 basalBGI: 5.9 BGI: -14.2 IOB: 12.271 Activity: 0.0343 at 13:44:21 dev: 31.24 avgDelta: 17.00 csf +1 mealCOB: 35.5 mealCarbs: 50 basalBGI: 5.9 BGI: -23.0 IOB: 11.995 Activity: 0.0554 at 13:49:21 dev: 35.74 avgDelta: 12.75 csf +1 mealCOB: 33.2 mealCarbs: 50 basalBGI: 5.9 BGI: -29.7 IOB: 11.576 Activity: 0.0716 at 13:54:22 dev: 38.22 avgDelta: 8.50 csf +1 mealCOB: 30.7 mealCarbs: 50 basalBGI: 5.9 BGI: -34.7 IOB: 11.136 Activity: 0.0836 at 13:59:21 dev: 39.95 avgDelta: 5.25 csf +1 mealCOB: 28.3 mealCarbs: 50 basalBGI: 5.9 BGI: -38.3 IOB: 10.645 Activity: 0.0922 at 14:04:21 dev: 41.02 avgDelta: 2.75 csf +1 mealCOB: 25.8 mealCarbs: 50 basalBGI: 5.9 BGI: -40.6 IOB: 10.069 Activity: 0.0979 at 14:09:22 dev: 41.14 avgDelta: 0.50 csf +1 mealCOB: 23.3 mealCarbs: 50 basalBGI: 5.9 BGI: -42.0 IOB: 9.52 Activity: 0.1013 at 14:14:22 dev: 40.30 avgDelta: -1.75 csf +1 mealCOB: 21.0 mealCarbs: 50 basalBGI: 5.9 BGI: -42.7 IOB: 9.009 Activity: 0.1028 at 14:19:22 dev: 37.92 avgDelta: -4.75 csf +1 mealCOB: 18.9 mealCarbs: 50 basalBGI: 5.9 BGI: -42.6 IOB: 8.445 Activity: 0.1027 at 14:24:22 dev: 35.63 avgDelta: -7.00 csf +1 mealCOB: 16.9 mealCarbs: 50 basalBGI: 5.9 BGI: -42.1 IOB: 7.834 Activity: 0.1014 at 14:29:22 dev: 33.34 avgDelta: -8.75 csf +1 mealCOB: 15.0 mealCarbs: 50 basalBGI: 5.9 BGI: -41.1 IOB: 7.283 Activity: 0.099 at 14:34:22 dev: 31.34 avgDelta: -9.75 csf +1 mealCOB: 13.1 mealCarbs: 50 basalBGI: 5.9 BGI: -39.7 IOB: 6.696 Activity: 0.0957 at 14:39:22 dev: 30.47 avgDelta: -9.25 csf +1 mealCOB: 11.4 mealCarbs: 50 basalBGI: 5.9 BGI: -38.2 IOB: 6.176 Activity: 0.092 at 14:44:21 dev: 29.44 avgDelta: -8.75 csf +1 mealCOB: 9.6 mealCarbs: 50 basalBGI: 5.9 BGI: -36.4 IOB: 5.676 Activity: 0.0877 at 14:49:22 dev: 28.65 avgDelta: -7.75 csf +1 mealCOB: 8.0 mealCarbs: 50 basalBGI: 5.9 BGI: -34.4 IOB: 5.152 Activity: 0.0829 at 14:54:22 dev: 27.66 avgDelta: -6.75 csf +1 mealCOB: 6.4 mealCarbs: 50 basalBGI: 5.9 BGI: -32.4 IOB: 4.65 Activity: 0.0781 at 14:59:21 dev: 26.17 avgDelta: -6.25 csf +1 mealCOB: 4.9 mealCarbs: 50 basalBGI: 5.9 BGI: -30.4 IOB: 4.222 Activity: 0.0732 at 15:04:22 dev: 24.38 avgDelta: -6.00 csf +1 mealCOB: 3.5 mealCarbs: 50 basalBGI: 5.9 BGI: -28.3 IOB: 3.769 Activity: 0.0682 at 15:09:22 dev: 22.31 avgDelta: -6.00 csf +1 mealCOB: 2.3 mealCarbs: 50 basalBGI: 5.9 BGI: -26.2 IOB: 3.39 Activity: 0.0632 at 15:14:21 dev: 20.23 avgDelta: -6.00 csf +1 mealCOB: 1.2 mealCarbs: 50 basalBGI: 5.9 BGI: -24.2 IOB: 2.987 Activity: 0.0583 at 15:19:22 dev: 18.45 avgDelta: -5.75 csf +1 mealCOB: 0.2 mealCarbs: 50 basalBGI: 5.9 BGI: -22.2 IOB: 2.657 Activity: 0.0535 at 15:24:22 dev: 16.46 avgDelta: -5.75 csf +1 mealCOB: 0.0 mealCarbs: 50 basalBGI: 5.9 BGI: -20.3 IOB: 2.351 Activity: 0.049 at 15:29:22 dev: 14.84 avgDelta: -5.50 csf +1 mealCOB: 0.0 mealCarbs: 50 basalBGI: 5.9 BGI: -18.5 IOB: 2.018 Activity: 0.0445 at 15:34:22 dev: 12.97 avgDelta: -5.50 csf +1 mealCOB: 0.0 mealCarbs: 50 basalBGI: 5.9 BGI: -16.7 IOB: 1.755 Activity: 0.0403 at 15:39:22 dev: 11.48 avgDelta: -5.25 csf +1 mealCOB: 0.0 mealCarbs: 50 basalBGI: 5.9 BGI: -15.1 IOB: 1.513 Activity: 0.0364 at 15:44:22 dev: 10.11 avgDelta: -5.00 csf +1 mealCOB: 0.0 mealCarbs: 50 basalBGI: 5.9 BGI: -13.5 IOB: 1.241 Activity: 0.0325 at 15:49:21 dev: 8.74 avgDelta: -4.75 csf +1 mealCOB: 0.0 mealCarbs: 50 basalBGI: 5.9 BGI: -12.0 IOB: 1.037 Activity: 0.029 at 15:54:22 dev: 7.79 avgDelta: -4.25 csf +1 mealCOB: 0.0 mealCarbs: 50 basalBGI: 5.9 BGI: -10.6 IOB: 0.851 Activity: 0.0256 at 15:59:21 dev: 6.63 avgDelta: -4.00 csf +1 mealCOB: 0.0 mealCarbs: 50 basalBGI: 5.7 BGI: -9.3 IOB: 0.632 Activity: 0.0223 at 16:04:22 dev: 5.51 avgDelta: -3.75 csf +1 mealCOB: 0.0 mealCarbs: 50 basalBGI: 5.7 BGI: -8.0 IOB: 0.428 Activity: 0.0192 at 16:09:21 dev: 4.47 avgDelta: -3.50 csf +CREndIOB: 0.339 CREndBG: 100 CREndTime: 2022-05-30T14:14:22.000Z +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -6.8 IOB: 0.339 Activity: 0.0165 at 16:14:22 dev: 3.60 avgDelta: -3.25 csf +end carb absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -5.8 IOB: 0.262 Activity: 0.0141 at 16:19:21 dev: 2.60 avgDelta: -3.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -5.0 IOB: 0.197 Activity: 0.012 at 16:24:21 dev: 1.73 avgDelta: -3.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -4.2 IOB: 0.142 Activity: 0.0102 at 16:29:21 dev: 0.73 avgDelta: -3.50 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -3.5 IOB: 0.046 Activity: 0.0085 at 16:34:21 dev: 0.28 avgDelta: -3.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -2.8 IOB: -0.093 Activity: 0.0068 at 16:39:21 dev: -0.18 avgDelta: -3.00 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -2.2 IOB: -0.173 Activity: 0.0053 at 16:44:22 dev: -0.05 avgDelta: -2.25 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -1.6 IOB: -0.246 Activity: 0.0039 at 16:49:21 dev: -0.13 avgDelta: -1.75 ISF +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -1.0 IOB: -0.361 Activity: 0.0024 at 16:54:21 dev: -0.50 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.7 BGI: -0.5 IOB: -0.42 Activity: 0.0011 at 16:59:21 dev: -1.04 avgDelta: -1.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: 0.0 IOB: -0.474 Activity: -0.0001 at 17:04:21 dev: -1.29 avgDelta: -1.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: 0.5 IOB: -0.52 Activity: -0.0012 at 17:09:21 dev: -1.25 avgDelta: -0.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: 0.9 IOB: -0.611 Activity: -0.0023 at 17:14:22 dev: -1.20 avgDelta: -0.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: 1.3 IOB: -0.648 Activity: -0.0032 at 17:19:21 dev: -1.08 avgDelta: 0.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: 1.7 IOB: -0.68 Activity: -0.004 at 17:24:22 dev: -1.66 avgDelta: 0.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: 2.1 IOB: -0.755 Activity: -0.005 at 17:29:22 dev: -2.33 avgDelta: -0.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: 2.4 IOB: -0.778 Activity: -0.0058 at 17:34:22 dev: -3.16 avgDelta: -0.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: 2.7 IOB: -0.798 Activity: -0.0065 at 17:39:22 dev: -3.45 avgDelta: -0.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: 3.0 IOB: -0.863 Activity: -0.0072 at 17:44:22 dev: -3.24 avgDelta: -0.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: 3.2 IOB: -0.877 Activity: -0.0078 at 17:49:21 dev: -2.99 avgDelta: 0.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: 3.4 IOB: -0.887 Activity: -0.0082 at 17:54:22 dev: -2.40 avgDelta: 1.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.4 BGI: 3.7 IOB: -0.942 Activity: -0.0089 at 17:59:22 dev: -2.44 avgDelta: 1.25 basal +CRInitialIOB: -0.947 CRInitialBG: 87 CRInitialCarbTime: 2022-05-30T16:04:22.000Z +start carb absorption +0 mealCOB: 9.5 mealCarbs: 10 basalBGI: 5.4 BGI: 3.9 IOB: -0.947 Activity: -0.0093 at 18:04:22 dev: -1.61 avgDelta: 2.25 csf +0 mealCOB: 9.0 mealCarbs: 10 basalBGI: 5.4 BGI: 4.0 IOB: -0.949 Activity: -0.0097 at 18:09:22 dev: 0.47 avgDelta: 4.50 csf +0 mealCOB: 8.5 mealCarbs: 10 basalBGI: 5.4 BGI: 4.1 IOB: -0.78 Activity: -0.0098 at 18:14:22 dev: 3.43 avgDelta: 7.50 csf +0 mealCOB: 8.1 mealCarbs: 10 basalBGI: 5.4 BGI: 3.9 IOB: -0.682 Activity: -0.0095 at 18:19:22 dev: 6.31 avgDelta: 10.25 csf +0 mealCOB: 7.6 mealCarbs: 10 basalBGI: 5.4 BGI: 3.5 IOB: -0.097 Activity: -0.0084 at 18:24:21 dev: 7.51 avgDelta: 11.00 csf +0 mealCOB: 7.1 mealCarbs: 10 basalBGI: 5.4 BGI: 2.9 IOB: -0.108 Activity: -0.007 at 18:29:21 dev: 6.09 avgDelta: 9.00 csf +0 mealCOB: 6.6 mealCarbs: 10 basalBGI: 5.4 BGI: 2.5 IOB: -0.126 Activity: -0.006 at 18:34:22 dev: 2.76 avgDelta: 5.25 csf +0 mealCOB: 6.1 mealCarbs: 10 basalBGI: 5.4 BGI: 2.2 IOB: -0.198 Activity: -0.0053 at 18:39:21 dev: -0.95 avgDelta: 1.25 csf +0 mealCOB: 5.6 mealCarbs: 10 basalBGI: 5.4 BGI: 1.9 IOB: -0.223 Activity: -0.0047 at 18:44:22 dev: -3.45 avgDelta: -1.50 csf +0 mealCOB: 5.2 mealCarbs: 10 basalBGI: 5.4 BGI: 1.8 IOB: -0.25 Activity: -0.0044 at 18:49:21 dev: -4.33 avgDelta: -2.50 csf +0 mealCOB: 4.7 mealCarbs: 10 basalBGI: 5.4 BGI: 1.8 IOB: -0.328 Activity: -0.0044 at 18:54:22 dev: -4.58 avgDelta: -2.75 csf +0 mealCOB: 4.2 mealCarbs: 10 basalBGI: 5.4 BGI: 1.8 IOB: -0.356 Activity: -0.0043 at 18:59:22 dev: -3.78 avgDelta: -2.00 csf +0 mealCOB: 3.7 mealCarbs: 10 basalBGI: 5.6 BGI: 1.8 IOB: -0.386 Activity: -0.0043 at 19:04:21 dev: -3.03 avgDelta: -1.25 csf +0 mealCOB: 3.2 mealCarbs: 10 basalBGI: 5.6 BGI: 1.9 IOB: -0.463 Activity: -0.0046 at 19:09:22 dev: -2.91 avgDelta: -1.00 csf +0 mealCOB: 2.7 mealCarbs: 10 basalBGI: 5.6 BGI: 1.9 IOB: -0.44 Activity: -0.0047 at 19:14:22 dev: -2.45 avgDelta: -0.50 csf +0 mealCOB: 2.3 mealCarbs: 10 basalBGI: 5.6 BGI: 2.0 IOB: -0.416 Activity: -0.0048 at 19:19:22 dev: -2.24 avgDelta: -0.25 csf +0 mealCOB: 1.8 mealCarbs: 10 basalBGI: 5.6 BGI: 2.0 IOB: -0.392 Activity: -0.0049 at 19:24:22 dev: -1.78 avgDelta: 0.25 csf +0 mealCOB: 1.3 mealCarbs: 10 basalBGI: 5.6 BGI: 2.0 IOB: -0.368 Activity: -0.0048 at 19:29:21 dev: -0.99 avgDelta: 1.00 csf +0 mealCOB: 0.8 mealCarbs: 10 basalBGI: 5.6 BGI: 1.9 IOB: -0.344 Activity: -0.0047 at 19:34:21 dev: -0.45 avgDelta: 1.50 csf +0 mealCOB: 0.3 mealCarbs: 10 basalBGI: 5.6 BGI: 2.0 IOB: -0.37 Activity: -0.0048 at 19:39:22 dev: 0.01 avgDelta: 2.00 csf +CREndIOB: -0.346 CREndBG: 130 CREndTime: 2022-05-30T17:44:22.000Z +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.6 BGI: 1.9 IOB: -0.346 Activity: -0.0047 at 19:44:22 dev: 0.30 avgDelta: 2.25 csf +end carb absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.6 BGI: 1.9 IOB: -0.323 Activity: -0.0045 at 19:49:22 dev: 0.63 avgDelta: 2.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.6 BGI: 1.7 IOB: -0.201 Activity: -0.0042 at 19:54:22 dev: 0.76 avgDelta: 2.50 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.6 BGI: 1.6 IOB: -0.18 Activity: -0.0039 at 19:59:22 dev: 0.63 avgDelta: 2.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: 1.6 IOB: -0.261 Activity: -0.0038 at 20:04:22 dev: 0.17 avgDelta: 1.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: 1.5 IOB: -0.242 Activity: -0.0036 at 20:09:22 dev: 0.26 avgDelta: 1.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: 1.4 IOB: -0.225 Activity: -0.0035 at 20:14:21 dev: 0.80 avgDelta: 2.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: 1.4 IOB: -0.208 Activity: -0.0033 at 20:19:21 dev: 1.38 avgDelta: 2.75 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: 1.2 IOB: 0.048 Activity: -0.0028 at 20:24:22 dev: 2.09 avgDelta: 3.25 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: 0.9 IOB: 0.01 Activity: -0.0022 at 20:29:23 dev: 3.09 avgDelta: 4.00 basal +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: 0.6 IOB: 0.269 Activity: -0.0014 at 20:34:23 dev: 4.42 avgDelta: 5.00 basal +start uannnounced meal absorption +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: 0.1 IOB: 0.474 Activity: -0.0003 at 20:39:22 dev: 6.13 avgDelta: 6.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -1.0 IOB: 1.379 Activity: 0.0025 at 20:44:22 dev: 7.29 avgDelta: 6.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -2.1 IOB: 1.31 Activity: 0.005 at 20:49:23 dev: 7.33 avgDelta: 5.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -2.9 IOB: 1.229 Activity: 0.0069 at 20:54:23 dev: 6.61 avgDelta: 3.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -3.5 IOB: 1.141 Activity: 0.0083 at 20:59:22 dev: 5.45 avgDelta: 2.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -3.8 IOB: 1.048 Activity: 0.0091 at 21:04:22 dev: 5.28 avgDelta: 1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.0 IOB: 1 Activity: 0.0097 at 21:09:22 dev: 5.03 avgDelta: 1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.1 IOB: 0.902 Activity: 0.0099 at 21:14:22 dev: 4.86 avgDelta: 0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.1 IOB: 0.803 Activity: 0.0099 at 21:19:22 dev: 4.86 avgDelta: 0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.2 IOB: 1.047 Activity: 0.0102 at 21:24:21 dev: 4.98 avgDelta: 0.75 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.3 IOB: 0.941 Activity: 0.0104 at 21:29:22 dev: 5.32 avgDelta: 1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.5 IOB: 1.078 Activity: 0.0108 at 21:34:22 dev: 5.48 avgDelta: 1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.6 IOB: 0.978 Activity: 0.011 at 21:39:21 dev: 5.57 avgDelta: 1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.7 IOB: 1.112 Activity: 0.0114 at 21:44:21 dev: 5.23 avgDelta: 0.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.9 IOB: 1.144 Activity: 0.0118 at 21:49:21 dev: 4.90 avgDelta: 0.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -5.0 IOB: 1.034 Activity: 0.012 at 21:54:21 dev: 4.48 avgDelta: -0.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.9 IOB: 0.921 Activity: 0.0119 at 21:59:22 dev: 3.94 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.8 IOB: 0.812 Activity: 0.0115 at 22:04:22 dev: 3.77 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.7 IOB: 0.809 Activity: 0.0112 at 22:09:21 dev: 3.65 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.4 IOB: 0.701 Activity: 0.0107 at 22:14:22 dev: 3.44 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.4 IOB: 0.881 Activity: 0.0105 at 22:19:21 dev: 3.36 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.3 IOB: 0.776 Activity: 0.0104 at 22:24:22 dev: 3.32 avgDelta: -1.00 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.3 IOB: 0.935 Activity: 0.0103 at 22:29:23 dev: 3.03 avgDelta: -1.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.3 IOB: 0.833 Activity: 0.0103 at 22:34:23 dev: 3.03 avgDelta: -1.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.2 IOB: 0.782 Activity: 0.0102 at 22:39:22 dev: 2.98 avgDelta: -1.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.2 IOB: 1.001 Activity: 0.0101 at 22:44:22 dev: 2.94 avgDelta: -1.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.3 IOB: 0.9 Activity: 0.0103 at 22:49:22 dev: 3.03 avgDelta: -1.25 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.3 IOB: 0.919 Activity: 0.0104 at 22:54:22 dev: 2.82 avgDelta: -1.50 uam +0 mealCOB: 0.0 mealCarbs: 0 basalBGI: 5.9 BGI: -4.3 IOB: 0.816 Activity: 0.0104 at 22:59:22 dev: 2.32 avgDelta: -2.00 uam +CRInitialIOB: 6.729 CRInitialBG: 163 CRInitialCarbTime: 2022-05-30T21:04:22.000Z +start carb absorption +1 mealCOB: 34.5 mealCarbs: 35 basalBGI: 5.8 BGI: -6.6 IOB: 6.729 Activity: 0.016 at 23:04:22 dev: 4.14 avgDelta: -2.50 csf +1 mealCOB: 34.0 mealCarbs: 35 basalBGI: 5.8 BGI: -11.7 IOB: 6.567 Activity: 0.0282 at 23:09:22 dev: 9.20 avgDelta: -2.50 csf +1 mealCOB: 33.1 mealCarbs: 35 basalBGI: 5.8 BGI: -15.5 IOB: 6.302 Activity: 0.0374 at 23:14:23 dev: 13.77 avgDelta: -1.75 csf +1 mealCOB: 32.0 mealCarbs: 35 basalBGI: 5.8 BGI: -18.4 IOB: 6.047 Activity: 0.0443 at 23:19:22 dev: 18.64 avgDelta: 0.25 csf +1 mealCOB: 30.6 mealCarbs: 35 basalBGI: 5.8 BGI: -20.5 IOB: 5.862 Activity: 0.0494 at 23:24:23 dev: 23.75 avgDelta: 3.25 csf +1 mealCOB: 28.8 mealCarbs: 35 basalBGI: 5.8 BGI: -21.9 IOB: 5.506 Activity: 0.0527 at 23:29:22 dev: 28.37 avgDelta: 6.50 csf +1 mealCOB: 27.0 mealCarbs: 35 basalBGI: 5.8 BGI: -22.8 IOB: 5.346 Activity: 0.055 at 23:34:22 dev: 30.33 avgDelta: 7.50 csf +1 mealCOB: 25.3 mealCarbs: 35 basalBGI: 5.8 BGI: -23.4 IOB: 5.017 Activity: 0.0563 at 23:39:22 dev: 28.62 avgDelta: 5.25 csf +1 mealCOB: 23.8 mealCarbs: 35 basalBGI: 5.8 BGI: -23.3 IOB: 4.636 Activity: 0.0562 at 23:44:22 dev: 24.58 avgDelta: 1.25 csf +1 mealCOB: 22.6 mealCarbs: 35 basalBGI: 5.8 BGI: -23.1 IOB: 4.307 Activity: 0.0556 at 23:49:21 dev: 20.58 avgDelta: -2.50 csf +1 mealCOB: 21.4 mealCarbs: 35 basalBGI: 5.8 BGI: -22.5 IOB: 3.932 Activity: 0.0542 at 23:54:22 dev: 18.75 avgDelta: -3.75 csf +1 mealCOB: 20.2 mealCarbs: 35 basalBGI: 5.8 BGI: -21.7 IOB: 3.616 Activity: 0.0523 at 23:59:22 dev: 19.96 avgDelta: -1.75 csf +1 mealCOB: 18.9 mealCarbs: 35 basalBGI: 6.8 BGI: -20.8 IOB: 3.309 Activity: 0.0501 at 00:04:22 dev: 21.80 avgDelta: 1.00 csf +1 mealCOB: 17.5 mealCarbs: 35 basalBGI: 6.8 BGI: -19.7 IOB: 2.965 Activity: 0.0475 at 00:09:22 dev: 22.47 avgDelta: 2.75 csf +1 mealCOB: 16.2 mealCarbs: 35 basalBGI: 6.8 BGI: -18.6 IOB: 2.735 Activity: 0.0449 at 00:14:21 dev: 21.64 avgDelta: 3.00 csf +1 mealCOB: 15.1 mealCarbs: 35 basalBGI: 6.8 BGI: -17.5 IOB: 2.467 Activity: 0.0421 at 00:19:22 dev: 19.22 avgDelta: 1.75 csf +1 mealCOB: 14.1 mealCarbs: 35 basalBGI: 6.8 BGI: -16.3 IOB: 2.163 Activity: 0.0392 at 00:24:22 dev: 16.52 avgDelta: 0.25 csf +1 mealCOB: 13.2 mealCarbs: 35 basalBGI: 6.8 BGI: -15.0 IOB: 1.875 Activity: 0.0362 at 00:29:22 dev: 13.78 avgDelta: -1.25 csf +1 mealCOB: 12.5 mealCarbs: 35 basalBGI: 6.8 BGI: -13.8 IOB: 1.65 Activity: 0.0333 at 00:34:22 dev: 11.57 avgDelta: -2.25 csf +1 mealCOB: 11.9 mealCarbs: 35 basalBGI: 6.8 BGI: -12.6 IOB: 1.443 Activity: 0.0303 at 00:39:22 dev: 9.83 avgDelta: -2.75 csf +1 mealCOB: 11.4 mealCarbs: 35 basalBGI: 6.8 BGI: -11.4 IOB: 1.248 Activity: 0.0275 at 00:44:22 dev: 8.41 avgDelta: -3.00 csf +1 mealCOB: 10.9 mealCarbs: 35 basalBGI: 6.8 BGI: -10.3 IOB: 1.067 Activity: 0.0249 at 00:49:21 dev: 7.59 avgDelta: -2.75 csf +1 mealCOB: 10.5 mealCarbs: 35 basalBGI: 6.8 BGI: -9.3 IOB: 0.899 Activity: 0.0224 at 00:54:22 dev: 6.80 avgDelta: -2.50 csf +0 mealCOB: 10.0 mealCarbs: 35 basalBGI: 6.9 BGI: -0.9 IOB: 0.081 Activity: 0.0022 at 02:59:22 dev: -13.09 avgDelta: -14.00 csf +0 mealCOB: 9.5 mealCarbs: 35 basalBGI: 7.8 BGI: -0.9 IOB: 0.3 Activity: 0.0023 at 03:04:22 dev: -13.30 avgDelta: -14.25 csf +0 mealCOB: 9.0 mealCarbs: 35 basalBGI: 7.8 BGI: -1.0 IOB: 0.238 Activity: 0.0024 at 03:09:22 dev: -14.00 avgDelta: -15.00 csf +0 mealCOB: 8.5 mealCarbs: 35 basalBGI: 7.8 BGI: -1.0 IOB: 0.176 Activity: 0.0024 at 03:14:22 dev: -14.50 avgDelta: -15.50 csf +0 mealCOB: 8.0 mealCarbs: 35 basalBGI: 7.8 BGI: -0.9 IOB: 0.064 Activity: 0.0022 at 03:19:22 dev: -3.09 avgDelta: -4.00 csf +0 mealCOB: 7.6 mealCarbs: 35 basalBGI: 7.8 BGI: -0.8 IOB: -0.046 Activity: 0.0018 at 03:24:22 dev: -1.75 avgDelta: -2.50 csf +0 mealCOB: 7.1 mealCarbs: 35 basalBGI: 7.8 BGI: -0.5 IOB: -0.104 Activity: 0.0013 at 03:29:21 dev: 0.54 avgDelta: 0.00 csf +0 mealCOB: 6.6 mealCarbs: 35 basalBGI: 7.8 BGI: -0.5 IOB: 0.16 Activity: 0.0012 at 03:34:22 dev: 2.50 avgDelta: 2.00 csf +0 mealCOB: 6.1 mealCarbs: 35 basalBGI: 7.8 BGI: -0.6 IOB: 0.254 Activity: 0.0014 at 03:39:22 dev: 4.08 avgDelta: 3.50 csf +0 mealCOB: 5.6 mealCarbs: 35 basalBGI: 7.8 BGI: -0.7 IOB: 0.246 Activity: 0.0017 at 03:44:22 dev: 3.21 avgDelta: 2.50 csf +0 mealCOB: 5.1 mealCarbs: 35 basalBGI: 7.8 BGI: -0.8 IOB: 0.236 Activity: 0.002 at 03:49:23 dev: 0.83 avgDelta: 0.00 csf +CREndIOB: 0.177 CREndBG: 103 CREndTime: 2022-05-31T01:54:22.000Z +Ignoring 290 m CR period. +0 mealCOB: 4.6 mealCarbs: 35 basalBGI: 7.8 BGI: -0.8 IOB: 0.177 Activity: 0.002 at 03:54:22 dev: -2.42 avgDelta: -3.25 csf +Found at least 1h of carb absorption: assuming all meals were announced, and categorizing UAM data as basal. +oref0-autotune-core autotune.2022-05-30.json profile.json profile.pump.json > newprofile.2022-05-30.json +CRTotalCarbs: 125 CRTotalInsulin: 25.516 totalCR: 4.899 +Hour 0 total deviations: 0 mg/dL +Hour 0 basal adjustment needed: 0 U/hr +Hour 1 total deviations: 0 mg/dL +Hour 1 basal adjustment needed: 0 U/hr +Hour 2 total deviations: 0 mg/dL +Hour 2 basal adjustment needed: 0 U/hr +Hour 3 total deviations: 0 mg/dL +Hour 3 basal adjustment needed: 0 U/hr +Hour 4 total deviations: -22.37 mg/dL +Hour 4 basal adjustment needed: -0.05 U/hr +Hour 5 total deviations: 18.75 mg/dL +Hour 5 basal adjustment needed: 0.05 U/hr +Hour 6 total deviations: 0 mg/dL +Hour 6 basal adjustment needed: 0 U/hr +Hour 7 total deviations: -1.42 mg/dL +Hour 7 basal adjustment needed: 0 U/hr +Hour 8 total deviations: -0.92 mg/dL +Hour 8 basal adjustment needed: 0 U/hr +Hour 9 total deviations: 0 mg/dL +Hour 9 basal adjustment needed: 0 U/hr +Hour 10 total deviations: 0 mg/dL +Hour 10 basal adjustment needed: 0 U/hr +Hour 11 total deviations: 0 mg/dL +Hour 11 basal adjustment needed: 0 U/hr +Hour 12 total deviations: -27.01 mg/dL +Hour 12 basal adjustment needed: -0.07 U/hr +Hour 13 total deviations: 0 mg/dL +Hour 13 basal adjustment needed: 0 U/hr +Hour 14 total deviations: 0 mg/dL +Hour 14 basal adjustment needed: 0 U/hr +Hour 15 total deviations: 0 mg/dL +Hour 15 basal adjustment needed: 0 U/hr +Hour 16 total deviations: -1.54 mg/dL +Hour 16 basal adjustment needed: 0 U/hr +Hour 17 total deviations: -26.49 mg/dL +Hour 17 basal adjustment needed: -0.06 U/hr +Hour 18 total deviations: 0 mg/dL +Hour 18 basal adjustment needed: 0 U/hr +Hour 19 total deviations: 2.02 mg/dL +Hour 19 basal adjustment needed: 0 U/hr +Hour 20 total deviations: 45.02 mg/dL +Hour 20 basal adjustment needed: 0.11 U/hr +Hour 21 total deviations: 59.93 mg/dL +Hour 21 basal adjustment needed: 0.14 U/hr +Hour 22 total deviations: 37.69 mg/dL +Hour 22 basal adjustment needed: 0.09 U/hr +Hour 23 total deviations: 0 mg/dL +Hour 23 basal adjustment needed: 0 U/hr +Limiting hour 18 basal to 0.84 (which is 1.3 * pump basal of 0.648 ) +Adjusting hour 0 basal from 0.977 to 0.979 based on hour 0 = 0.979 and hour 1 = 0.995 +Adjusting hour 5 basal from 0.877 to 0.883 based on hour 4 = 0.954 and hour 9 = 0.855 +Adjusting hour 6 basal from 0.779 to 0.804 based on hour 4 = 0.954 and hour 9 = 0.855 +Adjusting hour 7 basal from 0.827 to 0.843 based on hour 4 = 0.954 and hour 9 = 0.855 +Adjusting hour 8 basal from 0.882 to 0.887 based on hour 4 = 0.954 and hour 9 = 0.855 +Adjusting hour 12 basal from 0.86 to 0.856 based on hour 11 = 0.844 and hour 14 = 0.835 +Adjusting hour 13 basal from 0.858 to 0.854 based on hour 11 = 0.844 and hour 14 = 0.835 +Adjusting hour 22 basal from 0.849 to 0.851 based on hour 21 = 0.879 and hour 23 = 0.843 +Adjusting hour 23 basal from 0.843 to 0.847 based on hour 21 = 0.879 and hour 23 = 0.847 +[ { i: 0, minutes: 0, rate: 0.979, start: '00:00:00', untuned: 5 }, + { i: 1, minutes: 60, rate: 0.995, start: '01:00:00', untuned: 1 }, + { i: 2, minutes: 120, rate: 0.997, start: '02:00:00' }, + { i: 3, minutes: 180, rate: 1.129, start: '03:00:00' }, + { i: 4, minutes: 240, rate: 0.954, start: '04:00:00' }, + { i: 5, minutes: 300, rate: 0.883, start: '05:00:00', untuned: 1 }, + { i: 6, minutes: 360, rate: 0.804, start: '06:00:00', untuned: 1 }, + { i: 7, minutes: 420, rate: 0.843, start: '07:00:00', untuned: 2 }, + { i: 8, minutes: 480, rate: 0.887, start: '08:00:00', untuned: 2 }, + { i: 9, minutes: 540, rate: 0.855, start: '09:00:00', untuned: 5 }, + { i: 10, minutes: 600, rate: 0.856, start: '10:00:00', untuned: 5 }, + { i: 11, minutes: 660, rate: 0.844, start: '11:00:00', untuned: 5 }, + { i: 12, minutes: 720, rate: 0.856, start: '12:00:00', untuned: 6 }, + { i: 13, minutes: 780, rate: 0.854, start: '13:00:00', untuned: 6 }, + { i: 14, minutes: 840, rate: 0.835, start: '14:00:00', untuned: 5 }, + { i: 15, minutes: 900, rate: 0.83, start: '15:00:00', untuned: 5 }, + { i: 16, minutes: 960, rate: 0.801, start: '16:00:00', untuned: 5 }, + { i: 17, + minutes: 1020, + rate: 0.821, + start: '17:00:00', + untuned: 5 }, + { i: 18, + minutes: 1080, + rate: 0.842, + start: '18:00:00', + untuned: 4 }, + { i: 19, + minutes: 1140, + rate: 0.929, + start: '19:00:00', + untuned: 4 }, + { i: 20, + minutes: 1200, + rate: 0.931, + start: '20:00:00', + untuned: 3 }, + { i: 21, + minutes: 1260, + rate: 0.879, + start: '21:00:00', + untuned: 4 }, + { i: 22, + minutes: 1320, + rate: 0.851, + start: '22:00:00', + untuned: 5 }, + { i: 23, + minutes: 1380, + rate: 0.847, + start: '23:00:00', + untuned: 5 } ] +totalMealCarbs: 135 totalDeviations: 2117.06 oldCSF 16.533 fullNewCSF: 15.68 newCSF: 16.363 +oldCR: 5.021 fullNewCR: 4.899 newCR: 4.997 +Limiting adjusted ISF of 57.94 to 66.31 (which is pump ISF of 86.2 / 1.3 ) +p50deviation: 0.815 p50BGI -2.885 p50ratios: 0.698 Old ISF: 83.014 fullNewISF: 57.944 adjustedISF: 66.308 newISF: 79.673 newDIA: 6 newPeak: 45 + +Autotune pump profile recommendations: +--------------------------------------------------------- +Recommendations Log File: /home/titi/aaps/autotune/autotune_recommendations.log + +Parameter | Pump | Autotune | Days Missing +--------------------------------------------------------- +ISF [mg/dL/U] | 86.200 | 79.673 | +Carb Ratio[g/U]| 5.750 | 4.997 | + 00:00 | 0.966 | 0.979 | 5 + 01:00 | 0.977 | 0.995 | 1 + 02:00 | 0.971 | 0.997 | 0 + 03:00 | 1.111 | 1.129 | 0 + 04:00 | 0.974 | 0.954 | 0 + 05:00 | 0.923 | 0.883 | 1 + 06:00 | 0.823 | 0.804 | 1 + 07:00 | 0.855 | 0.843 | 2 + 08:00 | 0.902 | 0.887 | 2 + 09:00 | 0.934 | 0.855 | 5 + 10:00 | 0.938 | 0.856 | 5 + 11:00 | 0.903 | 0.844 | 5 + 12:00 | 0.882 | 0.856 | 6 + 13:00 | 0.874 | 0.854 | 6 + 14:00 | 0.866 | 0.835 | 5 + 15:00 | 0.848 | 0.830 | 5 + 16:00 | 0.758 | 0.801 | 5 + 17:00 | 0.650 | 0.821 | 5 + 18:00 | 0.648 | 0.842 | 4 + 19:00 | 0.738 | 0.929 | 4 + 20:00 | 0.847 | 0.931 | 3 + 21:00 | 0.861 | 0.879 | 4 + 22:00 | 0.863 | 0.851 | 5 + 23:00 | 0.843 | 0.847 | 5 +Query: https://xxxxxxxxxxxx.com entries/sgv.json find%5Bdate%5D%5B%24gte%5D=1653962400000&find%5Bdate%5D%5B%24lte%5D=1654048800000&count=1500 +-rw-r--r-- 1 titi titi 82239 Jun 25 19:54 ns-entries.2022-05-31.json +Query: https://xxxxxxxxxxxx.com treatments.json find%5Bcreated_at%5D%5B%24gte%5D=2022-05-30T06:00+02:00&find%5Bcreated_at%5D%5B%24lte%5D=2022-06-01T18:00+02:00 +-rw-r--r-- 1 titi titi 231419 Jun 25 19:54 ns-treatments.2022-05-31.json + + +Log information after 2022-05-30 removed for unit test \ No newline at end of file diff --git a/app/src/test/res/autotune/test4/newprofile.2022-05-30.json b/app/src/test/res/autotune/test4/newprofile.2022-05-30.json new file mode 100644 index 0000000000..d2e0e6a17c --- /dev/null +++ b/app/src/test/res/autotune/test4/newprofile.2022-05-30.json @@ -0,0 +1,194 @@ +{ + "autosens_max": 1.3, + "autosens_min": 0.7, + "basalprofile": [ + { + "i": 0, + "minutes": 0, + "rate": 0.979, + "start": "00:00:00", + "untuned": 5 + }, + { + "i": 1, + "minutes": 60, + "rate": 0.995, + "start": "01:00:00", + "untuned": 1 + }, + { + "i": 2, + "minutes": 120, + "rate": 0.997, + "start": "02:00:00" + }, + { + "i": 3, + "minutes": 180, + "rate": 1.129, + "start": "03:00:00" + }, + { + "i": 4, + "minutes": 240, + "rate": 0.954, + "start": "04:00:00" + }, + { + "i": 5, + "minutes": 300, + "rate": 0.883, + "start": "05:00:00", + "untuned": 1 + }, + { + "i": 6, + "minutes": 360, + "rate": 0.804, + "start": "06:00:00", + "untuned": 1 + }, + { + "i": 7, + "minutes": 420, + "rate": 0.843, + "start": "07:00:00", + "untuned": 2 + }, + { + "i": 8, + "minutes": 480, + "rate": 0.887, + "start": "08:00:00", + "untuned": 2 + }, + { + "i": 9, + "minutes": 540, + "rate": 0.855, + "start": "09:00:00", + "untuned": 5 + }, + { + "i": 10, + "minutes": 600, + "rate": 0.856, + "start": "10:00:00", + "untuned": 5 + }, + { + "i": 11, + "minutes": 660, + "rate": 0.844, + "start": "11:00:00", + "untuned": 5 + }, + { + "i": 12, + "minutes": 720, + "rate": 0.856, + "start": "12:00:00", + "untuned": 6 + }, + { + "i": 13, + "minutes": 780, + "rate": 0.854, + "start": "13:00:00", + "untuned": 6 + }, + { + "i": 14, + "minutes": 840, + "rate": 0.835, + "start": "14:00:00", + "untuned": 5 + }, + { + "i": 15, + "minutes": 900, + "rate": 0.83, + "start": "15:00:00", + "untuned": 5 + }, + { + "i": 16, + "minutes": 960, + "rate": 0.801, + "start": "16:00:00", + "untuned": 5 + }, + { + "i": 17, + "minutes": 1020, + "rate": 0.821, + "start": "17:00:00", + "untuned": 5 + }, + { + "i": 18, + "minutes": 1080, + "rate": 0.842, + "start": "18:00:00", + "untuned": 4 + }, + { + "i": 19, + "minutes": 1140, + "rate": 0.929, + "start": "19:00:00", + "untuned": 4 + }, + { + "i": 20, + "minutes": 1200, + "rate": 0.931, + "start": "20:00:00", + "untuned": 3 + }, + { + "i": 21, + "minutes": 1260, + "rate": 0.879, + "start": "21:00:00", + "untuned": 4 + }, + { + "i": 22, + "minutes": 1320, + "rate": 0.851, + "start": "22:00:00", + "untuned": 5 + }, + { + "i": 23, + "minutes": 1380, + "rate": 0.847, + "start": "23:00:00", + "untuned": 5 + } + ], + "carb_ratio": 4.997, + "csf": 16.363, + "curve": "ultra-rapid", + "dia": 6, + "insulinPeakTime": 45, + "isfProfile": { + "sensitivities": [ + { + "endoffset": 1440, + "i": 0, + "offset": 0, + "sensitivity": 79.673, + "start": "00:00:00", + "x": 0 + } + ] + }, + "min_5m_carbimpact": 8, + "name": "Tuned Dyn2", + "sens": 79.673, + "timezone": "Europe/Paris", + "units": "mg/dl", + "useCustomPeakTime": true +} diff --git a/app/src/test/res/autotune/test4/ns-entries.2022-05-30.json b/app/src/test/res/autotune/test4/ns-entries.2022-05-30.json new file mode 100644 index 0000000000..0d6001d0ba --- /dev/null +++ b/app/src/test/res/autotune/test4/ns-entries.2022-05-30.json @@ -0,0 +1,2906 @@ +[ + { + "_id": "6295769c9bc0370004b42b86", + "device": "AndroidAPS-DexcomG6", + "date": 1653962362000, + "dateString": "2022-05-31T01:59:22.000Z", + "isValid": true, + "sgv": 96, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-31T01:59:56.953Z" + }, + { + "_id": "6295756f9bc0370004b42b83", + "device": "AndroidAPS-DexcomG6", + "date": 1653962062000, + "dateString": "2022-05-31T01:54:22.000Z", + "isValid": true, + "sgv": 103, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-31T01:54:55.893Z" + }, + { + "_id": "629574429bc0370004b42b80", + "device": "AndroidAPS-DexcomG6", + "date": 1653961763000, + "dateString": "2022-05-31T01:49:23.000Z", + "isValid": true, + "sgv": 112, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-31T01:49:54.739Z" + }, + { + "_id": "629573159bc0370004b42b7d", + "device": "AndroidAPS-DexcomG6", + "date": 1653961462000, + "dateString": "2022-05-31T01:44:22.000Z", + "isValid": true, + "sgv": 117, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-31T01:44:53.650Z" + }, + { + "_id": "629571e89bc0370004b42b7a", + "device": "AndroidAPS-DexcomG6", + "date": 1653961162000, + "dateString": "2022-05-31T01:39:22.000Z", + "isValid": true, + "sgv": 119, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-31T01:39:52.509Z" + }, + { + "_id": "629570bb9bc0370004b42b77", + "device": "AndroidAPS-DexcomG6", + "date": 1653960862000, + "dateString": "2022-05-31T01:34:22.000Z", + "isValid": true, + "sgv": 116, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-31T01:34:51.145Z" + }, + { + "_id": "62956f90e4f1e400046e05c7", + "device": "AndroidAPS-DexcomG6", + "date": 1653960561000, + "dateString": "2022-05-31T01:29:21.000Z", + "isValid": true, + "sgv": 112, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-31T01:29:52.070Z" + }, + { + "_id": "62956e62e4f1e400046e05c3", + "device": "AndroidAPS-DexcomG6", + "date": 1653960262000, + "dateString": "2022-05-31T01:24:22.000Z", + "isValid": true, + "sgv": 107, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-31T01:24:50.951Z" + }, + { + "_id": "62956d35e4f1e400046e05c1", + "device": "AndroidAPS-DexcomG6", + "date": 1653959962000, + "dateString": "2022-05-31T01:19:22.000Z", + "isValid": true, + "sgv": 105, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-31T01:19:49.260Z" + }, + { + "_id": "62956c07e4f1e400046e05be", + "device": "AndroidAPS-DexcomG6", + "date": 1653959662000, + "dateString": "2022-05-31T01:14:22.000Z", + "isValid": true, + "sgv": 108, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-31T01:14:47.990Z" + }, + { + "_id": "62956adae4f1e400046e05bb", + "device": "AndroidAPS-DexcomG6", + "date": 1653959362000, + "dateString": "2022-05-31T01:09:22.000Z", + "isValid": true, + "sgv": 112, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-31T01:09:46.322Z" + }, + { + "_id": "629569abe4f1e400046e05b8", + "device": "AndroidAPS-DexcomG6", + "date": 1653959062000, + "dateString": "2022-05-31T01:04:22.000Z", + "isValid": true, + "sgv": 117, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-31T01:04:43.046Z" + }, + { + "_id": "6295687de4f1e400046e05b4", + "device": "AndroidAPS-DexcomG6", + "date": 1653958762000, + "dateString": "2022-05-31T00:59:22.000Z", + "isValid": true, + "sgv": 121, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-31T00:59:41.709Z" + }, + { + "_id": "62954b36f89bc40004df9f60", + "device": "AndroidAPS-DexcomG6", + "date": 1653951262000, + "dateString": "2022-05-30T22:54:22.000Z", + "isValid": true, + "sgv": 170, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T22:54:46.692Z" + }, + { + "_id": "62954a21f89bc40004df9f5d", + "device": "AndroidAPS-DexcomG6", + "date": 1653950961000, + "dateString": "2022-05-30T22:49:21.000Z", + "isValid": true, + "sgv": 172, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T22:50:09.405Z" + }, + { + "_id": "629548f3f89bc40004df9f5a", + "device": "AndroidAPS-DexcomG6", + "date": 1653950662000, + "dateString": "2022-05-30T22:44:22.000Z", + "isValid": true, + "sgv": 174, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T22:45:07.405Z" + }, + { + "_id": "629547acf89bc40004df9f57", + "device": "AndroidAPS-DexcomG6", + "date": 1653950362000, + "dateString": "2022-05-30T22:39:22.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T22:39:40.750Z" + }, + { + "_id": "629546941ded00000454b746", + "device": "AndroidAPS-DexcomG6", + "date": 1653950062000, + "dateString": "2022-05-30T22:34:22.000Z", + "isValid": true, + "sgv": 180, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T22:35:00.013Z" + }, + { + "_id": "629545651ded00000454b744", + "device": "AndroidAPS-DexcomG6", + "date": 1653949762000, + "dateString": "2022-05-30T22:29:22.000Z", + "isValid": true, + "sgv": 183, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T22:29:57.528Z" + }, + { + "_id": "629544361ded00000454b742", + "device": "AndroidAPS-DexcomG6", + "date": 1653949462000, + "dateString": "2022-05-30T22:24:22.000Z", + "isValid": true, + "sgv": 186, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T22:24:54.381Z" + }, + { + "_id": "629543081ded00000454b740", + "device": "AndroidAPS-DexcomG6", + "date": 1653949162000, + "dateString": "2022-05-30T22:19:22.000Z", + "isValid": true, + "sgv": 188, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T22:19:52.210Z" + }, + { + "_id": "629541da1ded00000454b73d", + "device": "AndroidAPS-DexcomG6", + "date": 1653948861000, + "dateString": "2022-05-30T22:14:21.000Z", + "isValid": true, + "sgv": 189, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T22:14:50.845Z" + }, + { + "_id": "629540ac1ded00000454b739", + "device": "AndroidAPS-DexcomG6", + "date": 1653948562000, + "dateString": "2022-05-30T22:09:22.000Z", + "isValid": true, + "sgv": 188, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T22:09:48.384Z" + }, + { + "_id": "62953f7e1ded00000454b737", + "device": "AndroidAPS-DexcomG6", + "date": 1653948262000, + "dateString": "2022-05-30T22:04:22.000Z", + "isValid": true, + "sgv": 185, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T22:04:46.798Z" + }, + { + "_id": "62953e5d86a3df0004eb4504", + "device": "AndroidAPS-DexcomG6", + "date": 1653947962000, + "dateString": "2022-05-30T21:59:22.000Z", + "isValid": true, + "sgv": 181, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T21:59:57.963Z" + }, + { + "_id": "62953d3086a3df0004eb4502", + "device": "AndroidAPS-DexcomG6", + "date": 1653947662000, + "dateString": "2022-05-30T21:54:22.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T21:54:56.505Z" + }, + { + "_id": "62953c0286a3df0004eb4500", + "device": "AndroidAPS-DexcomG6", + "date": 1653947361000, + "dateString": "2022-05-30T21:49:21.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T21:49:54.555Z" + }, + { + "_id": "62953ad486a3df0004eb44fd", + "device": "AndroidAPS-DexcomG6", + "date": 1653947062000, + "dateString": "2022-05-30T21:44:22.000Z", + "isValid": true, + "sgv": 181, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T21:44:52.471Z" + }, + { + "_id": "629539a586a3df0004eb44fb", + "device": "AndroidAPS-DexcomG6", + "date": 1653946762000, + "dateString": "2022-05-30T21:39:22.000Z", + "isValid": true, + "sgv": 188, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T21:39:49.822Z" + }, + { + "_id": "6295387786a3df0004eb44f9", + "device": "AndroidAPS-DexcomG6", + "date": 1653946462000, + "dateString": "2022-05-30T21:34:22.000Z", + "isValid": true, + "sgv": 192, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T21:34:47.953Z" + }, + { + "_id": "6295374986a3df0004eb44f6", + "device": "AndroidAPS-DexcomG6", + "date": 1653946162000, + "dateString": "2022-05-30T21:29:22.000Z", + "isValid": true, + "sgv": 187, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T21:29:45.117Z" + }, + { + "_id": "6295362fe3aedd00046f3884", + "device": "AndroidAPS-DexcomG6", + "date": 1653945863000, + "dateString": "2022-05-30T21:24:23.000Z", + "isValid": true, + "sgv": 176, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T21:25:03.893Z" + }, + { + "_id": "62953501e3aedd00046f3880", + "device": "AndroidAPS-DexcomG6", + "date": 1653945562000, + "dateString": "2022-05-30T21:19:22.000Z", + "isValid": true, + "sgv": 167, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T21:20:01.384Z" + }, + { + "_id": "629533d3e3aedd00046f387e", + "device": "AndroidAPS-DexcomG6", + "date": 1653945263000, + "dateString": "2022-05-30T21:14:23.000Z", + "isValid": true, + "sgv": 162, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T21:14:59.957Z" + }, + { + "_id": "629532a6e3aedd00046f387c", + "device": "AndroidAPS-DexcomG6", + "date": 1653944962000, + "dateString": "2022-05-30T21:09:22.000Z", + "isValid": true, + "sgv": 161, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T21:09:58.543Z" + }, + { + "_id": "62953178e3aedd00046f3879", + "device": "AndroidAPS-DexcomG6", + "date": 1653944662000, + "dateString": "2022-05-30T21:04:22.000Z", + "isValid": true, + "sgv": 163, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T21:04:56.492Z" + }, + { + "_id": "62953049e3aedd00046f3874", + "device": "AndroidAPS-DexcomG6", + "date": 1653944362000, + "dateString": "2022-05-30T20:59:22.000Z", + "isValid": true, + "sgv": 166, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T20:59:53.874Z" + }, + { + "_id": "62952f1be3aedd00046f3871", + "device": "AndroidAPS-DexcomG6", + "date": 1653944062000, + "dateString": "2022-05-30T20:54:22.000Z", + "isValid": true, + "sgv": 169, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T20:54:51.953Z" + }, + { + "_id": "62952de5e3aedd00046f386d", + "device": "AndroidAPS-DexcomG6", + "date": 1653943762000, + "dateString": "2022-05-30T20:49:22.000Z", + "isValid": true, + "sgv": 171, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T20:49:41.125Z" + }, + { + "_id": "62952cb7e3aedd00046f386a", + "device": "AndroidAPS-DexcomG6", + "date": 1653943462000, + "dateString": "2022-05-30T20:44:22.000Z", + "isValid": true, + "sgv": 173, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T20:44:39.868Z" + }, + { + "_id": "62952b89e3aedd00046f3866", + "device": "AndroidAPS-DexcomG6", + "date": 1653943162000, + "dateString": "2022-05-30T20:39:22.000Z", + "isValid": true, + "sgv": 174, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T20:39:37.778Z" + }, + { + "_id": "62952a5de3aedd00046f385f", + "device": "AndroidAPS-DexcomG6", + "date": 1653942863000, + "dateString": "2022-05-30T20:34:23.000Z", + "isValid": true, + "sgv": 175, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T20:34:37.302Z" + }, + { + "_id": "62952949e3aedd00046f385c", + "device": "AndroidAPS-DexcomG6", + "date": 1653942563000, + "dateString": "2022-05-30T20:29:23.000Z", + "isValid": true, + "sgv": 176, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T20:30:01.193Z" + }, + { + "_id": "6295284ee3aedd00046f3858", + "device": "AndroidAPS-DexcomG6", + "date": 1653942262000, + "dateString": "2022-05-30T20:24:22.000Z", + "isValid": true, + "sgv": 178, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T20:25:50.333Z" + }, + { + "_id": "629526eee3aedd00046f3855", + "device": "AndroidAPS-DexcomG6", + "date": 1653941961000, + "dateString": "2022-05-30T20:19:21.000Z", + "isValid": true, + "sgv": 179, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T20:19:58.496Z" + }, + { + "_id": "629525baf63c010004ea5d29", + "device": "AndroidAPS-DexcomG6", + "date": 1653941662000, + "dateString": "2022-05-30T20:14:22.000Z", + "isValid": true, + "sgv": 180, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T20:14:50.164Z" + }, + { + "_id": "629524a6f63c010004ea5d26", + "device": "AndroidAPS-DexcomG6", + "date": 1653941361000, + "dateString": "2022-05-30T20:09:21.000Z", + "isValid": true, + "sgv": 181, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T20:10:14.057Z" + }, + { + "_id": "62952379f63c010004ea5d22", + "device": "AndroidAPS-DexcomG6", + "date": 1653941062000, + "dateString": "2022-05-30T20:04:22.000Z", + "isValid": true, + "sgv": 182, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T20:05:13.099Z" + }, + { + "_id": "62952232f63c010004ea5d1f", + "device": "AndroidAPS-DexcomG6", + "date": 1653940762000, + "dateString": "2022-05-30T19:59:22.000Z", + "isValid": true, + "sgv": 183, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T19:59:46.536Z" + }, + { + "_id": "6295211ef63c010004ea5d1c", + "device": "AndroidAPS-DexcomG6", + "date": 1653940461000, + "dateString": "2022-05-30T19:54:21.000Z", + "isValid": true, + "sgv": 184, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T19:55:10.510Z" + }, + { + "_id": "62951fd8f63c010004ea5d1a", + "device": "AndroidAPS-DexcomG6", + "date": 1653940161000, + "dateString": "2022-05-30T19:49:21.000Z", + "isValid": true, + "sgv": 185, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T19:49:44.530Z" + }, + { + "_id": "62951eddf63c010004ea5d16", + "device": "AndroidAPS-DexcomG6", + "date": 1653939861000, + "dateString": "2022-05-30T19:44:21.000Z", + "isValid": true, + "sgv": 186, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T19:45:33.306Z" + }, + { + "_id": "62951d7ff63c010004ea5d12", + "device": "AndroidAPS-DexcomG6", + "date": 1653939561000, + "dateString": "2022-05-30T19:39:21.000Z", + "isValid": true, + "sgv": 187, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T19:39:43.397Z" + }, + { + "_id": "62951c51f63c010004ea5d0f", + "device": "AndroidAPS-DexcomG6", + "date": 1653939262000, + "dateString": "2022-05-30T19:34:22.000Z", + "isValid": true, + "sgv": 186, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T19:34:41.514Z" + }, + { + "_id": "62951b23f63c010004ea5d0b", + "device": "AndroidAPS-DexcomG6", + "date": 1653938962000, + "dateString": "2022-05-30T19:29:22.000Z", + "isValid": true, + "sgv": 185, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T19:29:39.093Z" + }, + { + "_id": "62951a0ef63c010004ea5d08", + "device": "AndroidAPS-DexcomG6", + "date": 1653938661000, + "dateString": "2022-05-30T19:24:21.000Z", + "isValid": true, + "sgv": 184, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T19:25:02.070Z" + }, + { + "_id": "629518def63c010004ea5d04", + "device": "AndroidAPS-DexcomG6", + "date": 1653938362000, + "dateString": "2022-05-30T19:19:22.000Z", + "isValid": true, + "sgv": 183, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T19:19:58.457Z" + }, + { + "_id": "629517b0f63c010004ea5d01", + "device": "AndroidAPS-DexcomG6", + "date": 1653938062000, + "dateString": "2022-05-30T19:14:22.000Z", + "isValid": true, + "sgv": 182, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T19:14:56.712Z" + }, + { + "_id": "62951683f63c010004ea5cff", + "device": "AndroidAPS-DexcomG6", + "date": 1653937762000, + "dateString": "2022-05-30T19:09:22.000Z", + "isValid": true, + "sgv": 181, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T19:09:55.010Z" + }, + { + "_id": "62951558f63c010004ea5cfc", + "device": "AndroidAPS-DexcomG6", + "date": 1653937462000, + "dateString": "2022-05-30T19:04:22.000Z", + "isValid": true, + "sgv": 181, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T19:04:56.708Z" + }, + { + "_id": "6295142af63c010004ea5cfa", + "device": "AndroidAPS-DexcomG6", + "date": 1653937162000, + "dateString": "2022-05-30T18:59:22.000Z", + "isValid": true, + "sgv": 180, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T18:59:54.428Z" + }, + { + "_id": "629512fcf63c010004ea5cf7", + "device": "AndroidAPS-DexcomG6", + "date": 1653936863000, + "dateString": "2022-05-30T18:54:23.000Z", + "isValid": true, + "sgv": 179, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T18:54:52.395Z" + }, + { + "_id": "629511c70f8c2e00042830a2", + "device": "AndroidAPS-DexcomG6", + "date": 1653936563000, + "dateString": "2022-05-30T18:49:23.000Z", + "isValid": true, + "sgv": 177, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T18:49:43.497Z" + }, + { + "_id": "629510990f8c2e000428309f", + "device": "AndroidAPS-DexcomG6", + "date": 1653936262000, + "dateString": "2022-05-30T18:44:22.000Z", + "isValid": true, + "sgv": 175, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T18:44:41.570Z" + }, + { + "_id": "62950f6b0f8c2e000428309c", + "device": "AndroidAPS-DexcomG6", + "date": 1653935962000, + "dateString": "2022-05-30T18:39:22.000Z", + "isValid": true, + "sgv": 172, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T18:39:39.460Z" + }, + { + "_id": "62950e3d0f8c2e0004283099", + "device": "AndroidAPS-DexcomG6", + "date": 1653935663000, + "dateString": "2022-05-30T18:34:23.000Z", + "isValid": true, + "sgv": 164, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T18:34:37.460Z" + }, + { + "_id": "62950d280f8c2e0004283094", + "device": "AndroidAPS-DexcomG6", + "date": 1653935363000, + "dateString": "2022-05-30T18:29:23.000Z", + "isValid": true, + "sgv": 156, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T18:30:00.224Z" + }, + { + "_id": "62950bf90f8c2e0004283091", + "device": "AndroidAPS-DexcomG6", + "date": 1653935062000, + "dateString": "2022-05-30T18:24:22.000Z", + "isValid": true, + "sgv": 150, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T18:24:57.761Z" + }, + { + "_id": "62950acb0f8c2e000428308d", + "device": "AndroidAPS-DexcomG6", + "date": 1653934761000, + "dateString": "2022-05-30T18:19:21.000Z", + "isValid": true, + "sgv": 147, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T18:19:55.662Z" + }, + { + "_id": "6295099a409703000484d1c9", + "device": "AndroidAPS-DexcomG6", + "date": 1653934461000, + "dateString": "2022-05-30T18:14:21.000Z", + "isValid": true, + "sgv": 144, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T18:14:50.027Z" + }, + { + "_id": "6295086b409703000484d1c6", + "device": "AndroidAPS-DexcomG6", + "date": 1653934162000, + "dateString": "2022-05-30T18:09:22.000Z", + "isValid": true, + "sgv": 140, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T18:09:47.806Z" + }, + { + "_id": "6295073d409703000484d1c4", + "device": "AndroidAPS-DexcomG6", + "date": 1653933862000, + "dateString": "2022-05-30T18:04:22.000Z", + "isValid": true, + "sgv": 137, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T18:04:45.808Z" + }, + { + "_id": "6295060f409703000484d1c1", + "device": "AndroidAPS-DexcomG6", + "date": 1653933562000, + "dateString": "2022-05-30T17:59:22.000Z", + "isValid": true, + "sgv": 136, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T17:59:43.089Z" + }, + { + "_id": "629504e1409703000484d1be", + "device": "AndroidAPS-DexcomG6", + "date": 1653933262000, + "dateString": "2022-05-30T17:54:22.000Z", + "isValid": true, + "sgv": 135, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T17:54:41.141Z" + }, + { + "_id": "629503cb409703000484d1ba", + "device": "AndroidAPS-DexcomG6", + "date": 1653932962000, + "dateString": "2022-05-30T17:49:22.000Z", + "isValid": true, + "sgv": 133, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T17:50:03.997Z" + }, + { + "_id": "6295029d409703000484d1b7", + "device": "AndroidAPS-DexcomG6", + "date": 1653932662000, + "dateString": "2022-05-30T17:44:22.000Z", + "isValid": true, + "sgv": 130, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T17:45:01.816Z" + }, + { + "_id": "6295015e55b9dd00048a5495", + "device": "AndroidAPS-DexcomG6", + "date": 1653932362000, + "dateString": "2022-05-30T17:39:22.000Z", + "isValid": true, + "sgv": 127, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T17:39:42.833Z" + }, + { + "_id": "6295003055b9dd00048a5493", + "device": "AndroidAPS-DexcomG6", + "date": 1653932061000, + "dateString": "2022-05-30T17:34:21.000Z", + "isValid": true, + "sgv": 125, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T17:34:40.905Z" + }, + { + "_id": "6294ff1c55b9dd00048a5490", + "device": "AndroidAPS-DexcomG6", + "date": 1653931761000, + "dateString": "2022-05-30T17:29:21.000Z", + "isValid": true, + "sgv": 123, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T17:30:04.244Z" + }, + { + "_id": "6294fded55b9dd00048a548e", + "device": "AndroidAPS-DexcomG6", + "date": 1653931462000, + "dateString": "2022-05-30T17:24:22.000Z", + "isValid": true, + "sgv": 121, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T17:25:01.436Z" + }, + { + "_id": "6294fcbf55b9dd00048a548c", + "device": "AndroidAPS-DexcomG6", + "date": 1653931162000, + "dateString": "2022-05-30T17:19:22.000Z", + "isValid": true, + "sgv": 119, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T17:19:59.153Z" + }, + { + "_id": "6294fb9155b9dd00048a548a", + "device": "AndroidAPS-DexcomG6", + "date": 1653930862000, + "dateString": "2022-05-30T17:14:22.000Z", + "isValid": true, + "sgv": 119, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T17:14:57.054Z" + }, + { + "_id": "6294fa6255b9dd00048a5488", + "device": "AndroidAPS-DexcomG6", + "date": 1653930562000, + "dateString": "2022-05-30T17:09:22.000Z", + "isValid": true, + "sgv": 119, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T17:09:54.701Z" + }, + { + "_id": "6294f92d55b9dd00048a5486", + "device": "AndroidAPS-DexcomG6", + "date": 1653930261000, + "dateString": "2022-05-30T17:04:21.000Z", + "isValid": true, + "sgv": 120, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T17:04:45.622Z" + }, + { + "_id": "6294f7fe55b9dd00048a5483", + "device": "AndroidAPS-DexcomG6", + "date": 1653929962000, + "dateString": "2022-05-30T16:59:22.000Z", + "isValid": true, + "sgv": 120, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T16:59:42.653Z" + }, + { + "_id": "6294f6ea55b9dd00048a5481", + "device": "AndroidAPS-DexcomG6", + "date": 1653929662000, + "dateString": "2022-05-30T16:54:22.000Z", + "isValid": true, + "sgv": 121, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T16:55:06.087Z" + }, + { + "_id": "6294f5bd55b9dd00048a547f", + "device": "AndroidAPS-DexcomG6", + "date": 1653929361000, + "dateString": "2022-05-30T16:49:21.000Z", + "isValid": true, + "sgv": 123, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T16:50:05.068Z" + }, + { + "_id": "6294f4db55b9dd00048a547d", + "device": "AndroidAPS-DexcomG6", + "date": 1653929062000, + "dateString": "2022-05-30T16:44:22.000Z", + "isValid": true, + "sgv": 125, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T16:46:19.989Z" + }, + { + "_id": "6294f35555b9dd00048a547a", + "device": "AndroidAPS-DexcomG6", + "date": 1653928761000, + "dateString": "2022-05-30T16:39:21.000Z", + "isValid": true, + "sgv": 128, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T16:39:49.489Z" + }, + { + "_id": "6294f23fb23f340004e841eb", + "device": "AndroidAPS-DexcomG6", + "date": 1653928462000, + "dateString": "2022-05-30T16:34:22.000Z", + "isValid": true, + "sgv": 132, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T16:35:11.666Z" + }, + { + "_id": "6294f0f8b23f340004e841e8", + "device": "AndroidAPS-DexcomG6", + "date": 1653928161000, + "dateString": "2022-05-30T16:29:21.000Z", + "isValid": true, + "sgv": 133, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T16:29:44.123Z" + }, + { + "_id": "6294efcab23f340004e841e5", + "device": "AndroidAPS-DexcomG6", + "date": 1653927861000, + "dateString": "2022-05-30T16:24:21.000Z", + "isValid": true, + "sgv": 131, + "direction": "SingleUp", + "type": "sgv", + "created_at": "2022-05-30T16:24:42.057Z" + }, + { + "_id": "6294eeb5b23f340004e841e1", + "device": "AndroidAPS-DexcomG6", + "date": 1653927562000, + "dateString": "2022-05-30T16:19:22.000Z", + "isValid": true, + "sgv": 123, + "direction": "SingleUp", + "type": "sgv", + "created_at": "2022-05-30T16:20:05.391Z" + }, + { + "_id": "6294ed6eb23f340004e841de", + "device": "AndroidAPS-DexcomG6", + "date": 1653927262000, + "dateString": "2022-05-30T16:14:22.000Z", + "isValid": true, + "sgv": 111, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T16:14:38.319Z" + }, + { + "_id": "6294ec59b23f340004e841da", + "device": "AndroidAPS-DexcomG6", + "date": 1653926962000, + "dateString": "2022-05-30T16:09:22.000Z", + "isValid": true, + "sgv": 97, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T16:10:01.438Z" + }, + { + "_id": "6294eb2bb23f340004e841d8", + "device": "AndroidAPS-DexcomG6", + "date": 1653926662000, + "dateString": "2022-05-30T16:04:22.000Z", + "isValid": true, + "sgv": 87, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T16:04:59.310Z" + }, + { + "_id": "6294ea10b23f340004e841d5", + "device": "AndroidAPS-DexcomG6", + "date": 1653926362000, + "dateString": "2022-05-30T15:59:22.000Z", + "isValid": true, + "sgv": 82, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T16:00:16.597Z" + }, + { + "_id": "6294e8c9b23f340004e841d3", + "device": "AndroidAPS-DexcomG6", + "date": 1653926062000, + "dateString": "2022-05-30T15:54:22.000Z", + "isValid": true, + "sgv": 81, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T15:54:49.400Z" + }, + { + "_id": "6294e79bb23f340004e841d1", + "device": "AndroidAPS-DexcomG6", + "date": 1653925761000, + "dateString": "2022-05-30T15:49:21.000Z", + "isValid": true, + "sgv": 79, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T15:49:47.886Z" + }, + { + "_id": "6294e66eb23f340004e841cf", + "device": "AndroidAPS-DexcomG6", + "date": 1653925462000, + "dateString": "2022-05-30T15:44:22.000Z", + "isValid": true, + "sgv": 78, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T15:44:46.677Z" + }, + { + "_id": "6294e554706f120004b7d161", + "device": "AndroidAPS-DexcomG6", + "date": 1653925162000, + "dateString": "2022-05-30T15:39:22.000Z", + "isValid": true, + "sgv": 77, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T15:40:04.657Z" + }, + { + "_id": "6294e427706f120004b7d15f", + "device": "AndroidAPS-DexcomG6", + "date": 1653924862000, + "dateString": "2022-05-30T15:34:22.000Z", + "isValid": true, + "sgv": 77, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T15:35:03.426Z" + }, + { + "_id": "6294e2fa706f120004b7d15c", + "device": "AndroidAPS-DexcomG6", + "date": 1653924562000, + "dateString": "2022-05-30T15:29:22.000Z", + "isValid": true, + "sgv": 78, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T15:30:02.194Z" + }, + { + "_id": "6294e1cd706f120004b7d15a", + "device": "AndroidAPS-DexcomG6", + "date": 1653924262000, + "dateString": "2022-05-30T15:24:22.000Z", + "isValid": true, + "sgv": 79, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T15:25:01.236Z" + }, + { + "_id": "6294e09f706f120004b7d158", + "device": "AndroidAPS-DexcomG6", + "date": 1653923961000, + "dateString": "2022-05-30T15:19:21.000Z", + "isValid": true, + "sgv": 80, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T15:19:59.752Z" + }, + { + "_id": "6294dfbd706f120004b7d156", + "device": "AndroidAPS-DexcomG6", + "date": 1653923662000, + "dateString": "2022-05-30T15:14:22.000Z", + "isValid": true, + "sgv": 80, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T15:16:13.728Z" + }, + { + "_id": "6294df40706f120004b7d154", + "device": "AndroidAPS-DexcomG6", + "date": 1653923361000, + "dateString": "2022-05-30T15:09:21.000Z", + "isValid": true, + "sgv": 79, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T15:14:08.395Z" + }, + { + "_id": "6294ddc7706f120004b7d152", + "device": "AndroidAPS-DexcomG6", + "date": 1653923061000, + "dateString": "2022-05-30T15:04:21.000Z", + "isValid": true, + "sgv": 79, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T15:07:51.780Z" + }, + { + "_id": "6294dcde5f047100042886c5", + "device": "AndroidAPS-DexcomG6", + "date": 1653922761000, + "dateString": "2022-05-30T14:59:21.000Z", + "isValid": true, + "sgv": 79, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T15:03:58.124Z" + }, + { + "_id": "6294db4c5f047100042886c3", + "device": "AndroidAPS-DexcomG6", + "date": 1653922461000, + "dateString": "2022-05-30T14:54:21.000Z", + "isValid": true, + "sgv": 81, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T14:57:16.389Z" + }, + { + "_id": "6294da065f047100042886c0", + "device": "AndroidAPS-DexcomG6", + "date": 1653922161000, + "dateString": "2022-05-30T14:49:21.000Z", + "isValid": true, + "sgv": 82, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T14:51:50.006Z" + }, + { + "_id": "6294d85b5f047100042886be", + "device": "AndroidAPS-DexcomG6", + "date": 1653921862000, + "dateString": "2022-05-30T14:44:22.000Z", + "isValid": true, + "sgv": 84, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T14:44:43.154Z" + }, + { + "_id": "6294d72e5f047100042886bc", + "device": "AndroidAPS-DexcomG6", + "date": 1653921561000, + "dateString": "2022-05-30T14:39:21.000Z", + "isValid": true, + "sgv": 85, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T14:39:42.170Z" + }, + { + "_id": "6294d6005f047100042886ba", + "device": "AndroidAPS-DexcomG6", + "date": 1653921261000, + "dateString": "2022-05-30T14:34:21.000Z", + "isValid": true, + "sgv": 87, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T14:34:40.716Z" + }, + { + "_id": "6294d4dbdac1e20004fde59a", + "device": "AndroidAPS-DexcomG6", + "date": 1653920961000, + "dateString": "2022-05-30T14:29:21.000Z", + "isValid": true, + "sgv": 89, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T14:29:47.439Z" + }, + { + "_id": "6294d3aedac1e20004fde598", + "device": "AndroidAPS-DexcomG6", + "date": 1653920661000, + "dateString": "2022-05-30T14:24:21.000Z", + "isValid": true, + "sgv": 93, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T14:24:46.261Z" + }, + { + "_id": "6294d281dac1e20004fde596", + "device": "AndroidAPS-DexcomG6", + "date": 1653920361000, + "dateString": "2022-05-30T14:19:21.000Z", + "isValid": true, + "sgv": 97, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T14:19:45.303Z" + }, + { + "_id": "6294d154dac1e20004fde594", + "device": "AndroidAPS-DexcomG6", + "date": 1653920062000, + "dateString": "2022-05-30T14:14:22.000Z", + "isValid": true, + "sgv": 100, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T14:14:44.142Z" + }, + { + "_id": "6294d026dac1e20004fde592", + "device": "AndroidAPS-DexcomG6", + "date": 1653919761000, + "dateString": "2022-05-30T14:09:21.000Z", + "isValid": true, + "sgv": 103, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T14:09:42.740Z" + }, + { + "_id": "6294cf12dac1e20004fde58f", + "device": "AndroidAPS-DexcomG6", + "date": 1653919462000, + "dateString": "2022-05-30T14:04:22.000Z", + "isValid": true, + "sgv": 106, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T14:05:06.902Z" + }, + { + "_id": "6294cdccdac1e20004fde58d", + "device": "AndroidAPS-DexcomG6", + "date": 1653919161000, + "dateString": "2022-05-30T13:59:21.000Z", + "isValid": true, + "sgv": 110, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T13:59:40.487Z" + }, + { + "_id": "6294cc9cb8c0c10004ff0014", + "device": "AndroidAPS-DexcomG6", + "date": 1653918862000, + "dateString": "2022-05-30T13:54:22.000Z", + "isValid": true, + "sgv": 113, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T13:54:36.799Z" + }, + { + "_id": "6294cb88b8c0c10004ff0012", + "device": "AndroidAPS-DexcomG6", + "date": 1653918561000, + "dateString": "2022-05-30T13:49:21.000Z", + "isValid": true, + "sgv": 117, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T13:50:00.678Z" + }, + { + "_id": "6294ca5bb8c0c10004ff0010", + "device": "AndroidAPS-DexcomG6", + "date": 1653918262000, + "dateString": "2022-05-30T13:44:22.000Z", + "isValid": true, + "sgv": 121, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T13:44:59.703Z" + }, + { + "_id": "6294c92eb8c0c10004ff000d", + "device": "AndroidAPS-DexcomG6", + "date": 1653917962000, + "dateString": "2022-05-30T13:39:22.000Z", + "isValid": true, + "sgv": 126, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T13:39:58.439Z" + }, + { + "_id": "6294c801b8c0c10004ff000b", + "device": "AndroidAPS-DexcomG6", + "date": 1653917662000, + "dateString": "2022-05-30T13:34:22.000Z", + "isValid": true, + "sgv": 130, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T13:34:57.267Z" + }, + { + "_id": "6294c6d3b8c0c10004ff0009", + "device": "AndroidAPS-DexcomG6", + "date": 1653917362000, + "dateString": "2022-05-30T13:29:22.000Z", + "isValid": true, + "sgv": 136, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T13:29:55.794Z" + }, + { + "_id": "6294c5a6b8c0c10004ff0007", + "device": "AndroidAPS-DexcomG6", + "date": 1653917062000, + "dateString": "2022-05-30T13:24:22.000Z", + "isValid": true, + "sgv": 141, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T13:24:54.571Z" + }, + { + "_id": "6294c48252bed20004c9a2bc", + "device": "AndroidAPS-DexcomG6", + "date": 1653916762000, + "dateString": "2022-05-30T13:19:22.000Z", + "isValid": true, + "sgv": 147, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T13:20:02.947Z" + }, + { + "_id": "6294c35552bed20004c9a2ba", + "device": "AndroidAPS-DexcomG6", + "date": 1653916461000, + "dateString": "2022-05-30T13:14:21.000Z", + "isValid": true, + "sgv": 152, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T13:15:01.720Z" + }, + { + "_id": "6294c22852bed20004c9a2b7", + "device": "AndroidAPS-DexcomG6", + "date": 1653916162000, + "dateString": "2022-05-30T13:09:22.000Z", + "isValid": true, + "sgv": 158, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T13:10:00.478Z" + }, + { + "_id": "6294c0fb52bed20004c9a2b5", + "device": "AndroidAPS-DexcomG6", + "date": 1653915862000, + "dateString": "2022-05-30T13:04:22.000Z", + "isValid": true, + "sgv": 164, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T13:04:59.247Z" + }, + { + "_id": "6294bfce52bed20004c9a2b2", + "device": "AndroidAPS-DexcomG6", + "date": 1653915561000, + "dateString": "2022-05-30T12:59:21.000Z", + "isValid": true, + "sgv": 170, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T12:59:58.302Z" + }, + { + "_id": "6294bea052bed20004c9a2af", + "device": "AndroidAPS-DexcomG6", + "date": 1653915262000, + "dateString": "2022-05-30T12:54:22.000Z", + "isValid": true, + "sgv": 176, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T12:54:56.765Z" + }, + { + "_id": "6294bd7352bed20004c9a2ac", + "device": "AndroidAPS-DexcomG6", + "date": 1653914962000, + "dateString": "2022-05-30T12:49:22.000Z", + "isValid": true, + "sgv": 182, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T12:49:55.775Z" + }, + { + "_id": "6294bc52ff39db0004546864", + "device": "AndroidAPS-DexcomG6", + "date": 1653914661000, + "dateString": "2022-05-30T12:44:21.000Z", + "isValid": true, + "sgv": 188, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T12:45:06.129Z" + }, + { + "_id": "6294bb0bff39db0004546861", + "device": "AndroidAPS-DexcomG6", + "date": 1653914362000, + "dateString": "2022-05-30T12:39:22.000Z", + "isValid": true, + "sgv": 195, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T12:39:39.194Z" + }, + { + "_id": "6294b9f6ff39db000454685e", + "device": "AndroidAPS-DexcomG6", + "date": 1653914062000, + "dateString": "2022-05-30T12:34:22.000Z", + "isValid": true, + "sgv": 203, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T12:35:02.052Z" + }, + { + "_id": "6294b8c7ff39db000454685b", + "device": "AndroidAPS-DexcomG6", + "date": 1653913762000, + "dateString": "2022-05-30T12:29:22.000Z", + "isValid": true, + "sgv": 213, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T12:29:59.741Z" + }, + { + "_id": "6294b799ff39db0004546858", + "device": "AndroidAPS-DexcomG6", + "date": 1653913462000, + "dateString": "2022-05-30T12:24:22.000Z", + "isValid": true, + "sgv": 223, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T12:24:57.749Z" + }, + { + "_id": "6294b66bff39db0004546853", + "device": "AndroidAPS-DexcomG6", + "date": 1653913162000, + "dateString": "2022-05-30T12:19:22.000Z", + "isValid": true, + "sgv": 232, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T12:19:55.640Z" + }, + { + "_id": "6294b53dff39db0004546852", + "device": "AndroidAPS-DexcomG6", + "date": 1653912862000, + "dateString": "2022-05-30T12:14:22.000Z", + "isValid": true, + "sgv": 242, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T12:14:53.986Z" + }, + { + "_id": "6294b4130f39100004ec41f5", + "device": "AndroidAPS-DexcomG6", + "date": 1653912562000, + "dateString": "2022-05-30T12:09:22.000Z", + "isValid": true, + "sgv": 248, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T12:09:55.708Z" + }, + { + "_id": "6294b2e50f39100004ec41f3", + "device": "AndroidAPS-DexcomG6", + "date": 1653912261000, + "dateString": "2022-05-30T12:04:21.000Z", + "isValid": true, + "sgv": 251, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T12:04:53.216Z" + }, + { + "_id": "6294b1d10f39100004ec41f1", + "device": "AndroidAPS-DexcomG6", + "date": 1653911961000, + "dateString": "2022-05-30T11:59:21.000Z", + "isValid": true, + "sgv": 251, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T12:00:17.223Z" + }, + { + "_id": "6294b08a0f39100004ec41ef", + "device": "AndroidAPS-DexcomG6", + "date": 1653911662000, + "dateString": "2022-05-30T11:54:22.000Z", + "isValid": true, + "sgv": 249, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T11:54:50.545Z" + }, + { + "_id": "6294af5c0f39100004ec41ed", + "device": "AndroidAPS-DexcomG6", + "date": 1653911361000, + "dateString": "2022-05-30T11:49:21.000Z", + "isValid": true, + "sgv": 246, + "direction": "SingleUp", + "type": "sgv", + "created_at": "2022-05-30T11:49:48.926Z" + }, + { + "_id": "6294ae2f0f39100004ec41e7", + "device": "AndroidAPS-DexcomG6", + "date": 1653911061000, + "dateString": "2022-05-30T11:44:21.000Z", + "isValid": true, + "sgv": 240, + "direction": "DoubleUp", + "type": "sgv", + "created_at": "2022-05-30T11:44:47.323Z" + }, + { + "_id": "6294ad1b0f39100004ec41e2", + "device": "AndroidAPS-DexcomG6", + "date": 1653910761000, + "dateString": "2022-05-30T11:39:21.000Z", + "isValid": true, + "sgv": 230, + "direction": "DoubleUp", + "type": "sgv", + "created_at": "2022-05-30T11:40:11.205Z" + }, + { + "_id": "6294abd9ac5400000430888e", + "device": "AndroidAPS-DexcomG6", + "date": 1653910462000, + "dateString": "2022-05-30T11:34:22.000Z", + "isValid": true, + "sgv": 215, + "direction": "DoubleUp", + "type": "sgv", + "created_at": "2022-05-30T11:34:49.146Z" + }, + { + "_id": "6294aaabac5400000430888a", + "device": "AndroidAPS-DexcomG6", + "date": 1653910161000, + "dateString": "2022-05-30T11:29:21.000Z", + "isValid": true, + "sgv": 195, + "direction": "DoubleUp", + "type": "sgv", + "created_at": "2022-05-30T11:29:47.695Z" + }, + { + "_id": "6294a97eac54000004308887", + "device": "AndroidAPS-DexcomG6", + "date": 1653909861000, + "dateString": "2022-05-30T11:24:21.000Z", + "isValid": true, + "sgv": 172, + "direction": "DoubleUp", + "type": "sgv", + "created_at": "2022-05-30T11:24:46.490Z" + }, + { + "_id": "6294a851ac54000004308883", + "device": "AndroidAPS-DexcomG6", + "date": 1653909561000, + "dateString": "2022-05-30T11:19:21.000Z", + "isValid": true, + "sgv": 146, + "direction": "DoubleUp", + "type": "sgv", + "created_at": "2022-05-30T11:19:45.466Z" + }, + { + "_id": "6294a723ac54000004308881", + "device": "AndroidAPS-DexcomG6", + "date": 1653909261000, + "dateString": "2022-05-30T11:14:21.000Z", + "isValid": true, + "sgv": 122, + "direction": "SingleUp", + "type": "sgv", + "created_at": "2022-05-30T11:14:43.529Z" + }, + { + "_id": "6294a60eac5400000430887d", + "device": "AndroidAPS-DexcomG6", + "date": 1653908962000, + "dateString": "2022-05-30T11:09:22.000Z", + "isValid": true, + "sgv": 102, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T11:10:06.733Z" + }, + { + "_id": "6294a4d1ac5400000430887a", + "device": "AndroidAPS-DexcomG6", + "date": 1653908662000, + "dateString": "2022-05-30T11:04:22.000Z", + "isValid": true, + "sgv": 88, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T11:04:49.434Z" + }, + { + "_id": "6294a3a3ac54000004308877", + "device": "AndroidAPS-DexcomG6", + "date": 1653908361000, + "dateString": "2022-05-30T10:59:21.000Z", + "isValid": true, + "sgv": 81, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T10:59:47.232Z" + }, + { + "_id": "6294a274ac54000004308874", + "device": "AndroidAPS-DexcomG6", + "date": 1653908062000, + "dateString": "2022-05-30T10:54:22.000Z", + "isValid": true, + "sgv": 77, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T10:54:44.532Z" + }, + { + "_id": "6294a15bc2e464000413b7a8", + "device": "AndroidAPS-DexcomG6", + "date": 1653907762000, + "dateString": "2022-05-30T10:49:22.000Z", + "isValid": true, + "sgv": 76, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T10:50:03.007Z" + }, + { + "_id": "6294a02dc2e464000413b7a6", + "device": "AndroidAPS-DexcomG6", + "date": 1653907461000, + "dateString": "2022-05-30T10:44:21.000Z", + "isValid": true, + "sgv": 77, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T10:45:01.559Z" + }, + { + "_id": "62949f00c2e464000413b7a3", + "device": "AndroidAPS-DexcomG6", + "date": 1653907162000, + "dateString": "2022-05-30T10:39:22.000Z", + "isValid": true, + "sgv": 78, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T10:40:00.055Z" + }, + { + "_id": "62949debc2e464000413b7a1", + "device": "AndroidAPS-DexcomG6", + "date": 1653906861000, + "dateString": "2022-05-30T10:34:21.000Z", + "isValid": true, + "sgv": 79, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T10:35:23.163Z" + }, + { + "_id": "62949ca4c2e464000413b79f", + "device": "AndroidAPS-DexcomG6", + "date": 1653906561000, + "dateString": "2022-05-30T10:29:21.000Z", + "isValid": true, + "sgv": 80, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T10:29:56.711Z" + }, + { + "_id": "62949b77c2e464000413b79d", + "device": "AndroidAPS-DexcomG6", + "date": 1653906262000, + "dateString": "2022-05-30T10:24:22.000Z", + "isValid": true, + "sgv": 82, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T10:24:55.547Z" + }, + { + "_id": "62949a4ac2e464000413b79a", + "device": "AndroidAPS-DexcomG6", + "date": 1653905961000, + "dateString": "2022-05-30T10:19:21.000Z", + "isValid": true, + "sgv": 84, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T10:19:54.421Z" + }, + { + "_id": "6294991b5989a90004f0c233", + "device": "AndroidAPS-DexcomG6", + "date": 1653905661000, + "dateString": "2022-05-30T10:14:21.000Z", + "isValid": true, + "sgv": 87, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T10:14:51.432Z" + }, + { + "_id": "629497ee5989a90004f0c230", + "device": "AndroidAPS-DexcomG6", + "date": 1653905362000, + "dateString": "2022-05-30T10:09:22.000Z", + "isValid": true, + "sgv": 91, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T10:09:50.202Z" + }, + { + "_id": "629496c15989a90004f0c22d", + "device": "AndroidAPS-DexcomG6", + "date": 1653905061000, + "dateString": "2022-05-30T10:04:21.000Z", + "isValid": true, + "sgv": 94, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T10:04:49.010Z" + }, + { + "_id": "629495ac5989a90004f0c22a", + "device": "AndroidAPS-DexcomG6", + "date": 1653904761000, + "dateString": "2022-05-30T09:59:21.000Z", + "isValid": true, + "sgv": 99, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T10:00:12.873Z" + }, + { + "_id": "629494665989a90004f0c228", + "device": "AndroidAPS-DexcomG6", + "date": 1653904461000, + "dateString": "2022-05-30T09:54:21.000Z", + "isValid": true, + "sgv": 102, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T09:54:46.582Z" + }, + { + "_id": "629493395989a90004f0c225", + "device": "AndroidAPS-DexcomG6", + "date": 1653904161000, + "dateString": "2022-05-30T09:49:21.000Z", + "isValid": true, + "sgv": 107, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T09:49:45.193Z" + }, + { + "_id": "6294920b5989a90004f0c223", + "device": "AndroidAPS-DexcomG6", + "date": 1653903861000, + "dateString": "2022-05-30T09:44:21.000Z", + "isValid": true, + "sgv": 112, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T09:44:43.997Z" + }, + { + "_id": "629490e476174b0004fbd22b", + "device": "AndroidAPS-DexcomG6", + "date": 1653903561000, + "dateString": "2022-05-30T09:39:21.000Z", + "isValid": true, + "sgv": 119, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T09:39:48.475Z" + }, + { + "_id": "62948fb776174b0004fbd229", + "device": "AndroidAPS-DexcomG6", + "date": 1653903261000, + "dateString": "2022-05-30T09:34:21.000Z", + "isValid": true, + "sgv": 125, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T09:34:47.315Z" + }, + { + "_id": "62948ebc76174b0004fbd227", + "device": "AndroidAPS-DexcomG6", + "date": 1653902961000, + "dateString": "2022-05-30T09:29:21.000Z", + "isValid": true, + "sgv": 131, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T09:30:36.089Z" + }, + { + "_id": "62948d5d76174b0004fbd225", + "device": "AndroidAPS-DexcomG6", + "date": 1653902661000, + "dateString": "2022-05-30T09:24:21.000Z", + "isValid": true, + "sgv": 138, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T09:24:45.006Z" + }, + { + "_id": "62948c4876174b0004fbd222", + "device": "AndroidAPS-DexcomG6", + "date": 1653902361000, + "dateString": "2022-05-30T09:19:21.000Z", + "isValid": true, + "sgv": 146, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T09:20:08.645Z" + }, + { + "_id": "62948b0276174b0004fbd21f", + "device": "AndroidAPS-DexcomG6", + "date": 1653902061000, + "dateString": "2022-05-30T09:14:21.000Z", + "isValid": true, + "sgv": 156, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T09:14:42.378Z" + }, + { + "_id": "62948a0776174b0004fbd21d", + "device": "AndroidAPS-DexcomG6", + "date": 1653901761000, + "dateString": "2022-05-30T09:09:21.000Z", + "isValid": true, + "sgv": 166, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T09:10:31.409Z" + }, + { + "_id": "629488b58ecbb3000401e2de", + "device": "AndroidAPS-DexcomG6", + "date": 1653901461000, + "dateString": "2022-05-30T09:04:21.000Z", + "isValid": true, + "sgv": 175, + "direction": "FortyFiveDown", + "type": "sgv", + "created_at": "2022-05-30T09:04:53.220Z" + }, + { + "_id": "629487878ecbb3000401e2dc", + "device": "AndroidAPS-DexcomG6", + "date": 1653901161000, + "dateString": "2022-05-30T08:59:21.000Z", + "isValid": true, + "sgv": 183, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T08:59:51.963Z" + }, + { + "_id": "6294865a8ecbb3000401e2da", + "device": "AndroidAPS-DexcomG6", + "date": 1653900861000, + "dateString": "2022-05-30T08:54:21.000Z", + "isValid": true, + "sgv": 189, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T08:54:50.449Z" + }, + { + "_id": "6294852d8ecbb3000401e2d7", + "device": "AndroidAPS-DexcomG6", + "date": 1653900561000, + "dateString": "2022-05-30T08:49:21.000Z", + "isValid": true, + "sgv": 193, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T08:49:49.550Z" + }, + { + "_id": "629484008ecbb3000401e2d3", + "device": "AndroidAPS-DexcomG6", + "date": 1653900261000, + "dateString": "2022-05-30T08:44:21.000Z", + "isValid": true, + "sgv": 195, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T08:44:48.348Z" + }, + { + "_id": "629482d28ecbb3000401e2d0", + "device": "AndroidAPS-DexcomG6", + "date": 1653899961000, + "dateString": "2022-05-30T08:39:21.000Z", + "isValid": true, + "sgv": 197, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T08:39:46.821Z" + }, + { + "_id": "629481a58ecbb3000401e2cd", + "device": "AndroidAPS-DexcomG6", + "date": 1653899661000, + "dateString": "2022-05-30T08:34:21.000Z", + "isValid": true, + "sgv": 199, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T08:34:45.627Z" + }, + { + "_id": "62948083d10aeb0004cd3ff4", + "device": "AndroidAPS-DexcomG6", + "date": 1653899361000, + "dateString": "2022-05-30T08:29:21.000Z", + "isValid": true, + "sgv": 202, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T08:29:55.869Z" + }, + { + "_id": "62947f56d10aeb0004cd3ff0", + "device": "AndroidAPS-DexcomG6", + "date": 1653899062000, + "dateString": "2022-05-30T08:24:22.000Z", + "isValid": true, + "sgv": 205, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T08:24:54.980Z" + }, + { + "_id": "62947e29d10aeb0004cd3fed", + "device": "AndroidAPS-DexcomG6", + "date": 1653898761000, + "dateString": "2022-05-30T08:19:21.000Z", + "isValid": true, + "sgv": 206, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T08:19:53.852Z" + }, + { + "_id": "62947cfcd10aeb0004cd3feb", + "device": "AndroidAPS-DexcomG6", + "date": 1653898461000, + "dateString": "2022-05-30T08:14:21.000Z", + "isValid": true, + "sgv": 207, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T08:14:52.631Z" + }, + { + "_id": "62947bcfd10aeb0004cd3fe9", + "device": "AndroidAPS-DexcomG6", + "date": 1653898161000, + "dateString": "2022-05-30T08:09:21.000Z", + "isValid": true, + "sgv": 209, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T08:09:51.204Z" + }, + { + "_id": "62947aa2d10aeb0004cd3fe7", + "device": "AndroidAPS-DexcomG6", + "date": 1653897861000, + "dateString": "2022-05-30T08:04:21.000Z", + "isValid": true, + "sgv": 213, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T08:04:50.320Z" + }, + { + "_id": "62947975d10aeb0004cd3fe5", + "device": "AndroidAPS-DexcomG6", + "date": 1653897561000, + "dateString": "2022-05-30T07:59:21.000Z", + "isValid": true, + "sgv": 217, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T07:59:49.147Z" + }, + { + "_id": "629478477e1237000471bf4e", + "device": "AndroidAPS-DexcomG6", + "date": 1653897262000, + "dateString": "2022-05-30T07:54:22.000Z", + "isValid": true, + "sgv": 219, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T07:54:47.898Z" + }, + { + "_id": "6294771a7e1237000471bf4c", + "device": "AndroidAPS-DexcomG6", + "date": 1653896961000, + "dateString": "2022-05-30T07:49:21.000Z", + "isValid": true, + "sgv": 219, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T07:49:46.684Z" + }, + { + "_id": "629475ed7e1237000471bf4a", + "device": "AndroidAPS-DexcomG6", + "date": 1653896662000, + "dateString": "2022-05-30T07:44:22.000Z", + "isValid": true, + "sgv": 218, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T07:44:45.778Z" + }, + { + "_id": "629474c07e1237000471bf48", + "device": "AndroidAPS-DexcomG6", + "date": 1653896361000, + "dateString": "2022-05-30T07:39:21.000Z", + "isValid": true, + "sgv": 217, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T07:39:44.449Z" + }, + { + "_id": "629473927e1237000471bf46", + "device": "AndroidAPS-DexcomG6", + "date": 1653896061000, + "dateString": "2022-05-30T07:34:21.000Z", + "isValid": true, + "sgv": 213, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T07:34:42.398Z" + }, + { + "_id": "629472647e1237000471bf44", + "device": "AndroidAPS-DexcomG6", + "date": 1653895761000, + "dateString": "2022-05-30T07:29:21.000Z", + "isValid": true, + "sgv": 208, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T07:29:40.917Z" + }, + { + "_id": "629471377e1237000471bf42", + "device": "AndroidAPS-DexcomG6", + "date": 1653895461000, + "dateString": "2022-05-30T07:24:21.000Z", + "isValid": true, + "sgv": 204, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T07:24:39.113Z" + }, + { + "_id": "6294700d6e1b8e0004363e09", + "device": "AndroidAPS-DexcomG6", + "date": 1653895162000, + "dateString": "2022-05-30T07:19:22.000Z", + "isValid": true, + "sgv": 202, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T07:19:41.498Z" + }, + { + "_id": "62946ee06e1b8e0004363e07", + "device": "AndroidAPS-DexcomG6", + "date": 1653894861000, + "dateString": "2022-05-30T07:14:21.000Z", + "isValid": true, + "sgv": 201, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T07:14:40.201Z" + }, + { + "_id": "62946db36e1b8e0004363e05", + "device": "AndroidAPS-DexcomG6", + "date": 1653894562000, + "dateString": "2022-05-30T07:09:22.000Z", + "isValid": true, + "sgv": 202, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T07:09:39.329Z" + }, + { + "_id": "62946c9e6e1b8e0004363e03", + "device": "AndroidAPS-DexcomG6", + "date": 1653894260000, + "dateString": "2022-05-30T07:04:20.000Z", + "isValid": true, + "sgv": 203, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T07:05:02.549Z" + }, + { + "_id": "62946b8a6e1b8e0004363e01", + "device": "AndroidAPS-DexcomG6", + "date": 1653893961000, + "dateString": "2022-05-30T06:59:21.000Z", + "isValid": true, + "sgv": 203, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T07:00:26.210Z" + }, + { + "_id": "62946a5e6e1b8e0004363dfe", + "device": "AndroidAPS-DexcomG6", + "date": 1653893661000, + "dateString": "2022-05-30T06:54:21.000Z", + "isValid": true, + "sgv": 201, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T06:55:26.117Z" + }, + { + "_id": "629469166e1b8e0004363dfc", + "device": "AndroidAPS-DexcomG6", + "date": 1653893361000, + "dateString": "2022-05-30T06:49:21.000Z", + "isValid": true, + "sgv": 198, + "direction": "SingleUp", + "type": "sgv", + "created_at": "2022-05-30T06:49:58.419Z" + }, + { + "_id": "629467e1b82b320004ef5ed5", + "device": "AndroidAPS-DexcomG6", + "date": 1653893061000, + "dateString": "2022-05-30T06:44:21.000Z", + "isValid": true, + "sgv": 193, + "direction": "SingleUp", + "type": "sgv", + "created_at": "2022-05-30T06:44:49.181Z" + }, + { + "_id": "629466b3b82b320004ef5ed3", + "device": "AndroidAPS-DexcomG6", + "date": 1653892761000, + "dateString": "2022-05-30T06:39:21.000Z", + "isValid": true, + "sgv": 185, + "direction": "DoubleUp", + "type": "sgv", + "created_at": "2022-05-30T06:39:47.469Z" + }, + { + "_id": "62946586b82b320004ef5ed1", + "device": "AndroidAPS-DexcomG6", + "date": 1653892461000, + "dateString": "2022-05-30T06:34:21.000Z", + "isValid": true, + "sgv": 173, + "direction": "DoubleUp", + "type": "sgv", + "created_at": "2022-05-30T06:34:46.169Z" + }, + { + "_id": "62946458b82b320004ef5ecf", + "device": "AndroidAPS-DexcomG6", + "date": 1653892161000, + "dateString": "2022-05-30T06:29:21.000Z", + "isValid": true, + "sgv": 157, + "direction": "DoubleUp", + "type": "sgv", + "created_at": "2022-05-30T06:29:44.223Z" + }, + { + "_id": "6294632ab82b320004ef5ecc", + "device": "AndroidAPS-DexcomG6", + "date": 1653891861000, + "dateString": "2022-05-30T06:24:21.000Z", + "isValid": true, + "sgv": 137, + "direction": "SingleUp", + "type": "sgv", + "created_at": "2022-05-30T06:24:42.093Z" + }, + { + "_id": "62946214b82b320004ef5ec6", + "device": "AndroidAPS-DexcomG6", + "date": 1653891561000, + "dateString": "2022-05-30T06:19:21.000Z", + "isValid": true, + "sgv": 118, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T06:20:04.840Z" + }, + { + "_id": "629460cdb82b320004ef5ec4", + "device": "AndroidAPS-DexcomG6", + "date": 1653891261000, + "dateString": "2022-05-30T06:14:21.000Z", + "isValid": true, + "sgv": 101, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T06:14:37.040Z" + }, + { + "_id": "62945faad2cadd0004350d89", + "device": "AndroidAPS-DexcomG6", + "date": 1653890961000, + "dateString": "2022-05-30T06:09:21.000Z", + "isValid": true, + "sgv": 92, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T06:09:46.664Z" + }, + { + "_id": "62945e7cd2cadd0004350d86", + "device": "AndroidAPS-DexcomG6", + "date": 1653890661000, + "dateString": "2022-05-30T06:04:21.000Z", + "isValid": true, + "sgv": 89, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T06:04:44.141Z" + }, + { + "_id": "62945d4dd2cadd0004350d83", + "device": "AndroidAPS-DexcomG6", + "date": 1653890361000, + "dateString": "2022-05-30T05:59:21.000Z", + "isValid": true, + "sgv": 90, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T05:59:41.863Z" + }, + { + "_id": "62945c38d2cadd0004350d80", + "device": "AndroidAPS-DexcomG6", + "date": 1653890061000, + "dateString": "2022-05-30T05:54:21.000Z", + "isValid": true, + "sgv": 92, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T05:55:04.735Z" + }, + { + "_id": "62945b0bd2cadd0004350d7d", + "device": "AndroidAPS-DexcomG6", + "date": 1653889761000, + "dateString": "2022-05-30T05:49:21.000Z", + "isValid": true, + "sgv": 94, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T05:50:03.127Z" + }, + { + "_id": "629459ddd2cadd0004350d7a", + "device": "AndroidAPS-DexcomG6", + "date": 1653889461000, + "dateString": "2022-05-30T05:44:21.000Z", + "isValid": true, + "sgv": 96, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T05:45:01.449Z" + }, + { + "_id": "629458b0d2cadd0004350d76", + "device": "AndroidAPS-DexcomG6", + "date": 1653889161000, + "dateString": "2022-05-30T05:39:21.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T05:40:00.401Z" + }, + { + "_id": "6294577513be4d00048f99e3", + "device": "AndroidAPS-DexcomG6", + "date": 1653888862000, + "dateString": "2022-05-30T05:34:22.000Z", + "isValid": true, + "sgv": 99, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T05:34:45.547Z" + }, + { + "_id": "6294564813be4d00048f99e0", + "device": "AndroidAPS-DexcomG6", + "date": 1653888561000, + "dateString": "2022-05-30T05:29:21.000Z", + "isValid": true, + "sgv": 101, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T05:29:44.188Z" + }, + { + "_id": "6294551a13be4d00048f99dd", + "device": "AndroidAPS-DexcomG6", + "date": 1653888261000, + "dateString": "2022-05-30T05:24:21.000Z", + "isValid": true, + "sgv": 100, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T05:24:42.074Z" + }, + { + "_id": "6294540513be4d00048f99d9", + "device": "AndroidAPS-DexcomG6", + "date": 1653887961000, + "dateString": "2022-05-30T05:19:21.000Z", + "isValid": true, + "sgv": 99, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T05:20:05.981Z" + }, + { + "_id": "629452bf13be4d00048f99d7", + "device": "AndroidAPS-DexcomG6", + "date": 1653887661000, + "dateString": "2022-05-30T05:14:21.000Z", + "isValid": true, + "sgv": 98, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T05:14:39.295Z" + }, + { + "_id": "629451ab13be4d00048f99d4", + "device": "AndroidAPS-DexcomG6", + "date": 1653887361000, + "dateString": "2022-05-30T05:09:21.000Z", + "isValid": true, + "sgv": 99, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T05:10:03.174Z" + }, + { + "_id": "6294506dc0f24700048ea5f8", + "device": "AndroidAPS-DexcomG6", + "date": 1653887061000, + "dateString": "2022-05-30T05:04:21.000Z", + "isValid": true, + "sgv": 102, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T05:04:45.582Z" + }, + { + "_id": "62944f3fc0f24700048ea5f6", + "device": "AndroidAPS-DexcomG6", + "date": 1653886761000, + "dateString": "2022-05-30T04:59:21.000Z", + "isValid": true, + "sgv": 105, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T04:59:43.617Z" + }, + { + "_id": "62944e11c0f24700048ea5f3", + "device": "AndroidAPS-DexcomG6", + "date": 1653886461000, + "dateString": "2022-05-30T04:54:21.000Z", + "isValid": true, + "sgv": 108, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T04:54:41.186Z" + }, + { + "_id": "62944ce3c0f24700048ea5f1", + "device": "AndroidAPS-DexcomG6", + "date": 1653886161000, + "dateString": "2022-05-30T04:49:21.000Z", + "isValid": true, + "sgv": 110, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T04:49:39.435Z" + }, + { + "_id": "62944bb6c0f24700048ea5ee", + "device": "AndroidAPS-DexcomG6", + "date": 1653885861000, + "dateString": "2022-05-30T04:44:21.000Z", + "isValid": true, + "sgv": 112, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T04:44:38.372Z" + }, + { + "_id": "62944aa1c0f24700048ea5e9", + "device": "AndroidAPS-DexcomG6", + "date": 1653885561000, + "dateString": "2022-05-30T04:39:21.000Z", + "isValid": true, + "sgv": 112, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T04:40:01.830Z" + }, + { + "_id": "62944973c0f24700048ea5e7", + "device": "AndroidAPS-DexcomG6", + "date": 1653885261000, + "dateString": "2022-05-30T04:34:21.000Z", + "isValid": true, + "sgv": 112, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T04:34:59.937Z" + }, + { + "_id": "62944846c0f24700048ea5e4", + "device": "AndroidAPS-DexcomG6", + "date": 1653884961000, + "dateString": "2022-05-30T04:29:21.000Z", + "isValid": true, + "sgv": 112, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T04:29:58.536Z" + }, + { + "_id": "6294470ac319020004344fc1", + "device": "AndroidAPS-DexcomG6", + "date": 1653884661000, + "dateString": "2022-05-30T04:24:21.000Z", + "isValid": true, + "sgv": 114, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T04:24:42.523Z" + }, + { + "_id": "629445f6c319020004344fbe", + "device": "AndroidAPS-DexcomG6", + "date": 1653884361000, + "dateString": "2022-05-30T04:19:21.000Z", + "isValid": true, + "sgv": 115, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T04:20:06.094Z" + }, + { + "_id": "629444afc319020004344fba", + "device": "AndroidAPS-DexcomG6", + "date": 1653884061000, + "dateString": "2022-05-30T04:14:21.000Z", + "isValid": true, + "sgv": 114, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T04:14:39.235Z" + }, + { + "_id": "6294439ac319020004344fb7", + "device": "AndroidAPS-DexcomG6", + "date": 1653883761000, + "dateString": "2022-05-30T04:09:21.000Z", + "isValid": true, + "sgv": 115, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T04:10:02.526Z" + }, + { + "_id": "6294426dc319020004344fb4", + "device": "AndroidAPS-DexcomG6", + "date": 1653883461000, + "dateString": "2022-05-30T04:04:21.000Z", + "isValid": true, + "sgv": 116, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T04:05:01.284Z" + }, + { + "_id": "6294413fc319020004344fb0", + "device": "AndroidAPS-DexcomG6", + "date": 1653883161000, + "dateString": "2022-05-30T03:59:21.000Z", + "isValid": true, + "sgv": 119, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T03:59:59.474Z" + }, + { + "_id": "6294400aa743da00044e28eb", + "device": "AndroidAPS-DexcomG6", + "date": 1653882861000, + "dateString": "2022-05-30T03:54:21.000Z", + "isValid": true, + "sgv": 121, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T03:54:50.162Z" + }, + { + "_id": "62943edca743da00044e28e9", + "device": "AndroidAPS-DexcomG6", + "date": 1653882561000, + "dateString": "2022-05-30T03:49:21.000Z", + "isValid": true, + "sgv": 124, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T03:49:48.266Z" + }, + { + "_id": "62943daea743da00044e28e7", + "device": "AndroidAPS-DexcomG6", + "date": 1653882261000, + "dateString": "2022-05-30T03:44:21.000Z", + "isValid": true, + "sgv": 126, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T03:44:46.579Z" + }, + { + "_id": "62943c81a743da00044e28e5", + "device": "AndroidAPS-DexcomG6", + "date": 1653881961000, + "dateString": "2022-05-30T03:39:21.000Z", + "isValid": true, + "sgv": 128, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T03:39:45.390Z" + }, + { + "_id": "62943b53a743da00044e28e2", + "device": "AndroidAPS-DexcomG6", + "date": 1653881661000, + "dateString": "2022-05-30T03:34:21.000Z", + "isValid": true, + "sgv": 131, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T03:34:43.850Z" + }, + { + "_id": "62943a26a743da00044e28de", + "device": "AndroidAPS-DexcomG6", + "date": 1653881361000, + "dateString": "2022-05-30T03:29:21.000Z", + "isValid": true, + "sgv": 131, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T03:29:42.328Z" + }, + { + "_id": "629438f8a743da00044e28dc", + "device": "AndroidAPS-DexcomG6", + "date": 1653881062000, + "dateString": "2022-05-30T03:24:22.000Z", + "isValid": true, + "sgv": 131, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T03:24:40.834Z" + }, + { + "_id": "629437dfa365640004d83cc9", + "device": "AndroidAPS-DexcomG6", + "date": 1653880761000, + "dateString": "2022-05-30T03:19:21.000Z", + "isValid": true, + "sgv": 128, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T03:19:59.695Z" + }, + { + "_id": "629436b0a365640004d83cc5", + "device": "AndroidAPS-DexcomG6", + "date": 1653880461000, + "dateString": "2022-05-30T03:14:21.000Z", + "isValid": true, + "sgv": 125, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T03:14:56.027Z" + }, + { + "_id": "62943582a365640004d83cc3", + "device": "AndroidAPS-DexcomG6", + "date": 1653880161000, + "dateString": "2022-05-30T03:09:21.000Z", + "isValid": true, + "sgv": 119, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T03:09:54.494Z" + }, + { + "_id": "62943454a365640004d83cc0", + "device": "AndroidAPS-DexcomG6", + "date": 1653879861000, + "dateString": "2022-05-30T03:04:21.000Z", + "isValid": true, + "sgv": 114, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T03:04:52.790Z" + }, + { + "_id": "62943327a365640004d83cbe", + "device": "AndroidAPS-DexcomG6", + "date": 1653879561000, + "dateString": "2022-05-30T02:59:21.000Z", + "isValid": true, + "sgv": 108, + "direction": "FortyFiveUp", + "type": "sgv", + "created_at": "2022-05-30T02:59:51.442Z" + }, + { + "_id": "629431f9a365640004d83cb9", + "device": "AndroidAPS-DexcomG6", + "date": 1653879261000, + "dateString": "2022-05-30T02:54:21.000Z", + "isValid": true, + "sgv": 102, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T02:54:49.321Z" + }, + { + "_id": "629430c1ee9e6e00046d7ff7", + "device": "AndroidAPS-DexcomG6", + "date": 1653878961000, + "dateString": "2022-05-30T02:49:21.000Z", + "isValid": true, + "sgv": 96, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T02:49:37.117Z" + }, + { + "_id": "62942facee9e6e00046d7ff2", + "device": "AndroidAPS-DexcomG6", + "date": 1653878661000, + "dateString": "2022-05-30T02:44:21.000Z", + "isValid": true, + "sgv": 91, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T02:45:00.369Z" + }, + { + "_id": "62942e7fee9e6e00046d7fef", + "device": "AndroidAPS-DexcomG6", + "date": 1653878361000, + "dateString": "2022-05-30T02:39:21.000Z", + "isValid": true, + "sgv": 86, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T02:39:59.070Z" + }, + { + "_id": "62942d51ee9e6e00046d7fec", + "device": "AndroidAPS-DexcomG6", + "date": 1653878061000, + "dateString": "2022-05-30T02:34:21.000Z", + "isValid": true, + "sgv": 82, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T02:34:57.498Z" + }, + { + "_id": "62942c24ee9e6e00046d7fea", + "device": "AndroidAPS-DexcomG6", + "date": 1653877761000, + "dateString": "2022-05-30T02:29:21.000Z", + "isValid": true, + "sgv": 78, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T02:29:56.392Z" + }, + { + "_id": "62942af6ee9e6e00046d7fe8", + "device": "AndroidAPS-DexcomG6", + "date": 1653877461000, + "dateString": "2022-05-30T02:24:21.000Z", + "isValid": true, + "sgv": 76, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T02:24:54.787Z" + }, + { + "_id": "629429caee9e6e00046d7fe6", + "device": "AndroidAPS-DexcomG6", + "date": 1653877161000, + "dateString": "2022-05-30T02:19:21.000Z", + "isValid": true, + "sgv": 75, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T02:19:54.580Z" + }, + { + "_id": "6294289bee9e6e00046d7fe4", + "device": "AndroidAPS-DexcomG6", + "date": 1653876861000, + "dateString": "2022-05-30T02:14:21.000Z", + "isValid": true, + "sgv": 74, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T02:14:51.815Z" + }, + { + "_id": "6294276aa90f7f00040c0d4f", + "device": "AndroidAPS-DexcomG6", + "date": 1653876561000, + "dateString": "2022-05-30T02:09:21.000Z", + "isValid": true, + "sgv": 71, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T02:09:46.033Z" + }, + { + "_id": "6294263ca90f7f00040c0d4b", + "device": "AndroidAPS-DexcomG6", + "date": 1653876261000, + "dateString": "2022-05-30T02:04:21.000Z", + "isValid": true, + "sgv": 67, + "direction": "Flat", + "type": "sgv", + "created_at": "2022-05-30T02:04:44.630Z" + } +] diff --git a/app/src/test/res/autotune/test4/ns-treatments.2022-05-30.json b/app/src/test/res/autotune/test4/ns-treatments.2022-05-30.json new file mode 100644 index 0000000000..ac55f897b2 --- /dev/null +++ b/app/src/test/res/autotune/test4/ns-treatments.2022-05-30.json @@ -0,0 +1,7512 @@ +[ + { + "_id": "62963a9affe824000451d511", + "created_at": "2022-05-31T15:55:45.525Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 314975, + "type": "NORMAL", + "rate": 1.1144, + "percent": 40, + "pumpId": 458546, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458549, + "carbs": null, + "insulin": null + }, + { + "_id": "6296396dffe824000451d50d", + "created_at": "2022-05-31T15:50:55.954Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 288078, + "type": "NORMAL", + "rate": 0.398, + "percent": -50, + "pumpId": 458543, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458545, + "carbs": null, + "insulin": null + }, + { + "_id": "62963847ed7ec900040113c5", + "created_at": "2022-05-31T15:45:57.641Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 296825, + "type": "NORMAL", + "rate": 0.8756, + "percent": 10, + "pumpId": 458540, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458542, + "carbs": null, + "insulin": null + }, + { + "_id": "629635eced7ec900040113c0", + "created_at": "2022-05-31T15:35:54.821Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 601330, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458537, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458539, + "carbs": null, + "insulin": null + }, + { + "_id": "629634bfed7ec900040113bd", + "created_at": "2022-05-31T15:30:57.455Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 295873, + "type": "NORMAL", + "rate": 0.7164, + "percent": -10, + "pumpId": 458534, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458536, + "carbs": null, + "insulin": null + }, + { + "_id": "62963391ed7ec900040113ba", + "created_at": "2022-05-31T15:26:05.836Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 290166, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458531, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458533, + "carbs": null, + "insulin": null + }, + { + "_id": "62963264ed7ec900040113b7", + "created_at": "2022-05-31T15:20:49.875Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 314466, + "type": "NORMAL", + "rate": 0.5572, + "percent": -30, + "pumpId": 458528, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458530, + "carbs": null, + "insulin": null + }, + { + "_id": "62963150ed7ec900040113b4", + "created_at": "2022-05-31T15:16:16.934Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 271450, + "type": "NORMAL", + "rate": 1.1144, + "percent": 40, + "pumpId": 458525, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458527, + "carbs": null, + "insulin": null + }, + { + "_id": "62962dbc7ae53f0004811958", + "created_at": "2022-05-31T15:00:52.574Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 15, + "durationInMilliseconds": 921872, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458521, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458524, + "carbs": null, + "insulin": null + }, + { + "_id": "62962ca87ae53f0004811955", + "created_at": "2022-05-31T14:56:17.286Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 273797, + "type": "NORMAL", + "rate": 0.2298, + "percent": -70, + "pumpId": 458517, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458520, + "carbs": null, + "insulin": null + }, + { + "_id": "62962b617ae53f0004811950", + "eventType": "Correction Bolus", + "insulin": 0.56, + "created_at": "2022-05-31T14:51:06.048Z", + "date": 1654008666048, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22053, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62962b627ae53f0004811951", + "created_at": "2022-05-31T14:51:04.151Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 303998, + "type": "FAKE_EXTENDED", + "rate": 2.1870619806709257, + "absolute": 2.1870619806709257, + "pumpId": 22052, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-31T14:51:04.151Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 5, + "durationInMilliseconds": 303998, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.12, + "relative": 1.4210619806709255, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 22052, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "carbs": null, + "insulin": null + }, + { + "_id": "629627c9782bd30004aefa36", + "created_at": "2022-05-31T14:35:43.988Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 315953, + "type": "NORMAL", + "rate": 1.149, + "percent": 50, + "pumpId": 458505, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458507, + "carbs": null, + "insulin": null + }, + { + "_id": "629626b3782bd30004aefa33", + "created_at": "2022-05-31T14:31:05.848Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 274656, + "type": "NORMAL", + "rate": 0.8426, + "percent": 10, + "pumpId": 458502, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458504, + "carbs": null, + "insulin": null + }, + { + "_id": "62962457782bd30004aefa2e", + "created_at": "2022-05-31T14:21:07.305Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 597048, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458499, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458501, + "carbs": null, + "insulin": null + }, + { + "_id": "6296232a782bd30004aefa2b", + "created_at": "2022-05-31T14:16:02.177Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 303634, + "type": "NORMAL", + "rate": 0.0766, + "percent": -90, + "pumpId": 458496, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458498, + "carbs": null, + "insulin": null + }, + { + "_id": "629621fd782bd30004aefa28", + "created_at": "2022-05-31T14:11:06.835Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 292851, + "type": "NORMAL", + "rate": 0.1532, + "percent": -80, + "pumpId": 458493, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458495, + "carbs": null, + "insulin": null + }, + { + "_id": "629620cf782bd30004aefa23", + "eventType": "Correction Bolus", + "insulin": 0.22, + "created_at": "2022-05-31T14:05:54.808Z", + "date": 1654005954808, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22051, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "629620d0782bd30004aefa25", + "created_at": "2022-05-31T14:05:52.184Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 313165, + "type": "NORMAL", + "rate": 1.6852, + "percent": 120, + "pumpId": 458488, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458492, + "carbs": null, + "insulin": null + }, + { + "_id": "62961e7571108b0004a2c2b1", + "created_at": "2022-05-31T13:55:43.116Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 606574, + "type": "NORMAL", + "rate": 0.0785, + "percent": -90, + "pumpId": 458484, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458487, + "carbs": null, + "insulin": null + }, + { + "_id": "62961aec71108b0004a2c2aa", + "created_at": "2022-05-31T13:40:48.851Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 891771, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458481, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458483, + "carbs": null, + "insulin": null + }, + { + "_id": "629619d771108b0004a2c2a7", + "created_at": "2022-05-31T13:36:03.349Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 284007, + "type": "NORMAL", + "rate": 0.47100000000000003, + "percent": -40, + "pumpId": 458478, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458480, + "carbs": null, + "insulin": null + }, + { + "_id": "629618aa71108b0004a2c2a2", + "eventType": "Correction Bolus", + "insulin": 0.7, + "created_at": "2022-05-31T13:31:19.636Z", + "date": 1654003879636, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22050, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "629618aa71108b0004a2c2a3", + "created_at": "2022-05-31T13:31:17.510Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 277000, + "type": "FAKE_EXTENDED", + "rate": 2.6044945848375454, + "absolute": 2.6044945848375454, + "pumpId": 22049, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-31T13:31:17.510Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 4, + "durationInMilliseconds": 277000, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.14, + "relative": 1.8194945848375452, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 22049, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "carbs": null, + "insulin": null + }, + { + "_id": "6296176aec644a0004f646cb", + "created_at": "2022-05-31T13:25:57.102Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 309193, + "type": "NORMAL", + "rate": 0.7065, + "percent": -10, + "pumpId": 458466, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458468, + "carbs": null, + "insulin": null + }, + { + "_id": "6296163cec644a0004f646c8", + "created_at": "2022-05-31T13:20:50.571Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 304039, + "type": "NORMAL", + "rate": 0.23550000000000001, + "percent": -70, + "pumpId": 458463, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458465, + "carbs": null, + "insulin": null + }, + { + "_id": "6296150fec644a0004f646c5", + "created_at": "2022-05-31T13:15:52.525Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 296557, + "type": "NORMAL", + "rate": 0.314, + "percent": -60, + "pumpId": 458460, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458462, + "carbs": null, + "insulin": null + }, + { + "_id": "629613e2ec644a0004f646c0", + "eventType": "Correction Bolus", + "insulin": 0.1, + "created_at": "2022-05-31T13:10:42.660Z", + "date": 1654002642660, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22048, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "629613e2ec644a0004f646c2", + "created_at": "2022-05-31T13:10:40.813Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 310221, + "type": "NORMAL", + "rate": 1.1775, + "percent": 50, + "pumpId": 458455, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458459, + "carbs": null, + "insulin": null + }, + { + "_id": "629612b5ec644a0004f646be", + "created_at": "2022-05-31T13:05:40.990Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 298326, + "type": "NORMAL", + "rate": 1.727, + "percent": 120, + "pumpId": 458452, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458454, + "carbs": null, + "insulin": null + }, + { + "_id": "62961187ec644a0004f646b9", + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-31T13:00:49.822Z", + "date": 1654002049822, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22047, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62961188ec644a0004f646bb", + "created_at": "2022-05-31T13:00:47.826Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 289674, + "type": "NORMAL", + "rate": 1.256, + "percent": 60, + "pumpId": 458447, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458451, + "carbs": null, + "insulin": null + }, + { + "_id": "6296105aec644a0004f646b7", + "created_at": "2022-05-31T12:55:41.225Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 305119, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458444, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458446, + "carbs": null, + "insulin": null + }, + { + "_id": "62960f36ec644a0004f646b4", + "created_at": "2022-05-31T12:50:59.948Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 278782, + "type": "NORMAL", + "rate": 0.5495, + "percent": -30, + "pumpId": 458441, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458443, + "carbs": null, + "insulin": null + }, + { + "_id": "62960e3bec644a0004f646b0", + "eventType": "Correction Bolus", + "insulin": 0.24, + "created_at": "2022-05-31T12:46:28.352Z", + "date": 1654001188352, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22046, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62960e3bec644a0004f646b1", + "created_at": "2022-05-31T12:46:25.161Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 272298, + "type": "NORMAL", + "rate": 1.727, + "percent": 120, + "pumpId": 458436, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458440, + "carbs": null, + "insulin": null + }, + { + "_id": "62960cdcec644a0004f646ad", + "created_at": "2022-05-31T12:40:49.763Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 332910, + "type": "NORMAL", + "rate": 0.47100000000000003, + "percent": -40, + "pumpId": 458433, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458435, + "carbs": null, + "insulin": null + }, + { + "_id": "62960be0ec644a0004f646a8", + "eventType": "Correction Bolus", + "insulin": 0.28, + "created_at": "2022-05-31T12:36:14.179Z", + "date": 1654000574179, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22045, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62960be1ec644a0004f646aa", + "created_at": "2022-05-31T12:36:11.223Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 277044, + "type": "NORMAL", + "rate": 1.8840000000000001, + "percent": 140, + "pumpId": 458428, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458432, + "carbs": null, + "insulin": null + }, + { + "_id": "62960a94966c80000421aa3b", + "created_at": "2022-05-31T12:31:08.722Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 300011, + "type": "NORMAL", + "rate": 0.47100000000000003, + "percent": -40, + "pumpId": 458425, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458427, + "carbs": null, + "insulin": null + }, + { + "_id": "62960839966c80000421aa35", + "created_at": "2022-05-31T12:20:54.748Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 612487, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458422, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458424, + "carbs": null, + "insulin": null + }, + { + "_id": "6296070b966c80000421aa32", + "eventType": "Correction Bolus", + "insulin": 0.22, + "created_at": "2022-05-31T12:16:09.374Z", + "date": 1653999369374, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22044, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "629604b1966c80000421aa2e", + "created_at": "2022-05-31T12:05:58.926Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 597042, + "type": "NORMAL", + "rate": 1.099, + "percent": 40, + "pumpId": 458414, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458416, + "carbs": null, + "insulin": null + }, + { + "_id": "6295ffffa56c4d0004cb3049", + "eventType": "Correction Bolus", + "insulin": 0.26, + "created_at": "2022-05-31T11:45:55.935Z", + "date": 1653997555935, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22043, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295fda5a56c4d0004cb3044", + "eventType": "Correction Bolus", + "insulin": 0.3, + "created_at": "2022-05-31T11:35:54.935Z", + "date": 1653996954935, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22042, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295fb4aa56c4d0004cb3040", + "created_at": "2022-05-31T11:25:53.977Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 40, + "durationInMilliseconds": 2402460, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458406, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458413, + "carbs": null, + "insulin": null + }, + { + "_id": "6295f90bbf97420004aee32c", + "eventType": "Correction Bolus", + "insulin": 0.34, + "created_at": "2022-05-31T11:16:21.275Z", + "date": 1653995781275, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22041, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295f697bf97420004aee327", + "eventType": "Correction Bolus", + "insulin": 0.5, + "created_at": "2022-05-31T11:05:41.260Z", + "date": 1653995141260, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22040, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295f328bf97420004aee321", + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-31T10:51:00.280Z", + "date": 1653994260280, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22039, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295f1e4bf97420004aee31d", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-31T10:45:38.620Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "23g de glucides requis dans 0 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6295f0b6bf97420004aee31a", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-31T10:40:30.473Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "22g de glucides requis dans 0 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6295ef8d1d475d00043d0b6f", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-31T10:35:33.359Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "24g de glucides requis dans 0 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6295ee781d475d00043d0b6c", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-31T10:31:01.436Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "24g de glucides requis dans 0 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6295eaef1d475d00043d0b66", + "created_at": "2022-05-31T10:16:09.113Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 69, + "durationInMilliseconds": 4182376, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458396, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458405, + "carbs": null, + "insulin": null + }, + { + "_id": "6295ea571d475d00043d0b61", + "eventType": "Meal Bolus", + "insulin": 7.82, + "created_at": "2022-05-31T10:13:24.185Z", + "date": 1653992004185, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 22038, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295ea581d475d00043d0b62", + "eventType": "Bolus Wizard", + "created_at": "2022-05-31T10:13:20.467Z", + "isValid": true, + "bolusCalculatorResult": "{\"basalIOB\":0.889,\"bolusIOB\":-0.461,\"carbs\":50.0,\"carbsInsulin\":8.517881724303429,\"cob\":0.0,\"cobInsulin\":0.0,\"dateCreated\":1653992000540,\"glucoseDifference\":-14.0,\"glucoseInsulin\":-0.17423155747919142,\"glucoseTrend\":-2.22,\"glucoseValue\":76.0,\"ic\":5.870004024279742,\"id\":1584,\"interfaceIDs_backing\":{},\"isValid\":true,\"isf\":80.3528373536581,\"note\":\"\",\"otherCorrection\":0.0,\"percentageCorrection\":90,\"profileName\":\"Working days\",\"superbolusInsulin\":0.0,\"targetBGHigh\":90.0,\"targetBGLow\":90.0,\"timestamp\":1653992000467,\"totalInsulin\":7.82,\"trendInsulin\":-0.08288444091510105,\"utcOffset\":7200000,\"version\":0,\"wasBasalIOBUsed\":true,\"wasBolusIOBUsed\":true,\"wasCOBUsed\":true,\"wasGlucoseUsed\":true,\"wasSuperbolusUsed\":false,\"wasTempTargetUsed\":false,\"wasTrendUsed\":true,\"wereCarbsUsed\":false}", + "date": 1653992000467, + "glucose": 76, + "units": "mg/dl", + "notes": "", + "carbs": null, + "insulin": null + }, + { + "_id": "6295ea711d475d00043d0b63", + "eventType": "Meal Bolus", + "carbs": 50, + "created_at": "2022-05-31T10:13:20.466Z", + "isValid": true, + "date": 1653992000466, + "insulin": null + }, + { + "_id": "6295e50d430fe80004dfa709", + "created_at": "2022-05-31T09:50:49.679Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 25, + "durationInMilliseconds": 1516949, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458390, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458395, + "carbs": null, + "insulin": null + }, + { + "_id": "6295e4f4430fe80004dfa706", + "eventType": "Temporary Target", + "duration": 60, + "durationInMilliseconds": 3600000, + "isValid": true, + "created_at": "2022-05-31T09:50:20.858Z", + "timestamp": 1653990620858, + "enteredBy": "AndroidAPS", + "reason": "Automation", + "targetBottom": 110, + "targetTop": 110, + "units": "mg/dl", + "carbs": null, + "insulin": null + }, + { + "_id": "6295e182430fe80004dfa700", + "created_at": "2022-05-31T09:35:51.419Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 896767, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458387, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458389, + "carbs": null, + "insulin": null + }, + { + "_id": "6295dbb4dc3ee20004e984bf", + "created_at": "2022-05-31T09:10:57.236Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 24, + "durationInMilliseconds": 1492691, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458384, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458386, + "carbs": null, + "insulin": null + }, + { + "_id": "6295dad2dc3ee20004e984bc", + "created_at": "2022-05-31T09:07:19.890Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 3, + "durationInMilliseconds": 214851, + "type": "NORMAL", + "rate": 0.4824, + "percent": -40, + "pumpId": 458381, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458383, + "carbs": null, + "insulin": null + }, + { + "_id": "6295d957dc3ee20004e984b7", + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-31T09:01:05.878Z", + "date": 1653987665878, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22037, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295d958dc3ee20004e984b9", + "created_at": "2022-05-31T09:01:03.881Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 6, + "durationInMilliseconds": 374522, + "type": "NORMAL", + "rate": 1.4472, + "percent": 80, + "pumpId": 458376, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458380, + "carbs": null, + "insulin": null + }, + { + "_id": "6295d829dc3ee20004e984b5", + "created_at": "2022-05-31T08:55:52.338Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 310053, + "type": "NORMAL", + "rate": 0.1602, + "percent": -80, + "pumpId": 458372, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458375, + "carbs": null, + "insulin": null + }, + { + "_id": "6295d6fbdc3ee20004e984b2", + "created_at": "2022-05-31T08:50:59.593Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 291248, + "type": "NORMAL", + "rate": 0.3204, + "percent": -60, + "pumpId": 458369, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458371, + "carbs": null, + "insulin": null + }, + { + "_id": "6295d5e6dc3ee20004e984af", + "created_at": "2022-05-31T08:46:09.430Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 288668, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458366, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458368, + "carbs": null, + "insulin": null + }, + { + "_id": "6295d4a917528a00041c16aa", + "created_at": "2022-05-31T08:41:04.984Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 302951, + "type": "NORMAL", + "rate": 0.4005, + "percent": -50, + "pumpId": 458362, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458365, + "carbs": null, + "insulin": null + }, + { + "_id": "6295d39417528a00041c16a7", + "created_at": "2022-05-31T08:36:11.245Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 292243, + "type": "NORMAL", + "rate": 1.0413000000000001, + "percent": 30, + "pumpId": 458359, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458361, + "carbs": null, + "insulin": null + }, + { + "_id": "6295d37b17528a00041c16a5", + "created_at": "2022-05-31T08:35:51.495Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 17254, + "type": "NORMAL", + "rate": 0.1602, + "percent": -80, + "pumpId": 458356, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458358, + "carbs": null, + "insulin": null + }, + { + "_id": "6295d24d17528a00041c16a2", + "created_at": "2022-05-31T08:31:04.097Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 285901, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458353, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458355, + "carbs": null, + "insulin": null + }, + { + "_id": "6295d11f17528a00041c169d", + "eventType": "Correction Bolus", + "insulin": 0.22, + "created_at": "2022-05-31T08:25:49.866Z", + "date": 1653985549866, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22036, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295d11f17528a00041c169f", + "created_at": "2022-05-31T08:25:47.757Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 313849, + "type": "NORMAL", + "rate": 0.4005, + "percent": -50, + "pumpId": 458348, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458352, + "carbs": null, + "insulin": null + }, + { + "_id": "6295cc8310cb0b00043ae4d4", + "created_at": "2022-05-31T08:06:06.036Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 19, + "durationInMilliseconds": 1180230, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458345, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458347, + "carbs": null, + "insulin": null + }, + { + "_id": "6295cb8710cb0b00043ae4d1", + "eventType": "Correction Bolus", + "insulin": 0.24, + "created_at": "2022-05-31T08:02:00.225Z", + "date": 1653984120225, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22035, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295cb8710cb0b00043ae4d0", + "created_at": "2022-05-31T08:01:56.099Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 247447, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458340, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458344, + "carbs": null, + "insulin": null + }, + { + "_id": "6295ca2710cb0b00043ae4cb", + "eventType": "Correction Bolus", + "insulin": 0.68, + "created_at": "2022-05-31T07:56:12.084Z", + "date": 1653983772084, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22034, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295ca2710cb0b00043ae4cc", + "created_at": "2022-05-31T07:56:09.536Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 337000, + "type": "FAKE_EXTENDED", + "rate": 3.580448071216617, + "absolute": 3.580448071216617, + "pumpId": 22033, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-31T07:56:09.536Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 5, + "durationInMilliseconds": 337000, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.26, + "relative": 2.777448071216617, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 22033, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "carbs": null, + "insulin": null + }, + { + "_id": "6295c1e80030950004c0a3e0", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-31T07:20:47.689Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "10g de glucides requis dans 35 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6295c0ba0030950004c0a3de", + "created_at": "2022-05-31T07:16:05.967Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 39, + "durationInMilliseconds": 2392475, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458327, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458329, + "carbs": null, + "insulin": null + }, + { + "_id": "6295bf8c0030950004c0a3db", + "created_at": "2022-05-31T07:10:59.023Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 304456, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458324, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458326, + "carbs": null, + "insulin": null + }, + { + "_id": "6295bc370030950004c0a3d2", + "eventType": "Correction Bolus", + "insulin": 0.34, + "created_at": "2022-05-31T06:56:47.742Z", + "date": 1653980207742, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22032, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295baf00030950004c0a3d0", + "eventType": "Correction Bolus", + "insulin": 0.48, + "created_at": "2022-05-31T06:51:07.013Z", + "date": 1653979867013, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22031, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295b8a4469d4a0004784123", + "eventType": "Correction Bolus", + "insulin": 0.28, + "created_at": "2022-05-31T06:41:23.663Z", + "date": 1653979283663, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22030, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295b8a4469d4a0004784125", + "created_at": "2022-05-31T06:41:19.552Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1776988, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458313, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458323, + "carbs": null, + "insulin": null + }, + { + "_id": "6295b776469d4a0004784121", + "created_at": "2022-05-31T06:36:23.889Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 294183, + "type": "NORMAL", + "rate": 1.1326, + "percent": 40, + "pumpId": 458310, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458312, + "carbs": null, + "insulin": null + }, + { + "_id": "6295adea469d4a000478410e", + "created_at": "2022-05-31T05:55:38.593Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 40, + "durationInMilliseconds": 2443824, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458306, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458309, + "carbs": null, + "insulin": null + }, + { + "_id": "6295ad85469d4a0004784109", + "eventType": "Meal Bolus", + "insulin": 13.82, + "created_at": "2022-05-31T05:53:55.558Z", + "date": 1653976435558, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 22029, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295ad9e469d4a000478410b", + "eventType": "Meal Bolus", + "carbs": 75, + "created_at": "2022-05-31T05:53:53.211Z", + "isValid": true, + "date": 1653976433211, + "insulin": null + }, + { + "_id": "6295ad85469d4a000478410a", + "eventType": "Bolus Wizard", + "created_at": "2022-05-31T05:53:53.211Z", + "isValid": true, + "bolusCalculatorResult": "{\"basalIOB\":0.615,\"bolusIOB\":-0.556,\"carbs\":75.0,\"carbsInsulin\":15.031555984064873,\"cob\":0.0,\"cobInsulin\":0.0,\"dateCreated\":1653976433240,\"glucoseDifference\":1.0,\"glucoseInsulin\":0.022144508190468416,\"glucoseTrend\":3.5,\"glucoseValue\":91.0,\"ic\":4.9895034206377815,\"id\":1582,\"interfaceIDs_backing\":{},\"isValid\":true,\"isf\":45.15792319246117,\"note\":\"\",\"otherCorrection\":0.0,\"percentageCorrection\":90,\"profileName\":\"Working days\",\"superbolusInsulin\":0.0,\"targetBGHigh\":90.0,\"targetBGLow\":90.0,\"timestamp\":1653976433211,\"totalInsulin\":13.81,\"trendInsulin\":0.23251733599991836,\"utcOffset\":7200000,\"version\":0,\"wasBasalIOBUsed\":true,\"wasBolusIOBUsed\":true,\"wasCOBUsed\":true,\"wasGlucoseUsed\":true,\"wasSuperbolusUsed\":false,\"wasTempTargetUsed\":false,\"wasTrendUsed\":true,\"wereCarbsUsed\":false}", + "date": 1653976433211, + "glucose": 91, + "units": "mg/dl", + "notes": "", + "carbs": null, + "insulin": null + }, + { + "_id": "6295acd5469d4a0004784107", + "created_at": "2022-05-31T05:51:00.890Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 276213, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458301, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458305, + "carbs": null, + "insulin": null + }, + { + "_id": "6295aba5469d4a0004784104", + "eventType": "Correction Bolus", + "insulin": 0.28, + "created_at": "2022-05-31T05:45:56.589Z", + "date": 1653975956589, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22028, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295a7d7acb47a00042f8141", + "created_at": "2022-05-31T05:29:47.906Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 845906, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458294, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458297, + "carbs": null, + "insulin": null + }, + { + "_id": "6295a7beacb47a00042f8140", + "created_at": "2022-05-31T05:29:32.829Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "OpenAPS Offline", + "isValid": true, + "duration": 15, + "durationInMilliseconds": 900000, + "reason": "DISCONNECT_PUMP", + "carbs": null, + "insulin": null + }, + { + "_id": "6295a5c8acb47a00042f813d", + "created_at": "2022-05-31T05:21:06.825Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 8, + "durationInMilliseconds": 519594, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458291, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458293, + "carbs": null, + "insulin": null + }, + { + "_id": "6295a499acb47a00042f8138", + "eventType": "Correction Bolus", + "insulin": 0.3, + "created_at": "2022-05-31T05:16:04.834Z", + "date": 1653974164834, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22027, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295a49aacb47a00042f813a", + "created_at": "2022-05-31T05:16:02.752Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 302582, + "type": "NORMAL", + "rate": 2.02, + "percent": 150, + "pumpId": 458286, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458290, + "carbs": null, + "insulin": null + }, + { + "_id": "6295a36bacb47a00042f8135", + "created_at": "2022-05-31T05:10:53.912Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 307342, + "type": "NORMAL", + "rate": 1.0504, + "percent": 30, + "pumpId": 458283, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458285, + "carbs": null, + "insulin": null + }, + { + "_id": "62959fdd0e4cd30004fcc889", + "created_at": "2022-05-31T04:55:39.667Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 603463, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458276, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458279, + "carbs": null, + "insulin": null + }, + { + "_id": "62959fc40e4cd30004fcc886", + "eventType": "Temporary Target", + "duration": 60, + "durationInMilliseconds": 3600000, + "isValid": true, + "created_at": "2022-05-31T04:55:12.975Z", + "timestamp": 1653972912975, + "enteredBy": "AndroidAPS", + "reason": "Automation", + "targetBottom": 110, + "targetTop": 110, + "units": "mg/dl", + "carbs": null, + "insulin": null + }, + { + "_id": "62959eb00e4cd30004fcc884", + "created_at": "2022-05-31T04:50:34.517Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 303656, + "type": "NORMAL", + "rate": 1.0444, + "percent": 40, + "pumpId": 458273, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458275, + "carbs": null, + "insulin": null + }, + { + "_id": "629597b88aa94000044912f6", + "created_at": "2022-05-31T04:20:53.275Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1779752, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458270, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458272, + "carbs": null, + "insulin": null + }, + { + "_id": "6295968b8aa94000044912f3", + "created_at": "2022-05-31T04:16:03.140Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 288645, + "type": "NORMAL", + "rate": 0.8952, + "percent": 20, + "pumpId": 458267, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458269, + "carbs": null, + "insulin": null + }, + { + "_id": "6295955e8aa94000044912f0", + "created_at": "2022-05-31T04:10:56.377Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 304277, + "type": "NORMAL", + "rate": 1.119, + "percent": 50, + "pumpId": 458264, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458266, + "carbs": null, + "insulin": null + }, + { + "_id": "629590b0be37f70004b2bb5d", + "created_at": "2022-05-31T03:51:07.389Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 19, + "durationInMilliseconds": 1187499, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458260, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458263, + "carbs": null, + "insulin": null + }, + { + "_id": "6295907ebe37f70004b2bb5b", + "eventType": "Temporary Target", + "duration": 60, + "durationInMilliseconds": 3600000, + "isValid": true, + "created_at": "2022-05-31T03:50:17.539Z", + "timestamp": 1653969017539, + "enteredBy": "AndroidAPS", + "reason": "Automation", + "targetBottom": 110, + "targetTop": 110, + "units": "mg/dl", + "carbs": null, + "insulin": null + }, + { + "_id": "6295886eb8ec320004808360", + "created_at": "2022-05-31T03:15:50.289Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 35, + "durationInMilliseconds": 2114613, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458257, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458259, + "carbs": null, + "insulin": null + }, + { + "_id": "6295886eb8ec32000480835e", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-31T03:15:36.103Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "10g de glucides requis dans 0 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "629584e6b8ec320004808357", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-31T03:00:36.460Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "11g de glucides requis dans 0 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "629583b9b8ec320004808354", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-31T02:55:38.214Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "20g de glucides requis dans 0 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "629582a5b8ec320004808351", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-31T02:51:02.043Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "19g de glucides requis dans 5 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "62958272b8ec320004808350", + "eventType": "Temporary Target", + "duration": 60, + "durationInMilliseconds": 3600000, + "isValid": true, + "created_at": "2022-05-31T02:50:04.612Z", + "timestamp": 1653965404612, + "enteredBy": "AndroidAPS", + "reason": "Automation", + "targetBottom": 110, + "targetTop": 110, + "units": "mg/dl", + "carbs": null, + "insulin": null + }, + { + "_id": "62958178b8ec32000480834e", + "created_at": "2022-05-31T02:45:51.272Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1797535, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458253, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458256, + "carbs": null, + "insulin": null + }, + { + "_id": "62958042fe83800004778c28", + "created_at": "2022-05-31T02:40:55.507Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 293267, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458250, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458252, + "carbs": null, + "insulin": null + }, + { + "_id": "62957f15fe83800004778c25", + "eventType": "Correction Bolus", + "insulin": 0.46, + "created_at": "2022-05-31T02:35:55.492Z", + "date": 1653964555492, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22026, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62957cbbfe83800004778c1f", + "eventType": "Correction Bolus", + "insulin": 0.62, + "created_at": "2022-05-31T02:25:58.675Z", + "date": 1653963958675, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22025, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62957cbbfe83800004778c20", + "created_at": "2022-05-31T02:25:56.083Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 889000, + "type": "FAKE_EXTENDED", + "rate": 3.427676040494938, + "absolute": 3.427676040494938, + "pumpId": 22024, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-31T02:25:56.083Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 14, + "durationInMilliseconds": 889000, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.64, + "relative": 2.591676040494938, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 22024, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "carbs": null, + "insulin": null + }, + { + "_id": "62957b8efe83800004778c1d", + "created_at": "2022-05-31T02:20:42.855Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 301088, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458236, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458238, + "carbs": null, + "insulin": null + }, + { + "_id": "62957a60fe83800004778c1a", + "created_at": "2022-05-31T02:15:53.083Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 288295, + "type": "NORMAL", + "rate": 0.6688, + "percent": -20, + "pumpId": 458233, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458235, + "carbs": null, + "insulin": null + }, + { + "_id": "6295782e9bc0370004b42b8b", + "created_at": "2022-05-31T02:06:38.366Z", + "enteredBy": "openaps://AndroidAPS", + "isValid": true, + "eventType": "Note", + "profileJson": "{\"units\":\"mg\\/dl\",\"dia\":6,\"timezone\":\"Africa\\/Cairo\",\"sens\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":95.73479716801766},{\"time\":\"01:00\",\"timeAsSeconds\":3600,\"value\":75.88879083401042},{\"time\":\"02:00\",\"timeAsSeconds\":7200,\"value\":58.032604755419776},{\"time\":\"03:00\",\"timeAsSeconds\":10800,\"value\":52.38319090325494},{\"time\":\"04:00\",\"timeAsSeconds\":14400,\"value\":48.77055704785807},{\"time\":\"05:00\",\"timeAsSeconds\":18000,\"value\":46.964240120159616},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":45.15792319246117},{\"time\":\"08:00\",\"timeAsSeconds\":28800,\"value\":46.964240120159616},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":50.890130323983435},{\"time\":\"10:00\",\"timeAsSeconds\":36000,\"value\":62.496651275067414},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":75.88879083401042},{\"time\":\"12:00\",\"timeAsSeconds\":43200,\"value\":80.3528373536581},{\"time\":\"13:00\",\"timeAsSeconds\":46800,\"value\":89.28093039295341},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":93.74497691260113},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":98.2090234322488},{\"time\":\"22:00\",\"timeAsSeconds\":79200,\"value\":107.13711647154416},{\"time\":\"23:00\",\"timeAsSeconds\":82800,\"value\":115.60428337270058}],\"carbratio\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":5.792007079189894},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":4.9895034206377815},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":5.870004024279742},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":4.9895034206377815}],\"basal\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":1.139},{\"time\":\"01:00\",\"timeAsSeconds\":3600,\"value\":1.06},{\"time\":\"02:00\",\"timeAsSeconds\":7200,\"value\":1.075},{\"time\":\"03:00\",\"timeAsSeconds\":10800,\"value\":1.199},{\"time\":\"04:00\",\"timeAsSeconds\":14400,\"value\":0.836},{\"time\":\"05:00\",\"timeAsSeconds\":18000,\"value\":0.8270000000000001},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":0.746},{\"time\":\"07:00\",\"timeAsSeconds\":25200,\"value\":0.808},{\"time\":\"08:00\",\"timeAsSeconds\":28800,\"value\":0.809},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":0.803},{\"time\":\"10:00\",\"timeAsSeconds\":36000,\"value\":0.801},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":0.804},{\"time\":\"12:00\",\"timeAsSeconds\":43200,\"value\":0.798},{\"time\":\"13:00\",\"timeAsSeconds\":46800,\"value\":0.797},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":0.785},{\"time\":\"16:00\",\"timeAsSeconds\":57600,\"value\":0.766},{\"time\":\"17:00\",\"timeAsSeconds\":61200,\"value\":0.796},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":0.788},{\"time\":\"19:00\",\"timeAsSeconds\":68400,\"value\":0.806},{\"time\":\"20:00\",\"timeAsSeconds\":72000,\"value\":0.857},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":0.916},{\"time\":\"22:00\",\"timeAsSeconds\":79200,\"value\":0.972},{\"time\":\"23:00\",\"timeAsSeconds\":82800,\"value\":1.0230000000000001}],\"target_low\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":100},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":90},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":100},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":90},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":100},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":90},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":100}],\"target_high\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":100},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":90},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":100},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":90},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":100},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":90},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":100}]}", + "originalProfileName": "Working days", + "originalCustomizedName": "Working days", + "originalTimeshift": 0, + "originalPercentage": 100, + "originalDuration": 0, + "originalEnd": 1653962788607, + "notes": "Working days", + "carbs": null, + "insulin": null + }, + { + "_id": "6295782e9bc0370004b42b8a", + "timeshift": 0, + "percentage": 100, + "profile": "Working days", + "originalProfileName": "Working days", + "created_at": "2022-05-31T02:06:28.607Z", + "enteredBy": "openaps://AndroidAPS", + "isValid": true, + "eventType": "Profile Switch", + "duration": 0, + "profileJson": "{\"units\":\"mg\\/dl\",\"dia\":6,\"timezone\":\"Africa\\/Cairo\",\"sens\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":95.73479716801766},{\"time\":\"01:00\",\"timeAsSeconds\":3600,\"value\":75.88879083401042},{\"time\":\"02:00\",\"timeAsSeconds\":7200,\"value\":58.032604755419776},{\"time\":\"03:00\",\"timeAsSeconds\":10800,\"value\":52.38319090325494},{\"time\":\"04:00\",\"timeAsSeconds\":14400,\"value\":48.77055704785807},{\"time\":\"05:00\",\"timeAsSeconds\":18000,\"value\":46.964240120159616},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":45.15792319246117},{\"time\":\"08:00\",\"timeAsSeconds\":28800,\"value\":46.964240120159616},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":50.890130323983435},{\"time\":\"10:00\",\"timeAsSeconds\":36000,\"value\":62.496651275067414},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":75.88879083401042},{\"time\":\"12:00\",\"timeAsSeconds\":43200,\"value\":80.3528373536581},{\"time\":\"13:00\",\"timeAsSeconds\":46800,\"value\":89.28093039295341},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":93.74497691260113},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":98.2090234322488},{\"time\":\"22:00\",\"timeAsSeconds\":79200,\"value\":107.13711647154416},{\"time\":\"23:00\",\"timeAsSeconds\":82800,\"value\":115.60428337270058}],\"carbratio\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":5.792007079189894},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":4.9895034206377815},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":5.870004024279742},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":4.9895034206377815}],\"basal\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":1.139},{\"time\":\"01:00\",\"timeAsSeconds\":3600,\"value\":1.06},{\"time\":\"02:00\",\"timeAsSeconds\":7200,\"value\":1.075},{\"time\":\"03:00\",\"timeAsSeconds\":10800,\"value\":1.199},{\"time\":\"04:00\",\"timeAsSeconds\":14400,\"value\":0.836},{\"time\":\"05:00\",\"timeAsSeconds\":18000,\"value\":0.8270000000000001},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":0.746},{\"time\":\"07:00\",\"timeAsSeconds\":25200,\"value\":0.808},{\"time\":\"08:00\",\"timeAsSeconds\":28800,\"value\":0.809},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":0.803},{\"time\":\"10:00\",\"timeAsSeconds\":36000,\"value\":0.801},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":0.804},{\"time\":\"12:00\",\"timeAsSeconds\":43200,\"value\":0.798},{\"time\":\"13:00\",\"timeAsSeconds\":46800,\"value\":0.797},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":0.785},{\"time\":\"15:00\",\"timeAsSeconds\":54000,\"value\":0.785},{\"time\":\"16:00\",\"timeAsSeconds\":57600,\"value\":0.766},{\"time\":\"17:00\",\"timeAsSeconds\":61200,\"value\":0.796},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":0.788},{\"time\":\"19:00\",\"timeAsSeconds\":68400,\"value\":0.806},{\"time\":\"20:00\",\"timeAsSeconds\":72000,\"value\":0.857},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":0.916},{\"time\":\"22:00\",\"timeAsSeconds\":79200,\"value\":0.972},{\"time\":\"23:00\",\"timeAsSeconds\":82800,\"value\":1.0230000000000001}],\"target_low\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":100},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":90},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":100},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":90},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":100},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":90},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":100}],\"target_high\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":100},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":90},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":100},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":90},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":100},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":90},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":100}]}", + "carbs": null, + "insulin": null + }, + { + "_id": "629575bb9bc0370004b42b85", + "created_at": "2022-05-31T01:56:03.509Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 19, + "durationInMilliseconds": 1188082, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458227, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458232, + "carbs": null, + "insulin": null + }, + { + "_id": "6295748e9bc0370004b42b82", + "created_at": "2022-05-31T01:51:03.848Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 298169, + "type": "NORMAL", + "rate": 0.579, + "percent": -40, + "pumpId": 458224, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458226, + "carbs": null, + "insulin": null + }, + { + "_id": "629573609bc0370004b42b7f", + "created_at": "2022-05-31T01:46:01.471Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 300881, + "type": "NORMAL", + "rate": 1.351, + "percent": 40, + "pumpId": 458221, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458223, + "carbs": null, + "insulin": null + }, + { + "_id": "629572339bc0370004b42b7c", + "created_at": "2022-05-31T01:40:45.409Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 314567, + "type": "NORMAL", + "rate": 1.0614999999999999, + "percent": 10, + "pumpId": 458218, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458220, + "carbs": null, + "insulin": null + }, + { + "_id": "629571069bc0370004b42b79", + "created_at": "2022-05-31T01:35:43.903Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 300009, + "type": "NORMAL", + "rate": 2.316, + "percent": 140, + "pumpId": 458215, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458217, + "carbs": null, + "insulin": null + }, + { + "_id": "62956fdbe4f1e400046e05c8", + "eventType": "Correction Bolus", + "insulin": 0.22, + "created_at": "2022-05-31T01:30:55.508Z", + "date": 1653960655508, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22023, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62956fdbe4f1e400046e05ca", + "created_at": "2022-05-31T01:30:52.670Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 289736, + "type": "NORMAL", + "rate": 1.8335, + "percent": 90, + "pumpId": 458210, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458214, + "carbs": null, + "insulin": null + }, + { + "_id": "62956ec7e4f1e400046e05c6", + "created_at": "2022-05-31T01:26:04.315Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 286864, + "type": "NORMAL", + "rate": 0.193, + "percent": -80, + "pumpId": 458207, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458209, + "carbs": null, + "insulin": null + }, + { + "_id": "62956c53e4f1e400046e05c0", + "created_at": "2022-05-31T01:15:44.217Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 617639, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458203, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458206, + "carbs": null, + "insulin": null + }, + { + "_id": "62956b26e4f1e400046e05bd", + "created_at": "2022-05-31T01:10:56.345Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 285374, + "type": "NORMAL", + "rate": 0.386, + "percent": -60, + "pumpId": 458199, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458202, + "carbs": null, + "insulin": null + }, + { + "_id": "629569f7e4f1e400046e05ba", + "created_at": "2022-05-31T01:05:44.958Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 308893, + "type": "NORMAL", + "rate": 0.4825, + "percent": -50, + "pumpId": 458196, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458198, + "carbs": null, + "insulin": null + }, + { + "_id": "629568e2e4f1e400046e05b6", + "eventType": "Correction Bolus", + "insulin": 0.18, + "created_at": "2022-05-31T01:01:03.804Z", + "date": 1653958863804, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22022, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "629568e2e4f1e400046e05b7", + "created_at": "2022-05-31T01:01:01.983Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 281485, + "type": "NORMAL", + "rate": 1.7369999999999999, + "percent": 80, + "pumpId": 458191, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458195, + "carbs": null, + "insulin": null + }, + { + "_id": "62954fdd68a4bc00040c0170", + "eventType": "Pump Battery Change", + "isValid": true, + "created_at": "2022-05-30T23:02:36.459Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "carbs": null, + "insulin": null + }, + { + "_id": "62954fdc68a4bc00040c016f", + "eventType": "Note", + "isValid": true, + "created_at": "2022-05-30T23:01:55.446Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "Pompe démarrée", + "carbs": null, + "insulin": null + }, + { + "_id": "62954c34f89bc40004df9f64", + "eventType": "Sensor Change", + "isValid": true, + "created_at": "2022-05-30T22:58:37.000Z", + "units": "mg/dl", + "carbs": null, + "insulin": null + }, + { + "_id": "62954b81f89bc40004df9f61", + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-30T22:55:56.146Z", + "date": 1653951356146, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22021, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62954b82f89bc40004df9f63", + "created_at": "2022-05-30T22:55:53.216Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1741813, + "type": "NORMAL", + "rate": 1.3755000000000002, + "percent": 50, + "pumpId": 458172, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458186, + "carbs": null, + "insulin": null + }, + { + "_id": "62954a6df89bc40004df9f5f", + "created_at": "2022-05-30T22:51:08.489Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 282244, + "type": "NORMAL", + "rate": 0.2751, + "percent": -70, + "pumpId": 458169, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458171, + "carbs": null, + "insulin": null + }, + { + "_id": "6295493ff89bc40004df9f5c", + "created_at": "2022-05-30T22:46:09.519Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 297487, + "type": "NORMAL", + "rate": 0.4585, + "percent": -50, + "pumpId": 458166, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458168, + "carbs": null, + "insulin": null + }, + { + "_id": "629547f8f89bc40004df9f59", + "created_at": "2022-05-30T22:40:47.081Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 320949, + "type": "NORMAL", + "rate": 0.6419, + "percent": -30, + "pumpId": 458163, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458165, + "carbs": null, + "insulin": null + }, + { + "_id": "629546caf89bc40004df9f56", + "created_at": "2022-05-30T22:35:51.108Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 294484, + "type": "NORMAL", + "rate": 0.8253, + "percent": -10, + "pumpId": 458160, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458162, + "carbs": null, + "insulin": null + }, + { + "_id": "629542261ded00000454b73f", + "created_at": "2022-05-30T22:15:46.620Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 20, + "durationInMilliseconds": 1203000, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458156, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458159, + "carbs": null, + "insulin": null + }, + { + "_id": "629541111ded00000454b73c", + "created_at": "2022-05-30T22:11:11.648Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 273483, + "type": "NORMAL", + "rate": 1.2838, + "percent": 40, + "pumpId": 458153, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458155, + "carbs": null, + "insulin": null + }, + { + "_id": "62953b2086a3df0004eb44ff", + "created_at": "2022-05-30T21:45:59.226Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 25, + "durationInMilliseconds": 1510937, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458148, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458152, + "carbs": null, + "insulin": null + }, + { + "_id": "6295379486a3df0004eb44f7", + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-30T21:30:47.761Z", + "date": 1653946247761, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22020, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62953566e3aedd00046f3883", + "eventType": "Correction Bolus", + "insulin": 0.1, + "created_at": "2022-05-30T21:21:15.984Z", + "date": 1653945675984, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22019, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295354de3aedd00046f3882", + "created_at": "2022-05-30T21:21:13.875Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 24, + "durationInMilliseconds": 1482865, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458141, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458147, + "carbs": null, + "insulin": null + }, + { + "_id": "629531c4e3aedd00046f387b", + "created_at": "2022-05-30T21:06:05.388Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 15, + "durationInMilliseconds": 906997, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458138, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458140, + "carbs": null, + "insulin": null + }, + { + "_id": "629530fae3aedd00046f3876", + "eventType": "Meal Bolus", + "insulin": 6.02, + "created_at": "2022-05-30T21:02:38.858Z", + "date": 1653944558858, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 22018, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62953113e3aedd00046f3878", + "eventType": "Meal Bolus", + "carbs": 35, + "created_at": "2022-05-30T21:02:35.469Z", + "isValid": true, + "date": 1653944555469, + "insulin": null + }, + { + "_id": "629530fae3aedd00046f3877", + "eventType": "Bolus Wizard", + "created_at": "2022-05-30T21:02:35.469Z", + "isValid": true, + "bolusCalculatorResult": "{\"basalIOB\":0.267,\"bolusIOB\":-1.1300000000000001,\"carbs\":35.0,\"carbsInsulin\":6.9944756849403245,\"cob\":0.0,\"cobInsulin\":0.0,\"dateCreated\":1653944555615,\"glucoseDifference\":66.0,\"glucoseInsulin\":0.6268744459833301,\"glucoseTrend\":-2.61,\"glucoseValue\":166.0,\"ic\":5.003949055875317,\"id\":1580,\"interfaceIDs_backing\":{},\"isValid\":true,\"isf\":105.28424060494416,\"note\":\"\",\"otherCorrection\":0.0,\"percentageCorrection\":90,\"profileName\":\"Training days\",\"superbolusInsulin\":0.0,\"targetBGHigh\":100.0,\"targetBGLow\":100.0,\"timestamp\":1653944555469,\"totalInsulin\":6.0200000000000005,\"trendInsulin\":-0.07437010472802234,\"utcOffset\":7200000,\"version\":0,\"wasBasalIOBUsed\":true,\"wasBolusIOBUsed\":true,\"wasCOBUsed\":true,\"wasGlucoseUsed\":true,\"wasSuperbolusUsed\":false,\"wasTempTargetUsed\":false,\"wasTrendUsed\":true,\"wereCarbsUsed\":false}", + "date": 1653944555469, + "glucose": 166, + "units": "mg/dl", + "notes": "", + "carbs": null, + "insulin": null + }, + { + "_id": "62952f81e3aedd00046f3873", + "created_at": "2022-05-30T20:56:23.945Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 578949, + "type": "NORMAL", + "rate": 0.36950000000000005, + "percent": -50, + "pumpId": 458132, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458137, + "carbs": null, + "insulin": null + }, + { + "_id": "62952eb4e3aedd00046f386e", + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-30T20:50:49.125Z", + "date": 1653943849125, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22017, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62952eb5e3aedd00046f3870", + "created_at": "2022-05-30T20:50:46.774Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 335678, + "type": "NORMAL", + "rate": 0.22169999999999998, + "percent": -70, + "pumpId": 458127, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458131, + "carbs": null, + "insulin": null + }, + { + "_id": "62952d03e3aedd00046f386c", + "created_at": "2022-05-30T20:45:47.527Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 297761, + "type": "NORMAL", + "rate": 0.36950000000000005, + "percent": -50, + "pumpId": 458124, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458126, + "carbs": null, + "insulin": null + }, + { + "_id": "62952c85e3aedd00046f3868", + "eventType": "Correction Bolus", + "insulin": 0.22, + "created_at": "2022-05-30T20:43:25.045Z", + "date": 1653943405045, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22016, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62952c85e3aedd00046f3869", + "created_at": "2022-05-30T20:43:22.025Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 2, + "durationInMilliseconds": 144010, + "type": "NORMAL", + "rate": 1.6258, + "percent": 120, + "pumpId": 458119, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458123, + "carbs": null, + "insulin": null + }, + { + "_id": "62952b57e3aedd00046f3863", + "eventType": "Note", + "isValid": true, + "created_at": "2022-05-30T20:38:25.189Z", + "units": "mg/dl", + "notes": "AndroidAPS est lancé - samsung SM-A405FN", + "carbs": null, + "insulin": null + }, + { + "_id": "62952ac3e3aedd00046f3861", + "created_at": "2022-05-30T20:35:51.571Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 41925, + "type": "NORMAL", + "rate": 0.1478, + "percent": -80, + "pumpId": 458113, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458115, + "carbs": null, + "insulin": null + }, + { + "_id": "629529ade3aedd00046f385e", + "created_at": "2022-05-30T20:31:15.130Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 274985, + "type": "NORMAL", + "rate": 0.2956, + "percent": -60, + "pumpId": 458110, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458112, + "carbs": null, + "insulin": null + }, + { + "_id": "62952899e3aedd00046f3859", + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-30T20:26:57.470Z", + "date": 1653942417470, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22015, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62952899e3aedd00046f385b", + "created_at": "2022-05-30T20:26:55.194Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 257445, + "type": "NORMAL", + "rate": 1.3302, + "percent": 80, + "pumpId": 458105, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458109, + "carbs": null, + "insulin": null + }, + { + "_id": "6295273ae3aedd00046f3857", + "created_at": "2022-05-30T20:20:59.451Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 353254, + "type": "NORMAL", + "rate": 0.1478, + "percent": -80, + "pumpId": 458102, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458104, + "carbs": null, + "insulin": null + }, + { + "_id": "62952605f63c010004ea5d2a", + "eventType": "Correction Bolus", + "insulin": 0.18, + "created_at": "2022-05-30T20:15:59.073Z", + "date": 1653941759073, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22014, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62952605f63c010004ea5d2c", + "created_at": "2022-05-30T20:15:56.006Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 301964, + "type": "NORMAL", + "rate": 1.4780000000000002, + "percent": 100, + "pumpId": 458097, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458101, + "carbs": null, + "insulin": null + }, + { + "_id": "629524f1f63c010004ea5d28", + "created_at": "2022-05-30T20:11:18.206Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 276310, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458094, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458096, + "carbs": null, + "insulin": null + }, + { + "_id": "629523c4f63c010004ea5d24", + "eventType": "Correction Bolus", + "insulin": 0.1, + "created_at": "2022-05-30T20:06:16.890Z", + "date": 1653941176890, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22013, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "629523c4f63c010004ea5d25", + "created_at": "2022-05-30T20:06:14.789Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 300947, + "type": "NORMAL", + "rate": 0.0739, + "percent": -90, + "pumpId": 458089, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458093, + "carbs": null, + "insulin": null + }, + { + "_id": "6295227ef63c010004ea5d21", + "created_at": "2022-05-30T20:00:49.579Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 323721, + "type": "NORMAL", + "rate": 0.36950000000000005, + "percent": -50, + "pumpId": 458086, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458088, + "carbs": null, + "insulin": null + }, + { + "_id": "6295216af63c010004ea5d1e", + "created_at": "2022-05-30T19:56:09.060Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 279028, + "type": "NORMAL", + "rate": 0.2956, + "percent": -60, + "pumpId": 458083, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458085, + "carbs": null, + "insulin": null + }, + { + "_id": "62951f28f63c010004ea5d17", + "eventType": "Correction Bolus", + "insulin": 0.14, + "created_at": "2022-05-30T19:46:40.723Z", + "date": 1653940000723, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22012, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62951f29f63c010004ea5d19", + "created_at": "2022-05-30T19:46:38.592Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 568986, + "type": "NORMAL", + "rate": 0.2956, + "percent": -60, + "pumpId": 458078, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458082, + "carbs": null, + "insulin": null + }, + { + "_id": "62951dcbf63c010004ea5d13", + "eventType": "Correction Bolus", + "insulin": 0.24, + "created_at": "2022-05-30T19:40:48.541Z", + "date": 1653939648541, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22011, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62951dcbf63c010004ea5d15", + "created_at": "2022-05-30T19:40:46.581Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 350525, + "type": "NORMAL", + "rate": 0.0739, + "percent": -90, + "pumpId": 458073, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458077, + "carbs": null, + "insulin": null + }, + { + "_id": "62951c9df63c010004ea5d11", + "created_at": "2022-05-30T19:35:47.077Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 298007, + "type": "NORMAL", + "rate": 0.2956, + "percent": -60, + "pumpId": 458070, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458072, + "carbs": null, + "insulin": null + }, + { + "_id": "62951b87f63c010004ea5d0d", + "eventType": "Correction Bolus", + "insulin": 0.24, + "created_at": "2022-05-30T19:30:59.385Z", + "date": 1653939059385, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22010, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62951b88f63c010004ea5d0e", + "created_at": "2022-05-30T19:30:57.168Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 288421, + "type": "NORMAL", + "rate": 0.0739, + "percent": -90, + "pumpId": 458065, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458069, + "carbs": null, + "insulin": null + }, + { + "_id": "62951a5af63c010004ea5d0a", + "created_at": "2022-05-30T19:26:13.778Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 280898, + "type": "NORMAL", + "rate": 0.36950000000000005, + "percent": -50, + "pumpId": 458062, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458064, + "carbs": null, + "insulin": null + }, + { + "_id": "62951929f63c010004ea5d06", + "eventType": "Correction Bolus", + "insulin": 0.24, + "created_at": "2022-05-30T19:21:09.927Z", + "date": 1653938469927, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22009, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6295192af63c010004ea5d07", + "created_at": "2022-05-30T19:21:07.733Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 304559, + "type": "NORMAL", + "rate": 1.6997, + "percent": 130, + "pumpId": 458057, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458061, + "carbs": null, + "insulin": null + }, + { + "_id": "629517fcf63c010004ea5d03", + "created_at": "2022-05-30T19:16:01.807Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 304435, + "type": "NORMAL", + "rate": 0.22169999999999998, + "percent": -70, + "pumpId": 458054, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458056, + "carbs": null, + "insulin": null + }, + { + "_id": "629515a4f63c010004ea5cfe", + "created_at": "2022-05-30T19:06:06.196Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 594121, + "type": "NORMAL", + "rate": 0.5173, + "percent": -30, + "pumpId": 458051, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458053, + "carbs": null, + "insulin": null + }, + { + "_id": "62951348f63c010004ea5cf9", + "created_at": "2022-05-30T18:55:49.150Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 614556, + "type": "NORMAL", + "rate": 0.5089, + "percent": -30, + "pumpId": 458047, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458050, + "carbs": null, + "insulin": null + }, + { + "_id": "629512130f8c2e00042830a4", + "created_at": "2022-05-30T18:50:53.328Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 293324, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 458044, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458046, + "carbs": null, + "insulin": null + }, + { + "_id": "629510e40f8c2e00042830a0", + "created_at": "2022-05-30T18:45:49.783Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 301049, + "type": "NORMAL", + "rate": 0.4362, + "percent": -40, + "pumpId": 458041, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458043, + "carbs": null, + "insulin": null + }, + { + "_id": "62950fb60f8c2e000428309d", + "eventType": "Correction Bolus", + "insulin": 0.66, + "created_at": "2022-05-30T18:40:40.053Z", + "date": 1653936040053, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22008, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62950ea10f8c2e000428309b", + "created_at": "2022-05-30T18:35:51.435Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 588000, + "type": "FAKE_EXTENDED", + "rate": 3.788224489795918, + "absolute": 3.788224489795918, + "pumpId": 22007, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-30T18:35:51.435Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 9, + "durationInMilliseconds": 588000, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.5, + "relative": 3.061224489795918, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 22007, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "carbs": null, + "insulin": null + }, + { + "_id": "62950dbf0f8c2e0004283098", + "created_at": "2022-05-30T18:32:07.486Z", + "enteredBy": "openaps://AndroidAPS", + "isValid": true, + "eventType": "Note", + "profileJson": "{\"units\":\"mg\\/dl\",\"dia\":6,\"timezone\":\"Africa\\/Cairo\",\"sens\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":87.18851175096937},{\"time\":\"01:00\",\"timeAsSeconds\":3600,\"value\":69.11416670978657},{\"time\":\"02:00\",\"timeAsSeconds\":7200,\"value\":52.85200983689563},{\"time\":\"03:00\",\"timeAsSeconds\":10800,\"value\":47.706921524115316},{\"time\":\"04:00\",\"timeAsSeconds\":14400,\"value\":44.41678900521082},{\"time\":\"05:00\",\"timeAsSeconds\":18000,\"value\":42.77172274575857},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":41.12665648630631},{\"time\":\"08:00\",\"timeAsSeconds\":28800,\"value\":42.77172274575857},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":46.3471470877392},{\"time\":\"10:00\",\"timeAsSeconds\":36000,\"value\":56.91754905511835},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":69.11416670978657},{\"time\":\"12:00\",\"timeAsSeconds\":43200,\"value\":73.1797059280093},{\"time\":\"13:00\",\"timeAsSeconds\":46800,\"value\":81.31078436445473},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":85.37632358267754},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":89.44186280090027},{\"time\":\"22:00\",\"timeAsSeconds\":79200,\"value\":97.57294123734576},{\"time\":\"23:00\",\"timeAsSeconds\":82800,\"value\":105.28424060494416}],\"carbratio\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":5.80877612703003},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":5.003949055875317},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":5.886998889265079},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":5.003949055875317}],\"basal\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":0.917},{\"time\":\"01:00\",\"timeAsSeconds\":3600,\"value\":0.919},{\"time\":\"02:00\",\"timeAsSeconds\":7200,\"value\":0.969},{\"time\":\"03:00\",\"timeAsSeconds\":10800,\"value\":0.965},{\"time\":\"04:00\",\"timeAsSeconds\":14400,\"value\":0.858},{\"time\":\"05:00\",\"timeAsSeconds\":18000,\"value\":0.864},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":0.787},{\"time\":\"07:00\",\"timeAsSeconds\":25200,\"value\":0.81},{\"time\":\"08:00\",\"timeAsSeconds\":28800,\"value\":0.756},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":0.776},{\"time\":\"10:00\",\"timeAsSeconds\":36000,\"value\":0.777},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":0.753},{\"time\":\"12:00\",\"timeAsSeconds\":43200,\"value\":0.723},{\"time\":\"13:00\",\"timeAsSeconds\":46800,\"value\":0.72},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":0.718},{\"time\":\"15:00\",\"timeAsSeconds\":54000,\"value\":0.721},{\"time\":\"16:00\",\"timeAsSeconds\":57600,\"value\":0.71},{\"time\":\"17:00\",\"timeAsSeconds\":61200,\"value\":0.635},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":0.603},{\"time\":\"19:00\",\"timeAsSeconds\":68400,\"value\":0.582},{\"time\":\"20:00\",\"timeAsSeconds\":72000,\"value\":0.727},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":0.739},{\"time\":\"23:00\",\"timeAsSeconds\":82800,\"value\":0.759}],\"target_low\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":100},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":90},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":100},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":90},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":100},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":90},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":100}],\"target_high\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":100},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":90},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":100},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":90},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":100},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":90},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":100}]}", + "originalProfileName": "Training days", + "originalCustomizedName": "Training days", + "originalTimeshift": 0, + "originalPercentage": 100, + "originalDuration": 0, + "originalEnd": 1653876333580, + "notes": "Training days", + "carbs": null, + "insulin": null + }, + { + "_id": "62950d8c0f8c2e0004283096", + "eventType": "Correction Bolus", + "insulin": 0.2, + "created_at": "2022-05-30T18:31:16.379Z", + "date": 1653935476379, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22006, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62950d8d0f8c2e0004283097", + "created_at": "2022-05-30T18:31:13.515Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 266977, + "type": "NORMAL", + "rate": 1.33768, + "percent": 130, + "pumpId": 458025, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458031, + "carbs": null, + "insulin": null + }, + { + "_id": "62950c5e0f8c2e0004283093", + "created_at": "2022-05-30T18:26:18.162Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 293856, + "type": "NORMAL", + "rate": 0.40712000000000004, + "percent": -30, + "pumpId": 458022, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458024, + "carbs": null, + "insulin": null + }, + { + "_id": "62950b160f8c2e000428308e", + "eventType": "Correction Bolus", + "insulin": 0.24, + "created_at": "2022-05-30T18:21:07.247Z", + "date": 1653934867247, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22005, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62950b160f8c2e000428308f", + "created_at": "2022-05-30T18:21:04.625Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 304000, + "type": "FAKE_EXTENDED", + "rate": 1.0552842105263158, + "absolute": 1.0552842105263158, + "pumpId": 22004, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-30T18:21:04.625Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 5, + "durationInMilliseconds": 304000, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.04, + "relative": 0.47368421052631576, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 22004, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "carbs": null, + "insulin": null + }, + { + "_id": "629508d0409703000484d1c8", + "created_at": "2022-05-30T18:11:02.413Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 590161, + "type": "NORMAL", + "rate": 0.7560800000000001, + "percent": 30, + "pumpId": 458010, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458012, + "carbs": null, + "insulin": null + }, + { + "_id": "6295065b409703000484d1c3", + "created_at": "2022-05-30T18:00:54.436Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 605487, + "type": "NORMAL", + "rate": 0.40712000000000004, + "percent": -30, + "pumpId": 458007, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458009, + "carbs": null, + "insulin": null + }, + { + "_id": "6295052c409703000484d1c0", + "created_at": "2022-05-30T17:55:41.687Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 311257, + "type": "NORMAL", + "rate": 0.5121600000000001, + "percent": 10, + "pumpId": 458003, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458006, + "carbs": null, + "insulin": null + }, + { + "_id": "62950417409703000484d1bb", + "eventType": "Correction Bolus", + "insulin": 0.1, + "created_at": "2022-05-30T17:51:02.602Z", + "date": 1653933062602, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22003, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62950417409703000484d1bd", + "created_at": "2022-05-30T17:51:00.624Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 279574, + "type": "NORMAL", + "rate": 0.88464, + "percent": 90, + "pumpId": 457998, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 458002, + "carbs": null, + "insulin": null + }, + { + "_id": "629502e9409703000484d1b8", + "created_at": "2022-05-30T17:46:00.204Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 298930, + "type": "NORMAL", + "rate": 0.65184, + "percent": 40, + "pumpId": 457995, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457997, + "carbs": null, + "insulin": null + }, + { + "_id": "6294ff6755b9dd00048a5492", + "created_at": "2022-05-30T17:31:07.277Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 574757, + "type": "NORMAL", + "rate": 0.55872, + "percent": 20, + "pumpId": 457989, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457991, + "carbs": null, + "insulin": null + }, + { + "_id": "6294f81755b9dd00048a5484", + "eventType": "Exercise", + "isValid": true, + "created_at": "2022-05-30T17:00:01.505Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "duration": 90, + "durationInMilliseconds": 5400000, + "notes": "🏓", + "carbs": null, + "insulin": null + }, + { + "_id": "6294f3a055b9dd00048a547c", + "created_at": "2022-05-30T16:40:57.666Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 50, + "durationInMilliseconds": 3007120, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457984, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457988, + "carbs": null, + "insulin": null + }, + { + "_id": "6294f143b23f340004e841ea", + "created_at": "2022-05-30T16:30:34.848Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 621339, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457981, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457983, + "carbs": null, + "insulin": null + }, + { + "_id": "6294f02eb23f340004e841e7", + "created_at": "2022-05-30T16:25:59.075Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 274281, + "type": "NORMAL", + "rate": 0.2412, + "percent": -50, + "pumpId": 457978, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457980, + "carbs": null, + "insulin": null + }, + { + "_id": "6294ef00b23f340004e841e2", + "eventType": "Correction Bolus", + "insulin": 0.44, + "created_at": "2022-05-30T16:21:13.491Z", + "date": 1653927673491, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 22002, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6294ef01b23f340004e841e4", + "created_at": "2022-05-30T16:21:11.436Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 278000, + "type": "FAKE_EXTENDED", + "rate": 1.5183712230215827, + "absolute": 1.5183712230215827, + "pumpId": 22001, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-30T16:21:11.436Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 4, + "durationInMilliseconds": 278000, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.08, + "relative": 1.0359712230215827, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 22001, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "carbs": null, + "insulin": null + }, + { + "_id": "6294edb9b23f340004e841e0", + "created_at": "2022-05-30T16:15:48.023Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 323413, + "type": "FAKE_EXTENDED", + "rate": 1.6824, + "absolute": 1.6824, + "pumpId": 22000, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-30T16:15:48.023Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 5, + "durationInMilliseconds": 323413, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.10780433333333332, + "relative": 1.2, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 22000, + "endId": 22001, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "endId": 22001, + "carbs": null, + "insulin": null + }, + { + "_id": "6294eca4b23f340004e841db", + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-30T16:10:57.547Z", + "date": 1653927057547, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21999, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6294eca5b23f340004e841dd", + "created_at": "2022-05-30T16:10:55.574Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 279439, + "type": "NORMAL", + "rate": 0.9648, + "percent": 100, + "pumpId": 457960, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457964, + "carbs": null, + "insulin": null + }, + { + "_id": "6294ea5cb23f340004e841d7", + "created_at": "2022-05-30T16:01:08.748Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 585338, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457957, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457959, + "carbs": null, + "insulin": null + }, + { + "_id": "62952b70e3aedd00046f3864", + "eventType": "Carb Correction", + "carbs": 10, + "created_at": "2022-05-30T16:00:50.000Z", + "isValid": true, + "date": 1653926450000, + "insulin": null + }, + { + "_id": "6294e345706f120004b7d15e", + "created_at": "2022-05-30T15:31:10.998Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1796270, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457952, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457956, + "carbs": null, + "insulin": null + }, + { + "_id": "6294d527dac1e20004fde59f", + "created_at": "2022-05-30T14:30:51.321Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 60, + "durationInMilliseconds": 3617187, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457947, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457951, + "carbs": null, + "insulin": null + }, + { + "_id": "6294d50ddac1e20004fde59c", + "created_at": "2022-05-30T14:30:37.211Z", + "enteredBy": "openaps://AndroidAPS", + "isValid": true, + "eventType": "Note", + "profileJson": "{\"units\":\"mg\\/dl\",\"dia\":6,\"timezone\":\"Africa\\/Cairo\",\"sens\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":108.98563968871171},{\"time\":\"01:00\",\"timeAsSeconds\":3600,\"value\":86.39270838723321},{\"time\":\"02:00\",\"timeAsSeconds\":7200,\"value\":66.06501229611953},{\"time\":\"03:00\",\"timeAsSeconds\":10800,\"value\":59.63365190514415},{\"time\":\"04:00\",\"timeAsSeconds\":14400,\"value\":55.52098625651353},{\"time\":\"05:00\",\"timeAsSeconds\":18000,\"value\":53.464653432198205},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":51.408320607882885},{\"time\":\"08:00\",\"timeAsSeconds\":28800,\"value\":53.464653432198205},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":57.933933859674},{\"time\":\"10:00\",\"timeAsSeconds\":36000,\"value\":71.14693631889794},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":86.39270838723321},{\"time\":\"12:00\",\"timeAsSeconds\":43200,\"value\":91.47463241001162},{\"time\":\"13:00\",\"timeAsSeconds\":46800,\"value\":101.63848045556841},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":106.72040447834692},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":111.80232850112533},{\"time\":\"22:00\",\"timeAsSeconds\":79200,\"value\":121.96617654668219},{\"time\":\"23:00\",\"timeAsSeconds\":82800,\"value\":131.6053007561802}],\"carbratio\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":7.260970158787537},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":6.2549363198441466},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":7.3587486115813485},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":6.2549363198441466}],\"basal\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":0.7336},{\"time\":\"01:00\",\"timeAsSeconds\":3600,\"value\":0.7352000000000001},{\"time\":\"02:00\",\"timeAsSeconds\":7200,\"value\":0.7752},{\"time\":\"03:00\",\"timeAsSeconds\":10800,\"value\":0.772},{\"time\":\"04:00\",\"timeAsSeconds\":14400,\"value\":0.6864},{\"time\":\"05:00\",\"timeAsSeconds\":18000,\"value\":0.6912},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":0.6296},{\"time\":\"07:00\",\"timeAsSeconds\":25200,\"value\":0.6480000000000001},{\"time\":\"08:00\",\"timeAsSeconds\":28800,\"value\":0.6048},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":0.6208},{\"time\":\"10:00\",\"timeAsSeconds\":36000,\"value\":0.6216},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":0.6024},{\"time\":\"12:00\",\"timeAsSeconds\":43200,\"value\":0.5784},{\"time\":\"13:00\",\"timeAsSeconds\":46800,\"value\":0.576},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":0.5744},{\"time\":\"15:00\",\"timeAsSeconds\":54000,\"value\":0.5768},{\"time\":\"16:00\",\"timeAsSeconds\":57600,\"value\":0.568},{\"time\":\"17:00\",\"timeAsSeconds\":61200,\"value\":0.508},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":0.4824},{\"time\":\"19:00\",\"timeAsSeconds\":68400,\"value\":0.4656},{\"time\":\"20:00\",\"timeAsSeconds\":72000,\"value\":0.5816},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":0.5912000000000001},{\"time\":\"23:00\",\"timeAsSeconds\":82800,\"value\":0.6072000000000001}],\"target_low\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":100},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":90},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":100},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":90},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":100},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":90},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":100}],\"target_high\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":100},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":90},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":100},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":90},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":100},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":90},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":100}]}", + "originalProfileName": "Training days", + "originalCustomizedName": "Training days(80%)", + "originalTimeshift": 0, + "originalPercentage": 80, + "originalDuration": 14400000, + "originalEnd": 1653935417554, + "notes": "Training days(80%)", + "carbs": null, + "insulin": null + }, + { + "_id": "6294d50ddac1e20004fde59b", + "timeshift": 0, + "percentage": 80, + "created_at": "2022-05-30T14:30:14.534Z", + "enteredBy": "openaps://AndroidAPS", + "isValid": true, + "eventType": "Profile Switch", + "duration": 240, + "profile": "Training days", + "profileJson": "{\"units\":\"mg\\/dl\",\"dia\":6,\"timezone\":\"Africa\\/Cairo\",\"sens\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":87.18851175096937},{\"time\":\"01:00\",\"timeAsSeconds\":3600,\"value\":69.11416670978657},{\"time\":\"02:00\",\"timeAsSeconds\":7200,\"value\":52.85200983689563},{\"time\":\"03:00\",\"timeAsSeconds\":10800,\"value\":47.706921524115316},{\"time\":\"04:00\",\"timeAsSeconds\":14400,\"value\":44.41678900521082},{\"time\":\"05:00\",\"timeAsSeconds\":18000,\"value\":42.77172274575857},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":41.12665648630631},{\"time\":\"08:00\",\"timeAsSeconds\":28800,\"value\":42.77172274575857},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":46.3471470877392},{\"time\":\"10:00\",\"timeAsSeconds\":36000,\"value\":56.91754905511835},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":69.11416670978657},{\"time\":\"12:00\",\"timeAsSeconds\":43200,\"value\":73.1797059280093},{\"time\":\"13:00\",\"timeAsSeconds\":46800,\"value\":81.31078436445473},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":85.37632358267754},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":89.44186280090027},{\"time\":\"22:00\",\"timeAsSeconds\":79200,\"value\":97.57294123734576},{\"time\":\"23:00\",\"timeAsSeconds\":82800,\"value\":105.28424060494416}],\"carbratio\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":5.80877612703003},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":5.003949055875317},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":5.886998889265079},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":5.003949055875317}],\"basal\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":0.917},{\"time\":\"01:00\",\"timeAsSeconds\":3600,\"value\":0.919},{\"time\":\"02:00\",\"timeAsSeconds\":7200,\"value\":0.969},{\"time\":\"03:00\",\"timeAsSeconds\":10800,\"value\":0.965},{\"time\":\"04:00\",\"timeAsSeconds\":14400,\"value\":0.858},{\"time\":\"05:00\",\"timeAsSeconds\":18000,\"value\":0.864},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":0.787},{\"time\":\"07:00\",\"timeAsSeconds\":25200,\"value\":0.81},{\"time\":\"08:00\",\"timeAsSeconds\":28800,\"value\":0.756},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":0.776},{\"time\":\"10:00\",\"timeAsSeconds\":36000,\"value\":0.777},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":0.753},{\"time\":\"12:00\",\"timeAsSeconds\":43200,\"value\":0.723},{\"time\":\"13:00\",\"timeAsSeconds\":46800,\"value\":0.72},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":0.718},{\"time\":\"15:00\",\"timeAsSeconds\":54000,\"value\":0.721},{\"time\":\"16:00\",\"timeAsSeconds\":57600,\"value\":0.71},{\"time\":\"17:00\",\"timeAsSeconds\":61200,\"value\":0.635},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":0.603},{\"time\":\"19:00\",\"timeAsSeconds\":68400,\"value\":0.582},{\"time\":\"20:00\",\"timeAsSeconds\":72000,\"value\":0.727},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":0.739},{\"time\":\"22:00\",\"timeAsSeconds\":79200,\"value\":0.739},{\"time\":\"23:00\",\"timeAsSeconds\":82800,\"value\":0.759}],\"target_low\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":100},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":90},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":100},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":90},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":100},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":90},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":100}],\"target_high\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":100},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":90},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":100},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":90},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":100},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":90},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":100}]}", + "carbs": null, + "insulin": null + }, + { + "_id": "6294c27452bed20004c9a2b9", + "created_at": "2022-05-30T13:10:58.834Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 79, + "durationInMilliseconds": 4790001, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457941, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457946, + "carbs": null, + "insulin": null + }, + { + "_id": "6294beec52bed20004c9a2b0", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-30T12:55:49.673Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "24g de glucides requis dans 15 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6294bdbe52bed20004c9a2ad", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-30T12:50:45.432Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "26g de glucides requis dans 20 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6294bc9dff39db0004546866", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-30T12:46:09.818Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "28g de glucides requis dans 25 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6294bb56ff39db0004546862", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-30T12:40:38.359Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "31g de glucides requis dans 30 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6294ba41ff39db000454685f", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-30T12:35:59.292Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "33g de glucides requis dans 35 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6294b913ff39db000454685d", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-30T12:30:53.968Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "35g de glucides requis dans 35 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6294b7e5ff39db0004546859", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-30T12:25:53.822Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "36g de glucides requis dans 40 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6294b6b7ff39db0004546856", + "created_at": "2022-05-30T12:20:57.742Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 49, + "durationInMilliseconds": 2999601, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457937, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457940, + "carbs": null, + "insulin": null + }, + { + "_id": "6294b6b7ff39db0004546855", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-30T12:20:55.578Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "36g de glucides requis dans 45 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6294ae7b0f39100004ec41eb", + "created_at": "2022-05-30T11:45:53.866Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 35, + "durationInMilliseconds": 2102390, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457933, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457936, + "carbs": null, + "insulin": null + }, + { + "_id": "6294ae480f39100004ec41e8", + "eventType": "Note", + "isValid": true, + "created_at": "2022-05-30T11:44:23.166Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "Pompe démarrée", + "carbs": null, + "insulin": null + }, + { + "_id": "6294ae480f39100004ec41e9", + "eventType": "Insulin Change", + "isValid": true, + "created_at": "2022-05-30T11:44:04.200Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "carbs": null, + "insulin": null + }, + { + "_id": "6294ad4d0f39100004ec41e6", + "eventType": "Note", + "isValid": true, + "created_at": "2022-05-30T11:40:51.759Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "Pompe suspendue", + "carbs": null, + "insulin": null + }, + { + "_id": "6294ad4d0f39100004ec41e4", + "eventType": "Meal Bolus", + "insulin": 10.22, + "created_at": "2022-05-30T11:40:44.413Z", + "date": 1653910844413, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 21998, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6294ad340f39100004ec41e3", + "eventType": "Bolus Wizard", + "created_at": "2022-05-30T11:40:28.961Z", + "isValid": true, + "bolusCalculatorResult": "{\"basalIOB\":-0.144,\"bolusIOB\":-2.272,\"carbs\":50.0,\"carbsInsulin\":8.493291903141824,\"cob\":0.0,\"cobInsulin\":0.0,\"dateCreated\":1653910829149,\"glucoseDifference\":142.0,\"glucoseInsulin\":1.7463858098271619,\"glucoseTrend\":18.5,\"glucoseValue\":232.0,\"ic\":5.886998889265079,\"id\":1578,\"interfaceIDs_backing\":{},\"isValid\":true,\"isf\":81.31078436445473,\"note\":\"\",\"otherCorrection\":0.0,\"percentageCorrection\":120,\"profileName\":\"Training days\",\"superbolusInsulin\":0.0,\"targetBGHigh\":90.0,\"targetBGLow\":90.0,\"timestamp\":1653910828961,\"totalInsulin\":10.21,\"trendInsulin\":0.6825662848268133,\"utcOffset\":7200000,\"version\":0,\"wasBasalIOBUsed\":true,\"wasBolusIOBUsed\":true,\"wasCOBUsed\":true,\"wasGlucoseUsed\":true,\"wasSuperbolusUsed\":false,\"wasTempTargetUsed\":false,\"wasTrendUsed\":true,\"wereCarbsUsed\":false}", + "date": 1653910828961, + "glucose": 232, + "units": "mg/dl", + "notes": "", + "carbs": null, + "insulin": null + }, + { + "_id": "6294ac24ac54000004308890", + "created_at": "2022-05-30T11:35:47.458Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 604926, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457913, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457932, + "carbs": null, + "insulin": null + }, + { + "_id": "6294aaf7ac5400000430888b", + "eventType": "Correction Bolus", + "insulin": 0.56, + "created_at": "2022-05-30T11:30:58.979Z", + "date": 1653910258979, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21997, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6294aaf7ac5400000430888d", + "created_at": "2022-05-30T11:30:56.911Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 289057, + "type": "NORMAL", + "rate": 0.21599999999999997, + "percent": -70, + "pumpId": 457908, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457912, + "carbs": null, + "insulin": null + }, + { + "_id": "6294a9e2ac54000004308889", + "created_at": "2022-05-30T11:26:00.011Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 294405, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457905, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457907, + "carbs": null, + "insulin": null + }, + { + "_id": "6294a8b5ac54000004308885", + "eventType": "Correction Bolus", + "insulin": 1.3, + "created_at": "2022-05-30T11:21:17.561Z", + "date": 1653909677561, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21996, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6294a8b5ac54000004308886", + "created_at": "2022-05-30T11:21:15.161Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 275000, + "type": "FAKE_EXTENDED", + "rate": 4.123636363636364, + "absolute": 4.123636363636364, + "pumpId": 21995, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-30T11:21:15.161Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 4, + "durationInMilliseconds": 275000, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.26, + "relative": 3.403636363636364, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 21995, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "carbs": null, + "insulin": null + }, + { + "_id": "6294a673ac5400000430887e", + "eventType": "Correction Bolus", + "insulin": 0.56, + "created_at": "2022-05-30T11:11:41.446Z", + "date": 1653909101446, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21994, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6294a673ac54000004308880", + "created_at": "2022-05-30T11:11:38.414Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 576747, + "type": "FAKE_EXTENDED", + "rate": 2.92, + "absolute": 2.92, + "pumpId": 21993, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-30T11:11:38.414Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 9, + "durationInMilliseconds": 576747, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.35245650000000006, + "relative": 2.2, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 21993, + "endId": 21995, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "endId": 21995, + "carbs": null, + "insulin": null + }, + { + "_id": "6294a4f9ac5400000430887b", + "eventType": "Note", + "isValid": true, + "created_at": "2022-05-30T11:05:10.963Z", + "units": "mg/dl", + "notes": "AndroidAPS est lancé - samsung SM-A405FN", + "carbs": null, + "insulin": null + }, + { + "_id": "6294a3f0ac54000004308879", + "created_at": "2022-05-30T11:00:58.834Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 627902, + "type": "NORMAL", + "rate": 0.504, + "percent": -30, + "pumpId": 457887, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457889, + "carbs": null, + "insulin": null + }, + { + "_id": "6294a2d9ac54000004308876", + "created_at": "2022-05-30T10:56:07.755Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 289590, + "type": "NORMAL", + "rate": 0.6507, + "percent": -10, + "pumpId": 457883, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457886, + "carbs": null, + "insulin": null + }, + { + "_id": "62949f4bc2e464000413b7a5", + "created_at": "2022-05-30T10:41:06.400Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 899864, + "type": "NORMAL", + "rate": 0.5783999999999999, + "percent": -20, + "pumpId": 457880, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457882, + "carbs": null, + "insulin": null + }, + { + "_id": "6294ad4d0f39100004ec41e5", + "eventType": "Meal Bolus", + "carbs": 50, + "created_at": "2022-05-30T10:40:28.961Z", + "isValid": true, + "date": 1653907228961, + "insulin": null + }, + { + "_id": "62949aaec2e464000413b79c", + "created_at": "2022-05-30T10:21:11.134Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 19, + "durationInMilliseconds": 1192773, + "type": "NORMAL", + "rate": 0.3615, + "percent": -50, + "pumpId": 457877, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457879, + "carbs": null, + "insulin": null + }, + { + "_id": "629498395989a90004f0c232", + "created_at": "2022-05-30T10:10:51.972Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 617668, + "type": "NORMAL", + "rate": 0.5061, + "percent": -30, + "pumpId": 457874, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457876, + "carbs": null, + "insulin": null + }, + { + "_id": "629497255989a90004f0c22f", + "created_at": "2022-05-30T10:06:04.609Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 285883, + "type": "NORMAL", + "rate": 0.6507, + "percent": -10, + "pumpId": 457871, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457873, + "carbs": null, + "insulin": null + }, + { + "_id": "629495c55989a90004f0c22b", + "eventType": "Temporary Target", + "duration": 60, + "durationInMilliseconds": 3600000, + "isValid": true, + "created_at": "2022-05-30T10:00:20.925Z", + "timestamp": 1653904820925, + "enteredBy": "AndroidAPS", + "reason": "Automation", + "targetBottom": 85, + "targetTop": 85, + "units": "mg/dl", + "carbs": null, + "insulin": null + }, + { + "_id": "629493845989a90004f0c227", + "created_at": "2022-05-30T09:50:42.429Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 637607, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457864, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457867, + "carbs": null, + "insulin": null + }, + { + "_id": "62948cad76174b0004fbd224", + "created_at": "2022-05-30T09:21:26.391Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1753548, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457861, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457863, + "carbs": null, + "insulin": null + }, + { + "_id": "62948b4d76174b0004fbd221", + "created_at": "2022-05-30T09:15:44.467Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 339433, + "type": "NORMAL", + "rate": 0.3012, + "percent": -60, + "pumpId": 457858, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457860, + "carbs": null, + "insulin": null + }, + { + "_id": "629489008ecbb3000401e2df", + "created_at": "2022-05-30T09:05:54.354Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 587619, + "type": "NORMAL", + "rate": 0.1506, + "percent": -80, + "pumpId": 457854, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457857, + "carbs": null, + "insulin": null + }, + { + "_id": "629485788ecbb3000401e2d9", + "created_at": "2022-05-30T08:50:58.583Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 605568, + "type": "NORMAL", + "rate": 0.8547, + "percent": 10, + "pumpId": 457847, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457850, + "carbs": null, + "insulin": null + }, + { + "_id": "6294844b8ecbb3000401e2d4", + "eventType": "Correction Bolus", + "insulin": 0.24, + "created_at": "2022-05-30T08:45:49.557Z", + "date": 1653900349557, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21992, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6294844b8ecbb3000401e2d6", + "created_at": "2022-05-30T08:45:47.742Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 309352, + "type": "NORMAL", + "rate": 1.7094, + "percent": 120, + "pumpId": 457842, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457846, + "carbs": null, + "insulin": null + }, + { + "_id": "6294831e8ecbb3000401e2d2", + "created_at": "2022-05-30T08:40:41.524Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 304721, + "type": "NORMAL", + "rate": 0.8547, + "percent": 10, + "pumpId": 457839, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457841, + "carbs": null, + "insulin": null + }, + { + "_id": "629481f18ecbb3000401e2cf", + "created_at": "2022-05-30T08:35:41.513Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 298517, + "type": "NORMAL", + "rate": 0.3885, + "percent": -50, + "pumpId": 457836, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457838, + "carbs": null, + "insulin": null + }, + { + "_id": "629480cfd10aeb0004cd3ff6", + "created_at": "2022-05-30T08:31:00.195Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 278821, + "type": "NORMAL", + "rate": 0.1554, + "percent": -80, + "pumpId": 457833, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457835, + "carbs": null, + "insulin": null + }, + { + "_id": "62947fa2d10aeb0004cd3ff1", + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-30T08:26:06.795Z", + "date": 1653899166795, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21991, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62947fa3d10aeb0004cd3ff3", + "created_at": "2022-05-30T08:26:04.750Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 292954, + "type": "NORMAL", + "rate": 1.2432, + "percent": 60, + "pumpId": 457828, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457832, + "carbs": null, + "insulin": null + }, + { + "_id": "62947e75d10aeb0004cd3fef", + "created_at": "2022-05-30T08:20:55.136Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 308124, + "type": "NORMAL", + "rate": 0.3108, + "percent": -60, + "pumpId": 457825, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457827, + "carbs": null, + "insulin": null + }, + { + "_id": "62946ac16e1b8e0004363e00", + "created_at": "2022-05-30T06:56:40.471Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 84, + "durationInMilliseconds": 5053176, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457819, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457824, + "carbs": null, + "insulin": null + }, + { + "_id": "62946376b82b320004ef5ece", + "created_at": "2022-05-30T06:25:52.633Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 30, + "durationInMilliseconds": 1845357, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457816, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457818, + "carbs": null, + "insulin": null + }, + { + "_id": "62946279b82b320004ef5ec9", + "eventType": "Note", + "isValid": true, + "created_at": "2022-05-30T06:20:55.768Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "Avertissement W31 : Réservoir bas", + "carbs": null, + "insulin": null + }, + { + "_id": "62946247b82b320004ef5ec8", + "eventType": "Meal Bolus", + "insulin": 16.26, + "created_at": "2022-05-30T06:20:45.443Z", + "date": 1653891645443, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 21990, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6294622db82b320004ef5ec7", + "eventType": "Bolus Wizard", + "created_at": "2022-05-30T06:20:04.980Z", + "isValid": true, + "bolusCalculatorResult": "{\"basalIOB\":0.444,\"bolusIOB\":-0.239,\"carbs\":75.0,\"carbsInsulin\":14.988162182014982,\"cob\":0.0,\"cobInsulin\":0.0,\"dateCreated\":1653891605009,\"glucoseDifference\":9.0,\"glucoseInsulin\":0.21041939445594296,\"glucoseTrend\":12.0,\"glucoseValue\":99.0,\"ic\":5.003949055875317,\"id\":1576,\"interfaceIDs_backing\":{},\"isValid\":true,\"isf\":42.77172274575857,\"note\":\"\",\"otherCorrection\":0.0,\"percentageCorrection\":100,\"profileName\":\"Training days\",\"superbolusInsulin\":0.0,\"targetBGHigh\":90.0,\"targetBGLow\":90.0,\"timestamp\":1653891604980,\"totalInsulin\":16.25,\"trendInsulin\":0.8416775778237718,\"utcOffset\":7200000,\"version\":0,\"wasBasalIOBUsed\":true,\"wasBolusIOBUsed\":true,\"wasCOBUsed\":true,\"wasGlucoseUsed\":true,\"wasSuperbolusUsed\":false,\"wasTempTargetUsed\":false,\"wasTrendUsed\":true,\"wereCarbsUsed\":false}", + "date": 1653891604980, + "glucose": 99, + "units": "mg/dl", + "notes": "", + "carbs": null, + "insulin": null + }, + { + "_id": "62945ff6d2cadd0004350d8b", + "created_at": "2022-05-30T06:10:53.144Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 897997, + "type": "NORMAL", + "rate": 0.6048, + "percent": -20, + "pumpId": 457809, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457815, + "carbs": null, + "insulin": null + }, + { + "_id": "62945ee1d2cadd0004350d88", + "created_at": "2022-05-30T06:06:14.629Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 276025, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457806, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457808, + "carbs": null, + "insulin": null + }, + { + "_id": "62946279b82b320004ef5eca", + "eventType": "Meal Bolus", + "carbs": 75, + "created_at": "2022-05-30T06:05:04.980Z", + "isValid": true, + "date": 1653890704980, + "insulin": null + }, + { + "_id": "62945d9ad2cadd0004350d85", + "created_at": "2022-05-30T06:00:37.634Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 335497, + "type": "NORMAL", + "rate": 0.2268, + "percent": -70, + "pumpId": 457803, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457805, + "carbs": null, + "insulin": null + }, + { + "_id": "62945c84d2cadd0004350d82", + "created_at": "2022-05-30T05:55:56.652Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 279490, + "type": "NORMAL", + "rate": 0.7290000000000001, + "percent": -10, + "pumpId": 457799, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457802, + "carbs": null, + "insulin": null + }, + { + "_id": "62945b56d2cadd0004350d7f", + "created_at": "2022-05-30T05:51:11.125Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 284042, + "type": "NORMAL", + "rate": 0.08100000000000002, + "percent": -90, + "pumpId": 457796, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457798, + "carbs": null, + "insulin": null + }, + { + "_id": "62945a29d2cadd0004350d7c", + "created_at": "2022-05-30T05:46:04.618Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 304018, + "type": "NORMAL", + "rate": 0.08100000000000002, + "percent": -90, + "pumpId": 457793, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457795, + "carbs": null, + "insulin": null + }, + { + "_id": "62945992d2cadd0004350d79", + "created_at": "2022-05-30T05:43:22.980Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 2, + "durationInMilliseconds": 160150, + "type": "NORMAL", + "rate": 0.8910000000000001, + "percent": 10, + "pumpId": 457790, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457792, + "carbs": null, + "insulin": null + }, + { + "_id": "629457f413be4d00048f99e5", + "created_at": "2022-05-30T05:36:39.361Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 6, + "durationInMilliseconds": 402130, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457787, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457789, + "carbs": null, + "insulin": null + }, + { + "_id": "629456ad13be4d00048f99e2", + "created_at": "2022-05-30T05:31:20.230Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 316643, + "type": "NORMAL", + "rate": 0.8910000000000001, + "percent": 10, + "pumpId": 457784, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457786, + "carbs": null, + "insulin": null + }, + { + "_id": "6294559813be4d00048f99df", + "created_at": "2022-05-30T05:26:33.058Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 284676, + "type": "NORMAL", + "rate": 1.5390000000000001, + "percent": 90, + "pumpId": 457781, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457783, + "carbs": null, + "insulin": null + }, + { + "_id": "6294546a13be4d00048f99db", + "eventType": "Correction Bolus", + "insulin": 0.1, + "created_at": "2022-05-30T05:21:40.755Z", + "date": 1653888100755, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21989, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6294546b13be4d00048f99dc", + "created_at": "2022-05-30T05:21:37.532Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 294039, + "type": "NORMAL", + "rate": 1.215, + "percent": 50, + "pumpId": 457776, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457780, + "carbs": null, + "insulin": null + }, + { + "_id": "6294520f13be4d00048f99d6", + "created_at": "2022-05-30T05:11:40.257Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 594790, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457773, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457775, + "carbs": null, + "insulin": null + }, + { + "_id": "629450fa13be4d00048f99d3", + "created_at": "2022-05-30T05:06:57.622Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 280151, + "type": "NORMAL", + "rate": 0.08100000000000002, + "percent": -90, + "pumpId": 457770, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457772, + "carbs": null, + "insulin": null + }, + { + "_id": "62944e90c0f24700048ea5f5", + "created_at": "2022-05-30T04:56:35.596Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 294089, + "type": "NORMAL", + "rate": 0.1574, + "percent": -80, + "pumpId": 457763, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457766, + "carbs": null, + "insulin": null + }, + { + "_id": "62944c33c0f24700048ea5f0", + "created_at": "2022-05-30T04:46:35.308Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 598821, + "type": "NORMAL", + "rate": 0.0787, + "percent": -90, + "pumpId": 457760, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457762, + "carbs": null, + "insulin": null + }, + { + "_id": "62944b06c0f24700048ea5ea", + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-30T04:41:36.155Z", + "date": 1653885696155, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21988, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62944b06c0f24700048ea5ed", + "created_at": "2022-05-30T04:41:33.737Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299075, + "type": "NORMAL", + "rate": 1.4165999999999999, + "percent": 80, + "pumpId": 457754, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457759, + "carbs": null, + "insulin": null + }, + { + "_id": "62944b06c0f24700048ea5eb", + "eventType": "Note", + "isValid": true, + "created_at": "2022-05-30T04:33:29.750Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "Avertissement W32 : Batterie faible", + "carbs": null, + "insulin": null + }, + { + "_id": "629448abc0f24700048ea5e6", + "created_at": "2022-05-30T04:31:29.135Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 603111, + "type": "NORMAL", + "rate": 0.4722, + "percent": -40, + "pumpId": 457748, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457753, + "carbs": null, + "insulin": null + }, + { + "_id": "62944788c319020004344fc3", + "created_at": "2022-05-30T04:26:24.314Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 303324, + "type": "NORMAL", + "rate": 0.7082999999999999, + "percent": -10, + "pumpId": 457745, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457747, + "carbs": null, + "insulin": null + }, + { + "_id": "6294465ac319020004344fbf", + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-30T04:21:40.190Z", + "date": 1653884500190, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21987, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6294452cc319020004344fbb", + "eventType": "Correction Bolus", + "insulin": 0.12, + "created_at": "2022-05-30T04:16:23.222Z", + "date": 1653884183222, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21986, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6294452cc319020004344fbd", + "created_at": "2022-05-30T04:16:21.242Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 600581, + "type": "NORMAL", + "rate": 1.2592, + "percent": 60, + "pumpId": 457738, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457744, + "carbs": null, + "insulin": null + }, + { + "_id": "629443ffc319020004344fb9", + "created_at": "2022-05-30T04:11:37.634Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 281119, + "type": "NORMAL", + "rate": 0.5509000000000001, + "percent": -30, + "pumpId": 457734, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457737, + "carbs": null, + "insulin": null + }, + { + "_id": "629442d2c319020004344fb6", + "created_at": "2022-05-30T04:06:36.554Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299592, + "type": "NORMAL", + "rate": 0.8657, + "percent": 10, + "pumpId": 457731, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457733, + "carbs": null, + "insulin": null + }, + { + "_id": "629441bdc319020004344fb2", + "created_at": "2022-05-30T04:02:01.839Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 272225, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457728, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457730, + "carbs": null, + "insulin": null + }, + { + "_id": "62943bd1a743da00044e28e4", + "created_at": "2022-05-30T03:36:23.863Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 25, + "durationInMilliseconds": 1536482, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457724, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457727, + "carbs": null, + "insulin": null + }, + { + "_id": "62943aa3a743da00044e28e0", + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-30T03:31:24.792Z", + "date": 1653881484792, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21985, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62943aa4a743da00044e28e1", + "created_at": "2022-05-30T03:31:22.771Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299601, + "type": "NORMAL", + "rate": 1.5552000000000001, + "percent": 80, + "pumpId": 457719, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457723, + "carbs": null, + "insulin": null + }, + { + "_id": "6294385da365640004d83ccb", + "created_at": "2022-05-30T03:21:42.950Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 578328, + "type": "NORMAL", + "rate": 0.0864, + "percent": -90, + "pumpId": 457716, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457718, + "carbs": null, + "insulin": null + }, + { + "_id": "6294372fa365640004d83cc7", + "eventType": "Correction Bolus", + "insulin": 0.48, + "created_at": "2022-05-30T03:16:53.627Z", + "date": 1653880613627, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21984, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6294372fa365640004d83cc8", + "created_at": "2022-05-30T03:16:50.671Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 282000, + "type": "FAKE_EXTENDED", + "rate": 3.417191489361702, + "absolute": 3.417191489361702, + "pumpId": 21983, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-30T03:16:50.671Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 4, + "durationInMilliseconds": 282000, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.2, + "relative": 2.5531914893617023, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 21983, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "carbs": null, + "insulin": null + }, + { + "_id": "629434b9a365640004d83cc1", + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-30T03:06:26.954Z", + "date": 1653879986954, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21982, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62943277a365640004d83cbc", + "eventType": "Correction Bolus", + "insulin": 0.32, + "created_at": "2022-05-30T02:56:44.155Z", + "date": 1653879404155, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21981, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62943278a365640004d83cbd", + "created_at": "2022-05-30T02:56:41.816Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 19, + "durationInMilliseconds": 1196851, + "type": "NORMAL", + "rate": 2.145, + "percent": 150, + "pumpId": 457699, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457706, + "carbs": null, + "insulin": null + }, + { + "_id": "62943010ee9e6e00046d7ff3", + "eventType": "Correction Bolus", + "insulin": 0.26, + "created_at": "2022-05-30T02:46:22.948Z", + "date": 1653878782948, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21980, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62943011ee9e6e00046d7ff5", + "created_at": "2022-05-30T02:46:20.921Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 619407, + "type": "NORMAL", + "rate": 1.8876, + "percent": 120, + "pumpId": 457693, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457698, + "carbs": null, + "insulin": null + }, + { + "_id": "62942ee3ee9e6e00046d7ff1", + "created_at": "2022-05-30T02:41:20.762Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 298664, + "type": "NORMAL", + "rate": 0.5147999999999999, + "percent": -40, + "pumpId": 457690, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457692, + "carbs": null, + "insulin": null + }, + { + "_id": "62942db6ee9e6e00046d7fee", + "created_at": "2022-05-30T02:36:22.192Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 297076, + "type": "NORMAL", + "rate": 0.1716, + "percent": -80, + "pumpId": 457687, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457689, + "carbs": null, + "insulin": null + }, + { + "_id": "629427e7a90f7f00040c0d51", + "created_at": "2022-05-30T02:11:31.145Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 24, + "durationInMilliseconds": 1488556, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457684, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457686, + "carbs": null, + "insulin": null + }, + { + "_id": "62942688a90f7f00040c0d4e", + "created_at": "2022-05-30T02:05:44.144Z", + "enteredBy": "openaps://AndroidAPS", + "isValid": true, + "eventType": "Note", + "profileJson": "{\"units\":\"mg\\/dl\",\"dia\":6,\"timezone\":\"Africa\\/Cairo\",\"sens\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":87.18851175096937},{\"time\":\"01:00\",\"timeAsSeconds\":3600,\"value\":69.11416670978657},{\"time\":\"02:00\",\"timeAsSeconds\":7200,\"value\":52.85200983689563},{\"time\":\"03:00\",\"timeAsSeconds\":10800,\"value\":47.706921524115316},{\"time\":\"04:00\",\"timeAsSeconds\":14400,\"value\":44.41678900521082},{\"time\":\"05:00\",\"timeAsSeconds\":18000,\"value\":42.77172274575857},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":41.12665648630631},{\"time\":\"08:00\",\"timeAsSeconds\":28800,\"value\":42.77172274575857},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":46.3471470877392},{\"time\":\"10:00\",\"timeAsSeconds\":36000,\"value\":56.91754905511835},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":69.11416670978657},{\"time\":\"12:00\",\"timeAsSeconds\":43200,\"value\":73.1797059280093},{\"time\":\"13:00\",\"timeAsSeconds\":46800,\"value\":81.31078436445473},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":85.37632358267754},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":89.44186280090027},{\"time\":\"22:00\",\"timeAsSeconds\":79200,\"value\":97.57294123734576},{\"time\":\"23:00\",\"timeAsSeconds\":82800,\"value\":105.28424060494416}],\"carbratio\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":5.80877612703003},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":5.003949055875317},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":5.886998889265079},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":5.003949055875317}],\"basal\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":0.917},{\"time\":\"01:00\",\"timeAsSeconds\":3600,\"value\":0.919},{\"time\":\"02:00\",\"timeAsSeconds\":7200,\"value\":0.969},{\"time\":\"03:00\",\"timeAsSeconds\":10800,\"value\":0.965},{\"time\":\"04:00\",\"timeAsSeconds\":14400,\"value\":0.858},{\"time\":\"05:00\",\"timeAsSeconds\":18000,\"value\":0.864},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":0.787},{\"time\":\"07:00\",\"timeAsSeconds\":25200,\"value\":0.81},{\"time\":\"08:00\",\"timeAsSeconds\":28800,\"value\":0.756},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":0.776},{\"time\":\"10:00\",\"timeAsSeconds\":36000,\"value\":0.777},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":0.753},{\"time\":\"12:00\",\"timeAsSeconds\":43200,\"value\":0.723},{\"time\":\"13:00\",\"timeAsSeconds\":46800,\"value\":0.72},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":0.718},{\"time\":\"15:00\",\"timeAsSeconds\":54000,\"value\":0.721},{\"time\":\"16:00\",\"timeAsSeconds\":57600,\"value\":0.71},{\"time\":\"17:00\",\"timeAsSeconds\":61200,\"value\":0.635},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":0.603},{\"time\":\"19:00\",\"timeAsSeconds\":68400,\"value\":0.582},{\"time\":\"20:00\",\"timeAsSeconds\":72000,\"value\":0.727},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":0.739},{\"time\":\"23:00\",\"timeAsSeconds\":82800,\"value\":0.759}],\"target_low\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":100},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":90},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":100},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":90},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":100},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":90},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":100}],\"target_high\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":100},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":90},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":100},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":90},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":100},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":90},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":100}]}", + "originalProfileName": "Training days", + "originalCustomizedName": "Training days", + "originalTimeshift": 0, + "originalPercentage": 100, + "originalDuration": 0, + "originalEnd": 1653876333580, + "notes": "Training days", + "carbs": null, + "insulin": null + }, + { + "_id": "6294266fa90f7f00040c0d4c", + "timeshift": 0, + "percentage": 100, + "created_at": "2022-05-30T02:05:33.580Z", + "enteredBy": "openaps://AndroidAPS", + "isValid": true, + "eventType": "Profile Switch", + "duration": 0, + "profile": "Training days", + "profileJson": "{\"units\":\"mg\\/dl\",\"dia\":6,\"timezone\":\"Africa\\/Cairo\",\"sens\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":87.18851175096937},{\"time\":\"01:00\",\"timeAsSeconds\":3600,\"value\":69.11416670978657},{\"time\":\"02:00\",\"timeAsSeconds\":7200,\"value\":52.85200983689563},{\"time\":\"03:00\",\"timeAsSeconds\":10800,\"value\":47.706921524115316},{\"time\":\"04:00\",\"timeAsSeconds\":14400,\"value\":44.41678900521082},{\"time\":\"05:00\",\"timeAsSeconds\":18000,\"value\":42.77172274575857},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":41.12665648630631},{\"time\":\"08:00\",\"timeAsSeconds\":28800,\"value\":42.77172274575857},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":46.3471470877392},{\"time\":\"10:00\",\"timeAsSeconds\":36000,\"value\":56.91754905511835},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":69.11416670978657},{\"time\":\"12:00\",\"timeAsSeconds\":43200,\"value\":73.1797059280093},{\"time\":\"13:00\",\"timeAsSeconds\":46800,\"value\":81.31078436445473},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":85.37632358267754},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":89.44186280090027},{\"time\":\"22:00\",\"timeAsSeconds\":79200,\"value\":97.57294123734576},{\"time\":\"23:00\",\"timeAsSeconds\":82800,\"value\":105.28424060494416}],\"carbratio\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":5.80877612703003},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":5.003949055875317},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":5.886998889265079},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":5.003949055875317}],\"basal\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":0.917},{\"time\":\"01:00\",\"timeAsSeconds\":3600,\"value\":0.919},{\"time\":\"02:00\",\"timeAsSeconds\":7200,\"value\":0.969},{\"time\":\"03:00\",\"timeAsSeconds\":10800,\"value\":0.965},{\"time\":\"04:00\",\"timeAsSeconds\":14400,\"value\":0.858},{\"time\":\"05:00\",\"timeAsSeconds\":18000,\"value\":0.864},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":0.787},{\"time\":\"07:00\",\"timeAsSeconds\":25200,\"value\":0.81},{\"time\":\"08:00\",\"timeAsSeconds\":28800,\"value\":0.756},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":0.776},{\"time\":\"10:00\",\"timeAsSeconds\":36000,\"value\":0.777},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":0.753},{\"time\":\"12:00\",\"timeAsSeconds\":43200,\"value\":0.723},{\"time\":\"13:00\",\"timeAsSeconds\":46800,\"value\":0.72},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":0.718},{\"time\":\"15:00\",\"timeAsSeconds\":54000,\"value\":0.721},{\"time\":\"16:00\",\"timeAsSeconds\":57600,\"value\":0.71},{\"time\":\"17:00\",\"timeAsSeconds\":61200,\"value\":0.635},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":0.603},{\"time\":\"19:00\",\"timeAsSeconds\":68400,\"value\":0.582},{\"time\":\"20:00\",\"timeAsSeconds\":72000,\"value\":0.727},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":0.739},{\"time\":\"22:00\",\"timeAsSeconds\":79200,\"value\":0.739},{\"time\":\"23:00\",\"timeAsSeconds\":82800,\"value\":0.759}],\"target_low\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":100},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":90},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":100},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":90},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":100},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":90},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":100}],\"target_high\":[{\"time\":\"00:00\",\"timeAsSeconds\":0,\"value\":100},{\"time\":\"06:00\",\"timeAsSeconds\":21600,\"value\":90},{\"time\":\"09:00\",\"timeAsSeconds\":32400,\"value\":100},{\"time\":\"11:00\",\"timeAsSeconds\":39600,\"value\":90},{\"time\":\"14:00\",\"timeAsSeconds\":50400,\"value\":100},{\"time\":\"18:00\",\"timeAsSeconds\":64800,\"value\":90},{\"time\":\"21:00\",\"timeAsSeconds\":75600,\"value\":100}]}", + "carbs": null, + "insulin": null + }, + { + "_id": "62942460a90f7f00040c0d48", + "created_at": "2022-05-30T01:56:36.130Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 893527, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457677, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457683, + "carbs": null, + "insulin": null + }, + { + "_id": "6294219fa90f7f00040c0d41", + "eventType": "Temporary Target", + "duration": 90, + "durationInMilliseconds": 5400000, + "isValid": true, + "created_at": "2022-05-30T01:45:00.160Z", + "timestamp": 1653875100160, + "enteredBy": "AndroidAPS", + "reason": "Automation", + "targetBottom": 120, + "targetTop": 120, + "units": "mg/dl", + "carbs": null, + "insulin": null + }, + { + "_id": "62941769773aab00049f760c", + "created_at": "2022-05-30T01:01:19.791Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 55, + "durationInMilliseconds": 3314849, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457674, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457676, + "carbs": null, + "insulin": null + }, + { + "_id": "62941070773aab00049f75ff", + "created_at": "2022-05-30T00:31:28.314Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1789990, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457669, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457673, + "carbs": null, + "insulin": null + }, + { + "_id": "62940e203d4dab0004cd1c4d", + "created_at": "2022-05-30T00:21:34.178Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 591648, + "type": "NORMAL", + "rate": 1.1223, + "percent": -10, + "pumpId": 457666, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457668, + "carbs": null, + "insulin": null + }, + { + "_id": "6294094f3d4dab0004cd1c42", + "created_at": "2022-05-30T00:01:02.427Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 20, + "durationInMilliseconds": 1230257, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457662, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457665, + "carbs": null, + "insulin": null + }, + { + "_id": "629409363d4dab0004cd1c40", + "eventType": "Temporary Target", + "duration": 90, + "durationInMilliseconds": 5400000, + "isValid": true, + "created_at": "2022-05-30T00:00:41.151Z", + "timestamp": 1653868841151, + "enteredBy": "AndroidAPS", + "reason": "Automation", + "targetBottom": 120, + "targetTop": 120, + "units": "mg/dl", + "carbs": null, + "insulin": null + }, + { + "_id": "629405d50174fb0004ce672c", + "created_at": "2022-05-29T23:46:20.699Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 879249, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457657, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457661, + "carbs": null, + "insulin": null + }, + { + "_id": "6294000a0174fb0004ce6721", + "created_at": "2022-05-29T23:21:37.300Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 24, + "durationInMilliseconds": 1481907, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457654, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457656, + "carbs": null, + "insulin": null + }, + { + "_id": "6293fb25d1a5200004a64e29", + "eventType": "Temporary Target", + "duration": 60, + "durationInMilliseconds": 3600000, + "isValid": true, + "created_at": "2022-05-29T23:00:27.400Z", + "timestamp": 1653865227400, + "enteredBy": "AndroidAPS", + "reason": "Automation", + "targetBottom": 110, + "targetTop": 110, + "units": "mg/dl", + "carbs": null, + "insulin": null + }, + { + "_id": "6293fa2ad1a5200004a64e27", + "created_at": "2022-05-29T22:56:19.507Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 25, + "durationInMilliseconds": 1515302, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457650, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457653, + "carbs": null, + "insulin": null + }, + { + "_id": "6293f8fcd1a5200004a64e22", + "eventType": "Correction Bolus", + "insulin": 0.22, + "created_at": "2022-05-29T22:51:31.787Z", + "date": 1653864691787, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21979, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293f8fcd1a5200004a64e24", + "created_at": "2022-05-29T22:51:29.742Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 288274, + "type": "NORMAL", + "rate": 0.43, + "percent": -60, + "pumpId": 457645, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457649, + "carbs": null, + "insulin": null + }, + { + "_id": "6293f7e8d1a5200004a64e20", + "created_at": "2022-05-29T22:46:43.874Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 284375, + "type": "NORMAL", + "rate": 0.43, + "percent": -60, + "pumpId": 457642, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457644, + "carbs": null, + "insulin": null + }, + { + "_id": "6293f6d2d1a5200004a64e1a", + "eventType": "Correction Bolus", + "insulin": 0.14, + "created_at": "2022-05-29T22:41:50.545Z", + "date": 1653864110545, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21978, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293f6d3d1a5200004a64e1c", + "created_at": "2022-05-29T22:41:48.373Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 294017, + "type": "NORMAL", + "rate": 0.3225, + "percent": -70, + "pumpId": 457637, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457641, + "carbs": null, + "insulin": null + }, + { + "_id": "6293f59d9ecc5e0004355b00", + "created_at": "2022-05-29T22:36:57.686Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 288195, + "type": "NORMAL", + "rate": 0.3225, + "percent": -70, + "pumpId": 457634, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457636, + "carbs": null, + "insulin": null + }, + { + "_id": "6293f46f9ecc5e0004355afc", + "eventType": "Correction Bolus", + "insulin": 0.46, + "created_at": "2022-05-29T22:31:50.989Z", + "date": 1653863510989, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21977, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293f46f9ecc5e0004355afd", + "created_at": "2022-05-29T22:31:48.259Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 299000, + "type": "FAKE_EXTENDED", + "rate": 3.242224080267558, + "absolute": 3.242224080267558, + "pumpId": 21976, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-29T22:31:48.259Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 4, + "durationInMilliseconds": 299000, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.18, + "relative": 2.1672240802675584, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 21976, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "carbs": null, + "insulin": null + }, + { + "_id": "6293eaa265b2420004c06370", + "eventType": "Temporary Target", + "duration": 60, + "durationInMilliseconds": 3600000, + "isValid": true, + "created_at": "2022-05-29T21:50:13.436Z", + "timestamp": 1653861013436, + "enteredBy": "AndroidAPS", + "reason": "Automation", + "targetBottom": 110, + "targetTop": 110, + "units": "mg/dl", + "carbs": null, + "insulin": null + }, + { + "_id": "6293f750d1a5200004a64e1d", + "eventType": "Carb Correction", + "carbs": 10, + "created_at": "2022-05-29T21:45:40.000Z", + "isValid": true, + "date": 1653860740000, + "insulin": null + }, + { + "_id": "6293e89365b2420004c0636c", + "created_at": "2022-05-29T21:41:33.569Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 50, + "durationInMilliseconds": 3003675, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457619, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457624, + "carbs": null, + "insulin": null + }, + { + "_id": "6293e19d65b2420004c06360", + "created_at": "2022-05-29T21:11:41.680Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1789396, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457616, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457618, + "carbs": null, + "insulin": null + }, + { + "_id": "6293e07065b2420004c0635c", + "eventType": "Correction Bolus", + "insulin": 0.34, + "created_at": "2022-05-29T21:06:44.914Z", + "date": 1653858404914, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21975, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293de1665b2420004c06357", + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-29T20:56:33.937Z", + "date": 1653857793937, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21974, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293da9f5d63e500043da7b2", + "created_at": "2022-05-29T20:41:52.642Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1787544, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457608, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457615, + "carbs": null, + "insulin": null + }, + { + "_id": "6293d9715d63e500043da7ae", + "eventType": "Correction Bolus", + "insulin": 0.32, + "created_at": "2022-05-29T20:36:42.707Z", + "date": 1653856602707, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21973, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293d6fe5d63e500043da7a9", + "eventType": "Correction Bolus", + "insulin": 0.42, + "created_at": "2022-05-29T20:26:31.571Z", + "date": 1653855991571, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21972, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293d4bc5d63e500043da7a4", + "eventType": "Correction Bolus", + "insulin": 0.38, + "created_at": "2022-05-29T20:16:46.053Z", + "date": 1653855406053, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21971, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293d3765d63e500043da7a1", + "eventType": "Correction Bolus", + "insulin": 0.44, + "created_at": "2022-05-29T20:11:31.773Z", + "date": 1653855091773, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21970, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293d14a0c2a950004a81e33", + "eventType": "Correction Bolus", + "insulin": 0.54, + "created_at": "2022-05-29T20:01:55.412Z", + "date": 1653854515412, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21969, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293ced60c2a950004a81e2e", + "eventType": "Correction Bolus", + "insulin": 0.5, + "created_at": "2022-05-29T19:51:40.370Z", + "date": 1653853900370, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21968, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293cc7c0c2a950004a81e29", + "eventType": "Correction Bolus", + "insulin": 0.46, + "created_at": "2022-05-29T19:41:39.514Z", + "date": 1653853299514, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21967, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293ca2a822c320004b85211", + "eventType": "Correction Bolus", + "insulin": 0.24, + "created_at": "2022-05-29T19:31:41.148Z", + "date": 1653852701148, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21966, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293c571822c320004b85209", + "created_at": "2022-05-29T19:11:35.804Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 90, + "durationInMilliseconds": 5415345, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457588, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457607, + "carbs": null, + "insulin": null + }, + { + "_id": "6293c474822c320004b85205", + "eventType": "Meal Bolus", + "insulin": 7.54, + "created_at": "2022-05-29T19:07:09.325Z", + "date": 1653851229325, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 21965, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293c45b822c320004b85204", + "eventType": "Bolus Wizard", + "created_at": "2022-05-29T19:06:54.838Z", + "isValid": true, + "bolusCalculatorResult": "{\"basalIOB\":0.785,\"bolusIOB\":-2.29,\"carbs\":45.0,\"carbsInsulin\":8.908723692318452,\"cob\":0.0,\"cobInsulin\":0.0,\"dateCreated\":1653851214949,\"glucoseDifference\":41.0,\"glucoseInsulin\":0.4173320827373653,\"glucoseTrend\":18.0,\"glucoseValue\":141.0,\"ic\":5.051228610760625,\"id\":1574,\"interfaceIDs_backing\":{},\"isValid\":true,\"isf\":98.24310590039647,\"note\":\"\",\"otherCorrection\":0.0,\"percentageCorrection\":90,\"profileName\":\"Weekend days\",\"superbolusInsulin\":0.0,\"targetBGHigh\":100.0,\"targetBGLow\":100.0,\"timestamp\":1653851214838,\"totalInsulin\":7.53,\"trendInsulin\":0.549656889458969,\"utcOffset\":7200000,\"version\":0,\"wasBasalIOBUsed\":true,\"wasBolusIOBUsed\":true,\"wasCOBUsed\":true,\"wasGlucoseUsed\":true,\"wasSuperbolusUsed\":false,\"wasTempTargetUsed\":false,\"wasTrendUsed\":true,\"wereCarbsUsed\":false}", + "date": 1653851214838, + "glucose": 141, + "units": "mg/dl", + "notes": "", + "carbs": null, + "insulin": null + }, + { + "_id": "6293c442822c320004b85203", + "created_at": "2022-05-29T19:06:29.428Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 304884, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457583, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457587, + "carbs": null, + "insulin": null + }, + { + "_id": "6293c32d822c320004b851ff", + "eventType": "Correction Bolus", + "insulin": 0.9, + "created_at": "2022-05-29T19:01:59.437Z", + "date": 1653850919437, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21964, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293c32e822c320004b85200", + "created_at": "2022-05-29T19:01:56.046Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 270897, + "type": "NORMAL", + "rate": 0.0774, + "percent": -90, + "pumpId": 457578, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457582, + "carbs": null, + "insulin": null + }, + { + "_id": "6293c205822c320004b851fc", + "created_at": "2022-05-29T18:56:56.166Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 298402, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457574, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457577, + "carbs": null, + "insulin": null + }, + { + "_id": "6293c0be822c320004b851f7", + "eventType": "Correction Bolus", + "insulin": 0.88, + "created_at": "2022-05-29T18:51:38.181Z", + "date": 1653850298181, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21963, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293c0be822c320004b851f8", + "created_at": "2022-05-29T18:51:35.515Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 311000, + "type": "FAKE_EXTENDED", + "rate": 2.8176012861736335, + "absolute": 2.8176012861736335, + "pumpId": 21962, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-29T18:51:35.515Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 5, + "durationInMilliseconds": 311000, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.18, + "relative": 2.0836012861736335, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 21962, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "carbs": null, + "insulin": null + }, + { + "_id": "6293c474822c320004b85206", + "eventType": "Meal Bolus", + "carbs": 45, + "created_at": "2022-05-29T18:31:54.837Z", + "isValid": true, + "date": 1653849114837, + "insulin": null + }, + { + "_id": "6293b8b9411d3400044ea44d", + "created_at": "2022-05-29T18:17:21.698Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 34, + "durationInMilliseconds": 2041809, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457562, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457564, + "carbs": null, + "insulin": null + }, + { + "_id": "6293b83b411d3400044ea449", + "eventType": "Temporary Target", + "duration": 60, + "durationInMilliseconds": 3600000, + "isValid": true, + "created_at": "2022-05-29T18:14:57.596Z", + "timestamp": 1653848097596, + "enteredBy": "AndroidAPS", + "reason": "Automation", + "targetBottom": 110, + "targetTop": 110, + "units": "mg/dl", + "carbs": null, + "insulin": null + }, + { + "_id": "6293abc46219a300042d6779", + "created_at": "2022-05-29T17:21:50.383Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 55, + "durationInMilliseconds": 3329827, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457558, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457561, + "carbs": null, + "insulin": null + }, + { + "_id": "6293a737ae43dd00049c530b", + "eventType": "Correction Bolus", + "insulin": 0.7, + "created_at": "2022-05-29T17:02:22.679Z", + "date": 1653843742679, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21961, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293a4c3ae43dd00049c5305", + "eventType": "Correction Bolus", + "insulin": 0.34, + "created_at": "2022-05-29T16:51:57.840Z", + "date": 1653843117840, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21960, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293a4c3ae43dd00049c5306", + "created_at": "2022-05-29T16:51:54.897Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1792996, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457550, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457557, + "carbs": null, + "insulin": null + }, + { + "_id": "6293a267ae43dd00049c52ff", + "eventType": "Correction Bolus", + "insulin": 0.4, + "created_at": "2022-05-29T16:41:53.804Z", + "date": 1653842513804, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21959, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62939ff2ae43dd00049c52fb", + "eventType": "Correction Bolus", + "insulin": 0.44, + "created_at": "2022-05-29T16:31:44.873Z", + "date": 1653841904873, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21958, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62939dc64c156c000419f12f", + "eventType": "Correction Bolus", + "insulin": 0.34, + "created_at": "2022-05-29T16:22:07.129Z", + "date": 1653841327129, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21957, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62939dc74c156c000419f130", + "created_at": "2022-05-29T16:22:04.725Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1788689, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457541, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457549, + "carbs": null, + "insulin": null + }, + { + "_id": "62939a3d4c156c000419f128", + "eventType": "Correction Bolus", + "insulin": 0.54, + "created_at": "2022-05-29T16:07:05.844Z", + "date": 1653840425844, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21956, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "629398f64c156c000419f124", + "eventType": "Correction Bolus", + "insulin": 0.58, + "created_at": "2022-05-29T16:01:46.109Z", + "date": 1653840106109, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21955, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "629396a6c4590900040354f8", + "eventType": "Correction Bolus", + "insulin": 0.46, + "created_at": "2022-05-29T15:51:51.765Z", + "date": 1653839511765, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21954, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62939579c4590900040354f6", + "created_at": "2022-05-29T15:46:45.168Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 35, + "durationInMilliseconds": 2118073, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457531, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457540, + "carbs": null, + "insulin": null + }, + { + "_id": "62939464c4590900040354f2", + "eventType": "Correction Bolus", + "insulin": 0.54, + "created_at": "2022-05-29T15:42:16.590Z", + "date": 1653838936590, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21953, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "629391efc4590900040354ed", + "eventType": "Correction Bolus", + "insulin": 0.82, + "created_at": "2022-05-29T15:31:48.944Z", + "date": 1653838308944, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21952, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62938fadc4590900040354e8", + "eventType": "Correction Bolus", + "insulin": 1.14, + "created_at": "2022-05-29T15:22:16.968Z", + "date": 1653837736968, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21951, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62938e6c10fec10004d25b98", + "eventType": "Correction Bolus", + "insulin": 1.48, + "created_at": "2022-05-29T15:16:51.754Z", + "date": 1653837411754, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21950, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62938e6d10fec10004d25b9a", + "created_at": "2022-05-29T15:16:49.736Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1793954, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457519, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457530, + "carbs": null, + "insulin": null + }, + { + "_id": "62938d5710fec10004d25b96", + "created_at": "2022-05-29T15:12:03.739Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 284504, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457516, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457518, + "carbs": null, + "insulin": null + }, + { + "_id": "62938c1110fec10004d25b92", + "eventType": "Correction Bolus", + "insulin": 1.52, + "created_at": "2022-05-29T15:06:35.585Z", + "date": 1653836795585, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21949, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62938c1110fec10004d25b93", + "created_at": "2022-05-29T15:06:32.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 320000, + "type": "FAKE_EXTENDED", + "rate": 3.706, + "absolute": 3.706, + "pumpId": 21948, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-29T15:06:32.000Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 5, + "durationInMilliseconds": 320000, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.26, + "relative": 2.925, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 21948, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "carbs": null, + "insulin": null + }, + { + "_id": "62938ae310fec10004d25b8d", + "eventType": "Meal Bolus", + "carbs": 40, + "created_at": "2022-05-29T14:50:49.000Z", + "isValid": true, + "date": 1653835849000, + "insulin": null + }, + { + "_id": "629386d72e64470004ddfa33", + "eventType": "Note", + "isValid": true, + "created_at": "2022-05-29T14:44:19.893Z", + "units": "mg/dl", + "notes": "AndroidAPS est lancé - samsung SM-A405FN", + "carbs": null, + "insulin": null + }, + { + "_id": "629376f21d13c2000469a799", + "created_at": "2022-05-29T13:36:41.814Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 89, + "durationInMilliseconds": 5353198, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457504, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457508, + "carbs": null, + "insulin": null + }, + { + "_id": "629373681d13c2000469a791", + "eventType": "Correction Bolus", + "insulin": 0.32, + "created_at": "2022-05-29T13:21:43.137Z", + "date": 1653830503137, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21947, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "629371261d13c2000469a78d", + "eventType": "Correction Bolus", + "insulin": 0.42, + "created_at": "2022-05-29T13:11:44.482Z", + "date": 1653829904482, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21946, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62936d96b97b6600046a28ce", + "eventType": "Correction Bolus", + "insulin": 0.46, + "created_at": "2022-05-29T12:56:41.095Z", + "date": 1653829001095, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21945, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62936b54b97b6600046a28c9", + "eventType": "Correction Bolus", + "insulin": 0.5, + "created_at": "2022-05-29T12:47:00.369Z", + "date": 1653828420369, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21944, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6293658bb97b6600046a28be", + "created_at": "2022-05-29T12:21:43.345Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 74, + "durationInMilliseconds": 4496983, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457491, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457503, + "carbs": null, + "insulin": null + }, + { + "_id": "62936300b97b6600046a28b8", + "eventType": "Correction Bolus", + "insulin": 0.38, + "created_at": "2022-05-29T12:11:34.015Z", + "date": 1653826294015, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21943, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "629360a637fd2b0004af9367", + "eventType": "Correction Bolus", + "insulin": 0.52, + "created_at": "2022-05-29T12:01:32.648Z", + "date": 1653825692648, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21942, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "629359a737fd2b0004af935b", + "created_at": "2022-05-29T11:31:24.472Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 50, + "durationInMilliseconds": 3016384, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457483, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457490, + "carbs": null, + "insulin": null + }, + { + "_id": "629356fcab873a0004e70cfe", + "eventType": "Meal Bolus", + "insulin": 6.74, + "created_at": "2022-05-29T11:20:25.910Z", + "date": 1653823225910, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 21941, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62935715ab873a0004e70d00", + "eventType": "Meal Bolus", + "carbs": 45, + "created_at": "2022-05-29T11:20:17.286Z", + "isValid": true, + "date": 1653823217286, + "insulin": null + }, + { + "_id": "629356fcab873a0004e70cff", + "eventType": "Bolus Wizard", + "created_at": "2022-05-29T11:20:17.286Z", + "isValid": true, + "bolusCalculatorResult": "{\"basalIOB\":0.991,\"bolusIOB\":-1.114,\"carbs\":45.0,\"carbsInsulin\":7.572415138470685,\"cob\":0.0,\"cobInsulin\":0.0,\"dateCreated\":1653823217360,\"glucoseDifference\":6.0,\"glucoseInsulin\":0.06718028648942959,\"glucoseTrend\":-1.28,\"glucoseValue\":96.0,\"ic\":5.9426218950125,\"id\":1572,\"interfaceIDs_backing\":{},\"isValid\":true,\"isf\":89.31191445490582,\"note\":\"\",\"otherCorrection\":0.0,\"percentageCorrection\":90,\"profileName\":\"Weekend days\",\"superbolusInsulin\":0.0,\"targetBGHigh\":90.0,\"targetBGLow\":90.0,\"timestamp\":1653823217286,\"totalInsulin\":6.73,\"trendInsulin\":-0.04299538335323493,\"utcOffset\":7200000,\"version\":0,\"wasBasalIOBUsed\":true,\"wasBolusIOBUsed\":true,\"wasCOBUsed\":true,\"wasGlucoseUsed\":true,\"wasSuperbolusUsed\":false,\"wasTempTargetUsed\":false,\"wasTrendUsed\":true,\"wereCarbsUsed\":false}", + "date": 1653823217286, + "glucose": 96, + "units": "mg/dl", + "notes": "", + "carbs": null, + "insulin": null + }, + { + "_id": "62934b8981eecb0004b36989", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T10:31:28.825Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "11g de glucides requis dans 20 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "62934a7381eecb0004b36986", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T10:26:41.576Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "13g de glucides requis dans 25 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6293494381eecb0004b36984", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T10:21:34.052Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "18g de glucides requis dans 0 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "6293481281eecb0004b36980", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T10:16:27.158Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "21g de glucides requis dans 0 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "629346e481eecb0004b3697d", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T10:11:47.978Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "23g de glucides requis dans 0 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "629345c1e492ca000461c5f4", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T10:06:35.040Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "26g de glucides requis dans 0 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "62934366e492ca000461c5f0", + "created_at": "2022-05-29T09:56:45.285Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 94, + "durationInMilliseconds": 5677694, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457476, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457482, + "carbs": null, + "insulin": null + }, + { + "_id": "62934365e492ca000461c5ee", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T09:56:32.097Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "32g de glucides requis dans 0 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "62934237e492ca000461c5eb", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T09:51:39.114Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "32g de glucides requis dans 0 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "62934109e492ca000461c5e8", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T09:46:38.397Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "32g de glucides requis dans 10 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "62933fdbe492ca000461c5e5", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T09:41:22.751Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "32g de glucides requis dans 15 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "62933e94e492ca000461c5e2", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T09:36:17.776Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "33g de glucides requis dans 10 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "62933d6ea93f2f00043e98fd", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T09:31:21.229Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "34g de glucides requis dans 5 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "62935812ab873a0004e70d03", + "eventType": "Meal Bolus", + "carbs": 20, + "created_at": "2022-05-29T09:30:29.000Z", + "isValid": true, + "date": 1653816629000, + "insulin": null + }, + { + "_id": "62933c72a93f2f00043e98fa", + "created_at": "2022-05-29T09:26:54.313Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1788486, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457473, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457475, + "carbs": null, + "insulin": null + }, + { + "_id": "62933c59a93f2f00043e98f8", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T09:26:41.044Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "34g de glucides requis dans 5 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "62933bf4a93f2f00043e98f7", + "eventType": "Temporary Target", + "duration": 60, + "durationInMilliseconds": 3600000, + "isValid": true, + "created_at": "2022-05-29T09:24:55.780Z", + "timestamp": 1653816295780, + "enteredBy": "AndroidAPS", + "reason": "Automation", + "targetBottom": 110, + "targetTop": 110, + "units": "mg/dl", + "carbs": null, + "insulin": null + }, + { + "_id": "62933b44a93f2f00043e98f4", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T09:22:08.766Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "33g de glucides requis dans 10 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "629339fda93f2f00043e98f1", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T09:16:37.269Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "34g de glucides requis dans 10 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "629338cfa93f2f00043e98ee", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T09:11:36.712Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "34g de glucides requis dans 15 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "629337a1a93f2f00043e98eb", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T09:06:35.041Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "35g de glucides requis dans 15 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "62933673a93f2f00043e98e8", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T09:01:29.382Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "35g de glucides requis dans 20 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "62933590a93f2f00043e98e6", + "created_at": "2022-05-29T08:56:57.810Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1794023, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457470, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457472, + "carbs": null, + "insulin": null + }, + { + "_id": "62933553d9e5bf0004488aca", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T08:56:40.706Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "24g de glucides requis dans 20 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "629332f8d9e5bf0004488ac5", + "eventType": "Announcement", + "isValid": true, + "created_at": "2022-05-29T08:46:32.658Z", + "enteredBy": "AndroidAPS", + "units": "mg/dl", + "notes": "23g de glucides requis dans 45 min.", + "isAnnouncement": true, + "carbs": null, + "insulin": null + }, + { + "_id": "62932e71d9e5bf0004488abd", + "created_at": "2022-05-29T08:27:08.244Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 29, + "durationInMilliseconds": 1788077, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457467, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457469, + "carbs": null, + "insulin": null + }, + { + "_id": "62932d70d9e5bf0004488ab9", + "eventType": "Meal Bolus", + "insulin": 14.06, + "created_at": "2022-05-29T08:23:01.108Z", + "date": 1653812581108, + "type": "NORMAL", + "isValid": true, + "isSMB": false, + "pumpId": 21940, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62932d70d9e5bf0004488ab8", + "eventType": "Bolus Wizard", + "created_at": "2022-05-29T08:22:59.388Z", + "isValid": true, + "bolusCalculatorResult": "{\"basalIOB\":-0.354,\"bolusIOB\":-1.975,\"carbs\":80.0,\"carbsInsulin\":15.837731008566136,\"cob\":0.0,\"cobInsulin\":0.0,\"dateCreated\":1653812579455,\"glucoseDifference\":72.0,\"glucoseInsulin\":1.1516620541045064,\"glucoseTrend\":20.06,\"glucoseValue\":172.0,\"ic\":5.051228610760625,\"id\":1570,\"interfaceIDs_backing\":{},\"isValid\":true,\"isf\":62.51834011843411,\"note\":\"\",\"otherCorrection\":0.0,\"percentageCorrection\":90,\"profileName\":\"Weekend days\",\"superbolusInsulin\":0.0,\"targetBGHigh\":100.0,\"targetBGLow\":100.0,\"timestamp\":1653812579388,\"totalInsulin\":14.06,\"trendInsulin\":0.9625975335556832,\"utcOffset\":7200000,\"version\":0,\"wasBasalIOBUsed\":true,\"wasBolusIOBUsed\":true,\"wasCOBUsed\":true,\"wasGlucoseUsed\":true,\"wasSuperbolusUsed\":false,\"wasTempTargetUsed\":false,\"wasTrendUsed\":true,\"wereCarbsUsed\":false}", + "date": 1653812579388, + "glucose": 172, + "units": "mg/dl", + "notes": "", + "carbs": null, + "insulin": null + }, + { + "_id": "62932d22d9e5bf0004488ab7", + "eventType": "Correction Bolus", + "insulin": 0.72, + "created_at": "2022-05-29T08:21:51.002Z", + "date": 1653812511002, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21939, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62932aefd9e5bf0004488ab1", + "eventType": "Correction Bolus", + "insulin": 0.86, + "created_at": "2022-05-29T08:12:14.562Z", + "date": 1653811934562, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21938, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62932af0d9e5bf0004488ab2", + "created_at": "2022-05-29T08:12:12.318Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 14, + "durationInMilliseconds": 887000, + "type": "FAKE_EXTENDED", + "rate": 4.17924464487035, + "absolute": 4.17924464487035, + "pumpId": 21937, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-29T08:12:12.318Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 14, + "durationInMilliseconds": 887000, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.84, + "relative": 3.4092446448703493, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 21937, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "carbs": null, + "insulin": null + }, + { + "_id": "62932893d9e5bf0004488aab", + "eventType": "Correction Bolus", + "insulin": 0.32, + "created_at": "2022-05-29T08:02:17.683Z", + "date": 1653811337683, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21936, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "62932893d9e5bf0004488aac", + "created_at": "2022-05-29T08:02:14.951Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 597367, + "type": "FAKE_EXTENDED", + "rate": 2.01, + "absolute": 2.01, + "pumpId": 21935, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "extendedEmulated": { + "created_at": "2022-05-29T08:02:14.951Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Combo Bolus", + "duration": 9, + "durationInMilliseconds": 597367, + "splitNow": 0, + "splitExt": 100, + "enteredinsulin": 0.20575974444444445, + "relative": 1.24, + "isValid": true, + "isEmulatingTempBasal": true, + "pumpId": 21935, + "endId": 21937, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206" + }, + "endId": 21937, + "carbs": null, + "insulin": null + }, + { + "_id": "6293261ed9e5bf0004488aa6", + "created_at": "2022-05-29T07:51:48.306Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 613607, + "type": "NORMAL", + "rate": 0.6152000000000001, + "percent": -20, + "pumpId": 457444, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457447, + "carbs": null, + "insulin": null + }, + { + "_id": "62932da8d9e5bf0004488aba", + "eventType": "Meal Bolus", + "carbs": 80, + "created_at": "2022-05-29T07:32:59.387Z", + "isValid": true, + "date": 1653809579387, + "insulin": null + }, + { + "_id": "62932152b1568c00046a66d4", + "created_at": "2022-05-29T07:31:27.748Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 20, + "durationInMilliseconds": 1218071, + "type": "NORMAL", + "rate": 0.07690000000000001, + "percent": -90, + "pumpId": 457440, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457443, + "carbs": null, + "insulin": null + }, + { + "_id": "62931caa95c7b700044ac610", + "created_at": "2022-05-29T07:11:35.216Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 19, + "durationInMilliseconds": 1191056, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457436, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457439, + "carbs": null, + "insulin": null + }, + { + "_id": "62931a3595c7b700044ac60a", + "created_at": "2022-05-29T07:01:05.427Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 627304, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457433, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457435, + "carbs": null, + "insulin": null + }, + { + "_id": "6293190795c7b700044ac607", + "created_at": "2022-05-29T06:55:45.020Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 317918, + "type": "NORMAL", + "rate": 0.8855000000000001, + "percent": 10, + "pumpId": 457429, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457432, + "carbs": null, + "insulin": null + }, + { + "_id": "629317d995c7b700044ac604", + "created_at": "2022-05-29T06:50:56.089Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 286443, + "type": "NORMAL", + "rate": 0.48300000000000004, + "percent": -40, + "pumpId": 457426, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457428, + "carbs": null, + "insulin": null + }, + { + "_id": "629316ab95c7b700044ac601", + "created_at": "2022-05-29T06:45:40.887Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 313705, + "type": "NORMAL", + "rate": 0.161, + "percent": -80, + "pumpId": 457423, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457425, + "carbs": null, + "insulin": null + }, + { + "_id": "6293157e95c7b700044ac5fe", + "created_at": "2022-05-29T06:40:49.495Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 289898, + "type": "NORMAL", + "rate": 0.161, + "percent": -80, + "pumpId": 457420, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457422, + "carbs": null, + "insulin": null + }, + { + "_id": "62931458ddb62c00041b9e5e", + "created_at": "2022-05-29T06:36:04.950Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 283072, + "type": "NORMAL", + "rate": 0.24150000000000002, + "percent": -70, + "pumpId": 457417, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457419, + "carbs": null, + "insulin": null + }, + { + "_id": "6293132addb62c00041b9e5a", + "eventType": "Correction Bolus", + "insulin": 0.32, + "created_at": "2022-05-29T06:30:47.530Z", + "date": 1653805847530, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21934, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "629311fcddb62c00041b9e58", + "created_at": "2022-05-29T06:25:40.126Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 10, + "durationInMilliseconds": 623334, + "type": "NORMAL", + "rate": 1.9320000000000002, + "percent": 140, + "pumpId": 457412, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457416, + "carbs": null, + "insulin": null + }, + { + "_id": "629310cdddb62c00041b9e53", + "eventType": "Correction Bolus", + "insulin": 0.16, + "created_at": "2022-05-29T06:20:41.770Z", + "date": 1653805241770, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21933, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "629310ceddb62c00041b9e55", + "created_at": "2022-05-29T06:20:39.976Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 297656, + "type": "NORMAL", + "rate": 1.288, + "percent": 60, + "pumpId": 457407, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457411, + "carbs": null, + "insulin": null + }, + { + "_id": "62930fa0ddb62c00041b9e51", + "created_at": "2022-05-29T06:15:38.026Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 300456, + "type": "NORMAL", + "rate": 0.644, + "percent": -20, + "pumpId": 457404, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457406, + "carbs": null, + "insulin": null + }, + { + "_id": "62930d45ddb62c00041b9e4a", + "created_at": "2022-05-29T06:05:48.141Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 588392, + "type": "NORMAL", + "rate": 0.8855000000000001, + "percent": 10, + "pumpId": 457401, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457403, + "carbs": null, + "insulin": null + }, + { + "_id": "62930c197b537000043fa1eb", + "created_at": "2022-05-29T06:00:33.505Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 312147, + "type": "NORMAL", + "rate": 0.5635, + "percent": -30, + "pumpId": 457398, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457400, + "carbs": null, + "insulin": null + }, + { + "_id": "629309bc7b537000043fa1e5", + "created_at": "2022-05-29T05:50:47.255Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 584759, + "type": "NORMAL", + "rate": 0.8844000000000001, + "percent": 10, + "pumpId": 457393, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457397, + "carbs": null, + "insulin": null + }, + { + "_id": "629307797b537000043fa1e0", + "created_at": "2022-05-29T05:40:51.736Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 593029, + "type": "NORMAL", + "rate": 0.7236, + "percent": -10, + "pumpId": 457390, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457392, + "carbs": null, + "insulin": null + }, + { + "_id": "6293019235e0750004253d2c", + "created_at": "2022-05-29T05:15:44.511Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 25, + "durationInMilliseconds": 1505734, + "type": "NORMAL", + "rate": 0.08040000000000001, + "percent": -90, + "pumpId": 457387, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457389, + "carbs": null, + "insulin": null + }, + { + "_id": "6293006435e0750004253d29", + "created_at": "2022-05-29T05:10:38.330Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 304686, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457384, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457386, + "carbs": null, + "insulin": null + }, + { + "_id": "6292fa8d77f215000477fce4", + "created_at": "2022-05-29T04:45:45.401Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 24, + "durationInMilliseconds": 1491438, + "type": "NORMAL", + "rate": 0, + "percent": -100, + "pumpId": 457380, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457383, + "carbs": null, + "insulin": null + }, + { + "_id": "6292f95f77f215000477fce0", + "created_at": "2022-05-29T04:40:43.528Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 300380, + "type": "NORMAL", + "rate": 0.1524, + "percent": -80, + "pumpId": 457377, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457379, + "carbs": null, + "insulin": null + }, + { + "_id": "6292f70377f215000477fcdc", + "created_at": "2022-05-29T04:30:47.924Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 289800, + "type": "NORMAL", + "rate": 0.1524, + "percent": -80, + "pumpId": 457371, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457373, + "carbs": null, + "insulin": null + }, + { + "_id": "6292f5d477f215000477fcd7", + "eventType": "Correction Bolus", + "insulin": 0.28, + "created_at": "2022-05-29T04:25:41.075Z", + "date": 1653798341075, + "type": "SMB", + "isValid": true, + "isSMB": true, + "pumpId": 21932, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null + }, + { + "_id": "6292f5d577f215000477fcd9", + "created_at": "2022-05-29T04:25:38.818Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 5, + "durationInMilliseconds": 307615, + "type": "NORMAL", + "rate": 1.7526, + "percent": 130, + "pumpId": 457366, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457370, + "carbs": null, + "insulin": null + }, + { + "_id": "6292f3886a923a000405c861", + "created_at": "2022-05-29T04:15:51.340Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 585991, + "type": "NORMAL", + "rate": 0.2286, + "percent": -70, + "pumpId": 457363, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457365, + "carbs": null, + "insulin": null + }, + { + "_id": "6292f12c6a923a000405c85c", + "created_at": "2022-05-29T04:05:57.590Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 9, + "durationInMilliseconds": 591258, + "type": "NORMAL", + "rate": 0.3048, + "percent": -60, + "pumpId": 457360, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457362, + "carbs": null, + "insulin": null + }, + { + "_id": "6292f0006a923a000405c859", + "created_at": "2022-05-29T04:00:59.965Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 4, + "durationInMilliseconds": 296127, + "type": "NORMAL", + "rate": 0.6858, + "percent": -10, + "pumpId": 457357, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "endId": 457359, + "carbs": null, + "insulin": null + }, + { + "_id": "6292effe6a923a000405c856", + "created_at": "2022-05-29T04:00:41.006Z", + "enteredBy": "openaps://AndroidAPS", + "eventType": "Temp Basal", + "isValid": true, + "duration": 0, + "durationInMilliseconds": 17465, + "type": "NORMAL", + "rate": 0.9144, + "percent": 20, + "pumpId": 457354, + "endId": 457356, + "pumpType": "ACCU_CHEK_INSIGHT_BLUETOOTH", + "pumpSerial": "33013206", + "carbs": null, + "insulin": null + } +] diff --git a/app/src/test/res/autotune/test4/profile.2022-05-30.json b/app/src/test/res/autotune/test4/profile.2022-05-30.json new file mode 100644 index 0000000000..41b52dfb83 --- /dev/null +++ b/app/src/test/res/autotune/test4/profile.2022-05-30.json @@ -0,0 +1,192 @@ +{ + "autosens_max": 1.3, + "autosens_min": 0.7, + "basalprofile": [ + { + "i": 0, + "minutes": 0, + "rate": 0.977, + "start": "00:00:00", + "untuned": 4 + }, + { + "i": 1, + "minutes": 60, + "rate": 1.011, + "start": "01:00:00", + "untuned": 1 + }, + { + "i": 2, + "minutes": 120, + "rate": 0.996, + "start": "02:00:00" + }, + { + "i": 3, + "minutes": 180, + "rate": 1.13, + "start": "03:00:00" + }, + { + "i": 4, + "minutes": 240, + "rate": 0.937, + "start": "04:00:00" + }, + { + "i": 5, + "minutes": 300, + "rate": 0.877, + "start": "05:00:00" + }, + { + "i": 6, + "minutes": 360, + "rate": 0.779, + "start": "06:00:00" + }, + { + "i": 7, + "minutes": 420, + "rate": 0.827, + "start": "07:00:00", + "untuned": 1 + }, + { + "i": 8, + "minutes": 480, + "rate": 0.882, + "start": "08:00:00", + "untuned": 1 + }, + { + "i": 9, + "minutes": 540, + "rate": 0.878, + "start": "09:00:00", + "untuned": 5 + }, + { + "i": 10, + "minutes": 600, + "rate": 0.879, + "start": "10:00:00", + "untuned": 5 + }, + { + "i": 11, + "minutes": 660, + "rate": 0.867, + "start": "11:00:00", + "untuned": 5 + }, + { + "i": 12, + "minutes": 720, + "rate": 0.86, + "start": "12:00:00", + "untuned": 5 + }, + { + "i": 13, + "minutes": 780, + "rate": 0.858, + "start": "13:00:00", + "untuned": 5 + }, + { + "i": 14, + "minutes": 840, + "rate": 0.855, + "start": "14:00:00", + "untuned": 5 + }, + { + "i": 15, + "minutes": 900, + "rate": 0.85, + "start": "15:00:00", + "untuned": 5 + }, + { + "i": 16, + "minutes": 960, + "rate": 0.82, + "start": "16:00:00", + "untuned": 5 + }, + { + "i": 17, + "minutes": 1020, + "rate": 0.784, + "start": "17:00:00", + "untuned": 5 + }, + { + "i": 18, + "minutes": 1080, + "rate": 0.778, + "start": "18:00:00", + "untuned": 4 + }, + { + "i": 19, + "minutes": 1140, + "rate": 0.815, + "start": "19:00:00", + "untuned": 4 + }, + { + "i": 20, + "minutes": 1200, + "rate": 0.854, + "start": "20:00:00", + "untuned": 3 + }, + { + "i": 21, + "minutes": 1260, + "rate": 0.849, + "start": "21:00:00", + "untuned": 4 + }, + { + "i": 22, + "minutes": 1320, + "rate": 0.849, + "start": "22:00:00", + "untuned": 4 + }, + { + "i": 23, + "minutes": 1380, + "rate": 0.843, + "start": "23:00:00", + "untuned": 4 + } + ], + "carb_ratio": 5.021, + "csf": 15.669, + "curve": "ultra-rapid", + "dia": 6, + "insulinPeakTime": 45, + "isfProfile": { + "sensitivities": [ + { + "endoffset": 1440, + "i": 0, + "offset": 0, + "sensitivity": 83.014, + "start": "00:00:00", + "x": 0 + } + ] + }, + "min_5m_carbimpact": 8, + "name": "Tuned Dyn2", + "sens": 83.014, + "timezone": "Europe/Paris", + "units": "mg/dl", + "useCustomPeakTime": true +} diff --git a/app/src/test/res/autotune/test4/profile.pump.json b/app/src/test/res/autotune/test4/profile.pump.json new file mode 100644 index 0000000000..eefadabacb --- /dev/null +++ b/app/src/test/res/autotune/test4/profile.pump.json @@ -0,0 +1,147 @@ +{ + "name": "Tuned Dyn2", + "min_5m_carbimpact": 8, + "dia": 6, + "curve": "ultra-rapid", + "useCustomPeakTime": true, + "insulinPeakTime": 45, + "basalprofile": [ + { + "start": "00:00:00", + "minutes": 0, + "rate": 0.966 + }, + { + "start": "01:00:00", + "minutes": 60, + "rate": 0.977 + }, + { + "start": "02:00:00", + "minutes": 120, + "rate": 0.971 + }, + { + "start": "03:00:00", + "minutes": 180, + "rate": 1.111 + }, + { + "start": "04:00:00", + "minutes": 240, + "rate": 0.974 + }, + { + "start": "05:00:00", + "minutes": 300, + "rate": 0.923 + }, + { + "start": "06:00:00", + "minutes": 360, + "rate": 0.823 + }, + { + "start": "07:00:00", + "minutes": 420, + "rate": 0.855 + }, + { + "start": "08:00:00", + "minutes": 480, + "rate": 0.902 + }, + { + "start": "09:00:00", + "minutes": 540, + "rate": 0.934 + }, + { + "start": "10:00:00", + "minutes": 600, + "rate": 0.938 + }, + { + "start": "11:00:00", + "minutes": 660, + "rate": 0.903 + }, + { + "start": "12:00:00", + "minutes": 720, + "rate": 0.882 + }, + { + "start": "13:00:00", + "minutes": 780, + "rate": 0.874 + }, + { + "start": "14:00:00", + "minutes": 840, + "rate": 0.866 + }, + { + "start": "15:00:00", + "minutes": 900, + "rate": 0.848 + }, + { + "start": "16:00:00", + "minutes": 960, + "rate": 0.758 + }, + { + "start": "17:00:00", + "minutes": 1020, + "rate": 0.65 + }, + { + "start": "18:00:00", + "minutes": 1080, + "rate": 0.648 + }, + { + "start": "19:00:00", + "minutes": 1140, + "rate": 0.738 + }, + { + "start": "20:00:00", + "minutes": 1200, + "rate": 0.847 + }, + { + "start": "21:00:00", + "minutes": 1260, + "rate": 0.861 + }, + { + "start": "22:00:00", + "minutes": 1320, + "rate": 0.863 + }, + { + "start": "23:00:00", + "minutes": 1380, + "rate": 0.843 + } + ], + "isfProfile": { + "sensitivities": [ + { + "i": 0, + "start": "00:00:00", + "sensitivity": 86.2, + "offset": 0, + "x": 0, + "endoffset": 1440 + } + ] + }, + "carb_ratio": 5.75, + "autosens_max": 1.3, + "autosens_min": 0.7, + "units": "mg/dl", + "timezone": "Europe/Paris" +} From 700a5685cf70a149dfe0685c96d8b876d38af990 Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Sat, 25 Jun 2022 19:32:06 +0100 Subject: [PATCH 016/154] - extending solution --- .../medtronic/data/MedtronicHistoryData.kt | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt index 941aee3bb4..142a321375 100644 --- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt +++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/MedtronicHistoryData.kt @@ -799,7 +799,11 @@ class MedtronicHistoryData @Inject constructor( val suspendList = getFilteredItems(newHistory, // setOf(PumpHistoryEntryType.SuspendPump)) - // see if rewind items, need to fix any of current tempBasalProcessDTO items (bug 1724) + val stopList : MutableList = mutableListOf() + stopList.addAll(suspendList); + stopList.addAll(rewindList); + + // TODO remove see if rewind items, need to fix any of current tempBasalProcessDTO items (bug 1724) if (rewindList.isNotEmpty()) { for (rewindEntry in rewindList) { for (tempBasalProcessDTO in processList) { @@ -816,9 +820,45 @@ class MedtronicHistoryData @Inject constructor( } } + // see if have rewind/stop items that need to fix any of current tempBasalProcessDTO items (bug 1724) + if (stopList.isNotEmpty()) { + for (tempBasalProcessDTO in processList) { + if (tempBasalProcessDTO.itemTwo==null) { + val endTime: Long = DateTimeUtil.getATDWithAddedMinutes(tempBasalProcessDTO.itemOne.atechDateTime, tempBasalProcessDTO.itemOneTbr!!.durationMinutes) + + val findNearestEntry = findNearestEntry(tempBasalProcessDTO.itemOne.atechDateTime, endTime, stopList); + + if (findNearestEntry!=null) { + tempBasalProcessDTO.itemTwo = findNearestEntry + stopList.remove(findNearestEntry) + } + } + } + } + return processList } + fun findNearestEntry(startTime: Long, endTime: Long, list: MutableList) : PumpHistoryEntry? { + val outList: MutableList = mutableListOf() + + for (pumpHistoryEntry in list) { + if ((pumpHistoryEntry.atechDateTime > startTime) && + (pumpHistoryEntry.atechDateTime < endTime)) { + outList.add(pumpHistoryEntry) + } + } + + if (outList.size == 0) { + return null + } else if (outList.size==1) { + return outList[0] + } else { + // TODO + return null + } + } + fun isTBRActive(dbEntry: PumpDbEntryTBR): Boolean { return isTBRActive( startTimestamp = dbEntry.date, From 072324d1069ed8baa9286e4acc4c718c9155b803 Mon Sep 17 00:00:00 2001 From: Andries Smit Date: Tue, 21 Jun 2022 20:05:53 +0200 Subject: [PATCH 017/154] fear: wear mute alarm --- .../wear/wearintegration/DataHandlerMobile.kt | 11 +++- .../nightscout/shared/weardata/EventData.kt | 5 +- wear/src/main/AndroidManifest.xml | 12 ++++ .../androidaps/di/WearActivitiesModule.kt | 4 +- .../actions/QuickSnoozeActivity.kt | 52 ++++++++++++++++++ wear/src/main/res/drawable/ic_icon_snooze.png | Bin 0 -> 3919 bytes wear/src/main/res/values/strings.xml | 3 + 7 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 wear/src/main/java/info/nightscout/androidaps/interaction/actions/QuickSnoozeActivity.kt create mode 100644 wear/src/main/res/drawable/ic_icon_snooze.png diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt index cb21aeb5ba..a0ccacf982 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt @@ -27,6 +27,7 @@ import info.nightscout.androidaps.plugins.general.overview.graphExtensions.Gluco import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider import info.nightscout.androidaps.queue.Callback import info.nightscout.androidaps.receivers.ReceiverStatusStore +import info.nightscout.androidaps.services.AlarmSoundServiceHelper import info.nightscout.androidaps.utils.* import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.androidaps.utils.wizard.BolusWizard @@ -73,7 +74,8 @@ class DataHandlerMobile @Inject constructor( private val uel: UserEntryLogger, private val activePlugin: ActivePlugin, private val commandQueue: CommandQueue, - private val fabricPrivacy: FabricPrivacy + private val fabricPrivacy: FabricPrivacy, + private val alarmSoundServiceHelper: AlarmSoundServiceHelper ) { private val disposable = CompositeDisposable() @@ -260,6 +262,13 @@ class DataHandlerMobile @Inject constructor( } lastBolusWizard = null }, fabricPrivacy::logException) + disposable += rxBus + .toObservable(EventData.SnoozeAlert::class.java) + .observeOn(aapsSchedulers.io) + .subscribe({ + aapsLogger.debug(LTag.WEAR, "SnoozeAlert received $it from ${it.sourceNodeId}") + alarmSoundServiceHelper.stopService(context, "Muted from wear") + }, fabricPrivacy::logException) } private fun handleTddStatus() { diff --git a/shared/src/main/java/info/nightscout/shared/weardata/EventData.kt b/shared/src/main/java/info/nightscout/shared/weardata/EventData.kt index f570743aa6..aca2303c89 100644 --- a/shared/src/main/java/info/nightscout/shared/weardata/EventData.kt +++ b/shared/src/main/java/info/nightscout/shared/weardata/EventData.kt @@ -234,4 +234,7 @@ sealed class EventData : Event() { @Serializable // returnCommand is sent back to Mobile after confirmation data class ConfirmAction(val title: String, val message: String, val returnCommand: EventData?) : EventData() -} \ No newline at end of file + + @Serializable + data class SnoozeAlert(val timeStamp: Long) : EventData() +} diff --git a/wear/src/main/AndroidManifest.xml b/wear/src/main/AndroidManifest.xml index 88b52fc779..3d10810e37 100644 --- a/wear/src/main/AndroidManifest.xml +++ b/wear/src/main/AndroidManifest.xml @@ -629,5 +629,17 @@ + + + + + + + + diff --git a/wear/src/main/java/info/nightscout/androidaps/di/WearActivitiesModule.kt b/wear/src/main/java/info/nightscout/androidaps/di/WearActivitiesModule.kt index 18a63adb66..7055b32be0 100644 --- a/wear/src/main/java/info/nightscout/androidaps/di/WearActivitiesModule.kt +++ b/wear/src/main/java/info/nightscout/androidaps/di/WearActivitiesModule.kt @@ -2,6 +2,7 @@ package info.nightscout.androidaps.di import dagger.Module import dagger.android.ContributesAndroidInjector +import info.nightscout.androidaps.interaction.actions.QuickSnoozeActivity import info.nightscout.androidaps.interaction.ConfigurationActivity import info.nightscout.androidaps.interaction.TileConfigurationActivity import info.nightscout.androidaps.interaction.actions.* @@ -34,4 +35,5 @@ abstract class WearActivitiesModule { @ContributesAndroidInjector abstract fun contributesFillMenuActivity(): FillMenuActivity @ContributesAndroidInjector abstract fun contributesMainMenuActivity(): MainMenuActivity @ContributesAndroidInjector abstract fun contributesStatusMenuActivity(): StatusMenuActivity -} \ No newline at end of file + @ContributesAndroidInjector abstract fun contributesQuickSnoozeActivity(): QuickSnoozeActivity +} diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/QuickSnoozeActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/QuickSnoozeActivity.kt new file mode 100644 index 0000000000..bb36a43221 --- /dev/null +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/QuickSnoozeActivity.kt @@ -0,0 +1,52 @@ +package info.nightscout.androidaps.interaction.actions + +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Bundle +import android.util.Log +import android.widget.Toast +import dagger.android.DaggerActivity +import info.nightscout.androidaps.R +import info.nightscout.androidaps.events.EventWearToMobile +import info.nightscout.androidaps.plugins.bus.RxBus +import info.nightscout.shared.weardata.EventData +import javax.inject.Inject + +/** + * Send a snooze request to silence any alarm. Designed to be bound to a button for fast access + */ + +class QuickSnoozeActivity : DaggerActivity() { + + @Inject lateinit var rxBus: RxBus + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + Toast.makeText(this, R.string.sending_snooze, Toast.LENGTH_LONG).show() + rxBus.send(EventWearToMobile(EventData.SnoozeAlert(System.currentTimeMillis()))) + + val xDripPackageName = "com.eveningoutpost.dexdrip" + if (isPackageExisted(xDripPackageName)) { + try { + val i = Intent() + i.setClassName(xDripPackageName, "$xDripPackageName.QuickSnooze") + startActivity(i) + } catch (e : Exception) { + Log.e("WEAR", "failed to snooze xDrip: ", e) + } + } else { + Log.d("WEAR", "Package $xDripPackageName not available for snooze") + } + + finish() + } + + private fun isPackageExisted(targetPackage: String?): Boolean { + try { + packageManager.getPackageInfo(targetPackage!!, PackageManager.GET_META_DATA) + } catch (e: PackageManager.NameNotFoundException) { + return false + } + return true + } +} diff --git a/wear/src/main/res/drawable/ic_icon_snooze.png b/wear/src/main/res/drawable/ic_icon_snooze.png new file mode 100644 index 0000000000000000000000000000000000000000..78334d1d78c13cfac185deba07b8280d1bcbf33a GIT binary patch literal 3919 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 00,0 0,00U + AAPS Snooze Alert + Sending Snooze to AAPS + From 506b6dd2134699235c52519868e3b2de66038ed3 Mon Sep 17 00:00:00 2001 From: Andries Smit Date: Sun, 26 Jun 2022 13:16:40 +0200 Subject: [PATCH 018/154] chore: update snooze icon --- wear/src/main/res/drawable/ic_icon_snooze.png | Bin 3919 -> 24861 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/wear/src/main/res/drawable/ic_icon_snooze.png b/wear/src/main/res/drawable/ic_icon_snooze.png index 78334d1d78c13cfac185deba07b8280d1bcbf33a..31b80685be1ddc6ae6e41d146641773bb06a122c 100644 GIT binary patch literal 24861 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
  • WCP>YCs0-i346K*v=7@B;)D`5Cu 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 literal 3919 zcmV-V53ulwP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vG&=l}pD=mCOb1snhX4&+HhK~!i%)meFT zl-1e)&6=6XOor^4EQBQ_!4O0ODewUz{f-LmfF9gxMf|YksI=9CRxMDM7WJ!WD~bh0 zzxvq)DA-~FWf6r?b_hWdAPJBSvQB1S-#*Ws?VW4__MiUFxhL;??=$y(p8M=K3WdoFo!tiy}5-2q&52VnOF#kx_WM5a!K;YlitPS#>_W&);V zCBURni1qJ+s}>+gzuMC1#+uU(e0ISFcR+$hDWQm%EHJ8&rBfnN9b(Yom(b!4;*33j zY7&m+(y5e~k*ml2!bIGhql5A)Ww~Mjn0UiE7nU5cqN>w}v;+la=V@_EwiXl8)G&mZ z?hj59^q*~h{JqhO4Hvv<^#oBuT3L3T8ME^BxKcT;NPsilek`cy#EvF63X_z0s#uRX zgA<@7PpYHS-Eq-}1MPm)*aB#B1))&-#qXq`8rga!3Qa1EPgUcFObv#Smb|2ib>}^J z{geweq?zd!9ac?BK|zvQ{O)pa*#dlA>%?PwJIL!LEE#3MBLzA#1qq+jd+o zLOXI8wE-v;5^SD$hWM1nB&+f8ums#YB!Ns%fi-8`Sa!k*5*zPMOve4g6GOz`f^QXo z7oR(9#jlQaV`7>LYbKbGOQ-pl1_z!$>P0i1bbshi068qQ*Gt!Gad%!K8fdRa_SsND zCicu|6J9Ax{#KJ3Pyk-|F`3M}r|fuWs1_^AjKVbjXTKe1-FCFt5<-Oi;Bo|DSWF%a z(;4wzxlx$fqC<9kSm(ilLIYM#N+k#HUyK3sz|RkL3FaR!Ou+BP8|h?xnDTiS_O$xK z6fv;xPR-EZ=OqTLn{2}GiJ4qOY`uqLyZ&9?r+0D zM$)ea{&3cT2X}XfljjXLQ`GoDg-tjfBa2RrHIPbCXyFJwen|G5L7`KQeeG`C^|e)K zVC@8>aCk;7Is7}P-NJV`{IUj`!`kG4@X*%@C%Dp_d7EXIA_z{w9BW&G(E@s#N&V-Zlh+ zy#q!s0oK(yu(R1CLM2BVcGwPYOi9fAU#FNblVWyHuxa#%d%m{e*`rR8BjjNJTv%Yj zn`Mb{Lhv{F+w4b6N)z#AYY=~|?hLQS5NASM9+Ylufj=0){+kA2J%!5WPFTaML`>r? zI{6trn6GyP@XM2(VE+F+AuT)`GNCCuTPR<|SYtD~C)a?di_A#sQ49U1+J=?2w(wgB zFOM=~c5Widw_2g{QNEd-2dyR+)#5a;`Md)syL=+Ua+2aW&yE@yw`Q1oG5>k950kc8 z@#i`PI-HvDYz$p)b=)3}-3fT(WB^mYu;OeFjXhat!mxzIIC|!Rd3kE29^cr3zt?qz zsY8epV9jYK(kZHNwBQUYPf{FVmXX8CvHOw_bNATLP1Wd?;tZM6E##nV=Mk`W-k@9~ zcXsB1d6`4?R+>SB52$zy%6uUzfYlSg)+P^T5g|tb4smiUD$>QNyp4*mhbrvwu-#oH z8l0SY?ZR{;C^4&|;WmP`l+>7~Ir%zlZ}Fqe?hdcW1lZ9ODv58Us*;_NYnuqzaepv0 z-gH)+wu(yfyW%T~PMaEC;kOVLP@N^mkq*Bo7H3*Ca7jw+xDfM`r~urIa6SJ$Dv5Ve zRVhDL&Y<#e$!cHU5IcqMiq-YDxbJbrI+#Li1iZ$T?u1koG-@R(T0PP1EU5UUl1`kP z5w7RCB$nd_DiP%PE7kG7z7zOWp~mLNF`35ssIE_s|0eUqycL<%sOkzJ5C{bTApkoC zn+K`i3_o6tf_3{aVr7VVB;SLaY$ZCf)6q6O2gib1 zoRc*0>J#Yq3KZs=P%zjGk3k1VauPbT($GG{g0_MjwC7~NH^@L)Hs0^d9bG8fwihE0 zS0ShV0*u|1#bk*1K-AFq>VqX?a1U#v5J`0gk~*w#IFn&a(uy_4;0x_&JpVopHS${# zEH^&@Pm)*?=3v`(JL*q{-w74rzabREa__516Z9(B4&H?WM7xXLUVVY*snB?=gZLZ zq@RYFi6LQ7F$|f-NU{{8yu3U-!izn?w5F^g3@aYf2Q3|Bjs;D_@}L}j}V$IKZ9`9%=ySGwTL-6w56|N_?@p} z{DUj7W5*6LR?iM|l{FPfGJ%=4^zP;O|Mi=D(`HT|CFjcn6K_UhGXahMz~ifvEecU$;@OlSJ-h#A%ZsC^sr7w@Ns za^&B5N3Y*xr|NOd;ILFt+OoL)N9CIZZ`D>miiuRC3FV2X0OJQK#Esd$Hb2S>Q^aBf z72kBgBd!Uz;fY!Ai@DsnFZME>zEO*}=P!m}fB9-qLE8&+rsjtm_ZaP{#c#&#KYm0C zwWtC3`~i%k!;aGc+tYugDxssAXLFMmd1-oz97aLFu)F=(cBF+4e-;G$<;(GZuTO_j zAD?Xc#I_X>2a0)kX5la~B}Z|d2{Xp!gkEH{4?i$OOfi_3+*BPlQ|YdUACoe)f@cn; zQ72AKOu&Cm=NAHjJ2zNg3#fYWBKZZq%j?q+na^zV4ej z&VrPrNLhOr2miELJh2%>4svoy8h&|y2@)s-_XX#nPof%I)PwuWsivxL;fx_LX@dytS&DWh zvdqWgTjTv>`j`y7zi1pLj4%q?=x}YqsqLH$LK=%053k)`o`#QpG9Cq%u$hwMJ`{HH z2rV}?Ov^lIG%CDSB)C0q|uM9k}R2_-;^&u9!FPs_F~+--F{qJ zP}-YzPi2F2|MD*d55GCqA>q9<(wn zOOZVo=&*b7O!p9XK)ZHFG|7750+v<<`-xdiDE`C#~qp(e`&kzoma4`lAmV9 z(VFxc^05-?+9WJJZpWk~FYX#@5ENuvz#O$KJ)?;JDkG4tE7jKnH z7sO1h-*M09(yzX#6g>5XKCc$JI&Eob!HbnPyn8{5CrV6ssZ@tUXS(qGM<>wj^a%&E zd1DqhC{ZI!$nNr^;#4~w4AnU*%IcI;?wd9gLE>e9O@~N|4$3QXME1I|EE6xxy+-`I z>G?`G-m2=xqnQpYElWjKR+cDvdZJGO7(Sm57aAJyiz+WZZqeYOLKEH?qeq+7gJqvo zp{}7bPJq6^0x&!QnacYB3otY{S=fAcZL@8}3bW;lqT>OGyYg>$IG>9D0PWgI@*YN!?dKO0Ja=%!N!V4 z)HK959E^bk;PQYoEGH?B^Y7PsMYIW0xAyE1FYX&*hQ(qTka@;{0z|;()Y{sLL+9J@ z>v}czc56|XV!+cS2F%J;gKu0K+TA#Cx&tT9Sy6w zsCH8?Yt&@JaEAID0|;bDs{| z7cN@>29vT$QAoqZORe~t66B|?YV7V*!cEY*Mx5Nc5qRZ3*&B;?U3&<9a!@MEmWFSN%@CsEtQ8J2M+%rmY^06Ew{ zs6L4sJjdHcwq~Yya2KW5>*GeGv$|S*X8{ Date: Mon, 27 Jun 2022 08:00:02 +0200 Subject: [PATCH 019/154] chore: remove optionalality parameter --- .../androidaps/interaction/actions/QuickSnoozeActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/QuickSnoozeActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/QuickSnoozeActivity.kt index bb36a43221..40a8f690e9 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/QuickSnoozeActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/QuickSnoozeActivity.kt @@ -41,9 +41,9 @@ class QuickSnoozeActivity : DaggerActivity() { finish() } - private fun isPackageExisted(targetPackage: String?): Boolean { + private fun isPackageExisted(targetPackage: String): Boolean { try { - packageManager.getPackageInfo(targetPackage!!, PackageManager.GET_META_DATA) + packageManager.getPackageInfo(targetPackage, PackageManager.GET_META_DATA) } catch (e: PackageManager.NameNotFoundException) { return false } From 4628f3136deebb62cbd167618ebecac5657285b7 Mon Sep 17 00:00:00 2001 From: Andries Smit Date: Thu, 23 Jun 2022 20:31:40 +0200 Subject: [PATCH 020/154] feat: wear mulitple plus buttons --- .../androidaps/dialogs/CarbsDialog.kt | 6 +- .../androidaps/dialogs/InsulinDialog.kt | 6 +- .../wear/wearintegration/DataHandlerMobile.kt | 10 +- .../nightscout/shared/weardata/EventData.kt | 6 +- wear/build.gradle | 5 + .../androidaps/comm/DataHandlerWear.kt | 6 +- .../interaction/actions/BolusActivity.kt | 12 +- .../interaction/actions/CarbActivity.kt | 10 +- .../interaction/actions/ECarbActivity.kt | 10 +- .../interaction/actions/TreatmentActivity.kt | 18 +- .../actions/ViewSelectorActivity.kt | 13 +- .../interaction/actions/WizardActivity.kt | 11 +- .../utils/EditPlusMinusViewAdapter.kt | 78 ++++++++ .../interaction/utils/PlusMinusEditText.kt | 179 ++++++++++++------ .../res/layout/action_editplusminus_item.xml | 5 +- .../action_editplusminus_item_quicklefty.xml | 54 +++++- ...ion_editplusminus_item_quicklefty_plus.xml | 131 +++++++++++++ .../action_editplusminus_item_quickrighty.xml | 55 +++++- ...on_editplusminus_item_quickrighty_plus.xml | 131 +++++++++++++ .../action_editplusminus_item_viktoria.xml | 4 +- wear/src/main/res/values/strings.xml | 4 + 21 files changed, 645 insertions(+), 109 deletions(-) create mode 100644 wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt create mode 100644 wear/src/main/res/layout/action_editplusminus_item_quicklefty_plus.xml create mode 100644 wear/src/main/res/layout/action_editplusminus_item_quickrighty_plus.xml diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt index 7c73776689..ff3d0c778a 100644 --- a/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt @@ -56,9 +56,9 @@ class CarbsDialog : DialogFragmentWithDate() { companion object { - private const val FAV1_DEFAULT = 5 - private const val FAV2_DEFAULT = 10 - private const val FAV3_DEFAULT = 20 + const val FAV1_DEFAULT = 5 + const val FAV2_DEFAULT = 10 + const val FAV3_DEFAULT = 20 } private var queryingProtection = false diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/InsulinDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/InsulinDialog.kt index 9efb110a4f..7c45fe99ee 100644 --- a/app/src/main/java/info/nightscout/androidaps/dialogs/InsulinDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/dialogs/InsulinDialog.kt @@ -58,9 +58,9 @@ class InsulinDialog : DialogFragmentWithDate() { companion object { - private const val PLUS1_DEFAULT = 0.5 - private const val PLUS2_DEFAULT = 1.0 - private const val PLUS3_DEFAULT = 2.0 + const val PLUS1_DEFAULT = 0.5 + const val PLUS2_DEFAULT = 1.0 + const val PLUS3_DEFAULT = 2.0 } private var queryingProtection = false diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt index a0ccacf982..25017bfa3b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt @@ -12,6 +12,8 @@ import info.nightscout.androidaps.database.entities.* import info.nightscout.androidaps.database.interfaces.end import info.nightscout.androidaps.database.transactions.CancelCurrentTemporaryTargetIfAnyTransaction import info.nightscout.androidaps.database.transactions.InsertAndCancelCurrentTemporaryTargetTransaction +import info.nightscout.androidaps.dialogs.CarbsDialog +import info.nightscout.androidaps.dialogs.InsulinDialog import info.nightscout.androidaps.events.EventMobileToWear import info.nightscout.androidaps.extensions.convertedToAbsolute import info.nightscout.androidaps.extensions.toStringShort @@ -694,7 +696,11 @@ class DataHandlerMobile @Inject constructor( unitsMgdl = profileFunction.getUnits() == GlucoseUnit.MGDL, bolusPercentage = sp.getInt(R.string.key_boluswizard_percentage, 100), maxCarbs = sp.getInt(R.string.key_treatmentssafety_maxcarbs, 48), - maxBolus = sp.getDouble(R.string.key_treatmentssafety_maxbolus, 3.0) + maxBolus = sp.getDouble(R.string.key_treatmentssafety_maxbolus, 3.0), + insulin_button_increment_1 = sp.getDouble(R.string.key_insulin_button_increment_1, InsulinDialog.PLUS1_DEFAULT), + insulin_button_increment_2 = sp.getDouble(R.string.key_insulin_button_increment_2, InsulinDialog.PLUS2_DEFAULT), + carbs_button_increment_1 = sp.getInt(R.string.key_carbs_button_increment_1, CarbsDialog.FAV1_DEFAULT), + carbs_button_increment_2 = sp.getInt(R.string.key_carbs_button_increment_2, CarbsDialog.FAV2_DEFAULT) ) ) ) @@ -1185,4 +1191,4 @@ class DataHandlerMobile @Inject constructor( @Synchronized private fun sendError(errorMessage: String) { rxBus.send(EventMobileToWear(EventData.ConfirmAction(rh.gs(R.string.error), errorMessage, returnCommand = EventData.Error(dateUtil.now())))) // ignore return path } -} \ No newline at end of file +} diff --git a/shared/src/main/java/info/nightscout/shared/weardata/EventData.kt b/shared/src/main/java/info/nightscout/shared/weardata/EventData.kt index aca2303c89..bd0d06711b 100644 --- a/shared/src/main/java/info/nightscout/shared/weardata/EventData.kt +++ b/shared/src/main/java/info/nightscout/shared/weardata/EventData.kt @@ -208,7 +208,11 @@ sealed class EventData : Event() { val unitsMgdl: Boolean, val bolusPercentage: Int, val maxCarbs: Int, - val maxBolus: Double + val maxBolus: Double, + val insulin_button_increment_1: Double, + val insulin_button_increment_2: Double, + val carbs_button_increment_1: Int, + val carbs_button_increment_2: Int ) : EventData() @Serializable diff --git a/wear/build.gradle b/wear/build.gradle index ddcfcbfa2f..802c30ddef 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -53,6 +53,10 @@ android { buildConfigField "String", "BUILDVERSION", generateGitBuild() } + buildFeatures { + viewBinding true + } + flavorDimensions "standard" productFlavors { full { @@ -98,6 +102,7 @@ dependencies { implementation "androidx.preference:preference-ktx:$preferencektx_version" implementation 'androidx.wear:wear:1.2.0' implementation "androidx.wear.tiles:tiles:1.0.1" + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' compileOnly "com.google.android.wearable:wearable:$wearable_version" implementation "com.google.android.support:wearable:$wearable_version" diff --git a/wear/src/main/java/info/nightscout/androidaps/comm/DataHandlerWear.kt b/wear/src/main/java/info/nightscout/androidaps/comm/DataHandlerWear.kt index cac52e5439..3a05c06cf0 100644 --- a/wear/src/main/java/info/nightscout/androidaps/comm/DataHandlerWear.kt +++ b/wear/src/main/java/info/nightscout/androidaps/comm/DataHandlerWear.kt @@ -162,6 +162,10 @@ class DataHandlerWear @Inject constructor( sp.putInt(R.string.key_bolus_wizard_percentage, it.bolusPercentage) sp.putInt(R.string.key_treatments_safety_max_carbs, it.maxCarbs) sp.putDouble(R.string.key_treatments_safety_max_bolus, it.maxBolus) + sp.putDouble(R.string.key_insulin_button_increment_1, it.insulin_button_increment_1) + sp.putDouble(R.string.key_insulin_button_increment_2, it.insulin_button_increment_2) + sp.putInt(R.string.key_carbs_button_increment_1, it.carbs_button_increment_1) + sp.putInt(R.string.key_carbs_button_increment_2, it.carbs_button_increment_2) } disposable += rxBus .toObservable(EventData.QuickWizard::class.java) @@ -284,4 +288,4 @@ class DataHandlerWear @Inject constructor( NotificationManagerCompat.from(context).cancel(DataLayerListenerServiceWear.BOLUS_PROGRESS_NOTIF_ID) }.start() } -} \ No newline at end of file +} diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/BolusActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/BolusActivity.kt index e7e8b56355..766983c581 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/BolusActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/BolusActivity.kt @@ -10,10 +10,12 @@ import android.view.ViewGroup import android.widget.ImageView import info.nightscout.androidaps.R import info.nightscout.androidaps.events.EventWearToMobile +import info.nightscout.androidaps.interaction.utils.EditPlusMinusViewAdapter import info.nightscout.androidaps.interaction.utils.PlusMinusEditText import info.nightscout.shared.SafeParse import info.nightscout.shared.weardata.EventData.ActionBolusPreCheck import java.text.DecimalFormat +import kotlin.math.roundToInt class BolusActivity : ViewSelectorActivity() { @@ -33,13 +35,17 @@ class BolusActivity : ViewSelectorActivity() { override fun getColumnCount(arg0: Int): Int = 2 override fun getRowCount(): Int = 1 + val increment1 = (sp.getDouble(R.string.key_insulin_button_increment_1, 0.5) * 10).roundToInt() / 10.0 + val increment2 = (sp.getDouble(R.string.key_insulin_button_increment_2, 1.0) * 10).roundToInt() / 10.0 + override fun instantiateItem(container: ViewGroup, row: Int, col: Int): Any { val view: View if (col == 0) { - view = getInflatedPlusMinusView(container) + view = EditPlusMinusViewAdapter.getInflatedPlusMinusView(sp, applicationContext, container, true).root val initValue = if (editInsulin != null) SafeParse.stringToDouble(editInsulin?.editText?.text.toString()) else 0.0 val maxBolus = sp.getDouble(getString(R.string.key_treatments_safety_max_bolus), 3.0) - editInsulin = PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, initValue, 0.0, maxBolus, 0.1, DecimalFormat("#0.0"), false) + val buttons = listOf(Pair(R.id.plusbutton, 0.1), Pair(R.id.plusbutton2, increment1), Pair(R.id.plusbutton3, increment2)) // When taken form phone settings round. + editInsulin = PlusMinusEditText(view, R.id.amountfield, buttons, R.id.minusbutton, initValue, 0.0, maxBolus, 0.1, DecimalFormat("#0.0"), false) setLabelToPlusMinusView(view, getString(R.string.action_insulin)) container.addView(view) view.requestFocus() @@ -62,4 +68,4 @@ class BolusActivity : ViewSelectorActivity() { override fun isViewFromObject(view: View, `object`: Any): Boolean = view === `object` } -} \ No newline at end of file +} diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/CarbActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/CarbActivity.kt index 4dd487bb79..7de9a45dd3 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/CarbActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/CarbActivity.kt @@ -30,19 +30,23 @@ class CarbActivity : ViewSelectorActivity() { private inner class MyGridViewPagerAdapter : GridPagerAdapter() { + val increment1 = sp.getInt(R.string.key_carbs_button_increment_1, 5).toDouble() + val increment2 = sp.getInt(R.string.key_carbs_button_increment_2, 10).toDouble() + override fun getColumnCount(arg0: Int): Int = 2 override fun getRowCount(): Int = 1 override fun instantiateItem(container: ViewGroup, row: Int, col: Int): Any { val view: View if (col == 0) { - view = getInflatedPlusMinusView(container) + view = getInflatedPlusMinusView(container, true) var def = 0.0 if (editCarbs != null) { def = SafeParse.stringToDouble(editCarbs?.editText?.text.toString()) } val maxCarbs = sp.getInt(getString(R.string.key_treatments_safety_max_carbs), 48) - editCarbs = PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), true) + val buttons = listOf(Pair(R.id.plusbutton, 1.0), Pair(R.id.plusbutton2, increment1), Pair(R.id.plusbutton3, increment2)) + editCarbs = PlusMinusEditText(view, R.id.amountfield, buttons, R.id.minusbutton, def, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), true) setLabelToPlusMinusView(view, getString(R.string.action_carbs)) container.addView(view) view.requestFocus() @@ -69,4 +73,4 @@ class CarbActivity : ViewSelectorActivity() { override fun isViewFromObject(view: View, `object`: Any): Boolean = view === `object` } -} \ No newline at end of file +} diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.kt index 21d7b41f31..50988562a4 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.kt @@ -36,15 +36,19 @@ class ECarbActivity : ViewSelectorActivity() { override fun getColumnCount(arg0: Int): Int = 4 override fun getRowCount(): Int = 1 + private val increment1 = sp.getInt(R.string.key_carbs_button_increment_1, 5).toDouble() + private val increment2 = sp.getInt(R.string.key_carbs_button_increment_2, 10).toDouble() + override fun instantiateItem(container: ViewGroup, row: Int, col: Int): Any { return if (col == 0) { - val view = getInflatedPlusMinusView(container) + val view = getInflatedPlusMinusView(container, true) var def = 0.0 if (editCarbs != null) { def = stringToDouble(editCarbs?.editText?.text.toString()) } val maxCarbs = sp.getInt(getString(R.string.key_treatments_safety_max_carbs), 48) - editCarbs = PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), true) + val buttons = listOf(Pair(R.id.plusbutton, 1.0), Pair(R.id.plusbutton2, increment1), Pair(R.id.plusbutton3, increment2)) + editCarbs = PlusMinusEditText(view, R.id.amountfield, buttons, R.id.minusbutton, def, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), true) setLabelToPlusMinusView(view, getString(R.string.action_carbs)) container.addView(view) view.requestFocus() @@ -98,4 +102,4 @@ class ECarbActivity : ViewSelectorActivity() { override fun isViewFromObject(view: View, `object`: Any): Boolean = view === `object` } -} \ No newline at end of file +} diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TreatmentActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TreatmentActivity.kt index ed504969b1..630317b89a 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TreatmentActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TreatmentActivity.kt @@ -15,6 +15,7 @@ import info.nightscout.shared.SafeParse.stringToDouble import info.nightscout.shared.SafeParse.stringToInt import info.nightscout.shared.weardata.EventData.ActionBolusPreCheck import java.text.DecimalFormat +import kotlin.math.roundToInt class TreatmentActivity : ViewSelectorActivity() { @@ -35,23 +36,30 @@ class TreatmentActivity : ViewSelectorActivity() { override fun getColumnCount(arg0: Int): Int = 3 override fun getRowCount(): Int = 1 + val incrementInsulin1 = (sp.getDouble(R.string.key_insulin_button_increment_1, 0.5) * 10).roundToInt() / 10.0 + val incrementInsulin2 = (sp.getDouble(R.string.key_insulin_button_increment_2, 1.0) * 10).roundToInt() / 10.0 + val incrementCarbs1 = sp.getInt(R.string.key_carbs_button_increment_1, 5).toDouble() + val incrementCarbs2 = sp.getInt(R.string.key_carbs_button_increment_2, 10).toDouble() + override fun instantiateItem(container: ViewGroup, row: Int, col: Int): Any { return if (col == 0) { - val view = getInflatedPlusMinusView(container) + val view = getInflatedPlusMinusView(container, true) var def = 0.0 if (editInsulin != null) def = stringToDouble(editInsulin?.editText?.text.toString()) val maxBolus = sp.getDouble(getString(R.string.key_treatments_safety_max_bolus), 3.0) - editInsulin = PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 0.0, maxBolus, 0.1, DecimalFormat("#0.0"), false) + val buttons = listOf(Pair(R.id.plusbutton, 0.1), Pair(R.id.plusbutton2, incrementInsulin1), Pair(R.id.plusbutton3, incrementInsulin2)) + editInsulin = PlusMinusEditText(view, R.id.amountfield, buttons, R.id.minusbutton, def, 0.0, maxBolus, 0.1, DecimalFormat("#0.0"), false) setLabelToPlusMinusView(view, getString(R.string.action_insulin)) container.addView(view) view.requestFocus() view } else if (col == 1) { - val view = getInflatedPlusMinusView(container) + val view = getInflatedPlusMinusView(container, true) var def = 0.0 val maxCarbs = sp.getInt(getString(R.string.key_treatments_safety_max_carbs), 48) if (editCarbs != null) def = stringToDouble(editCarbs?.editText?.text.toString()) - editCarbs = PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), false) + val buttons = listOf(Pair(R.id.plusbutton, 1.0), Pair(R.id.plusbutton2, incrementCarbs1), Pair(R.id.plusbutton3, incrementCarbs2)) + editCarbs = PlusMinusEditText(view, R.id.amountfield, buttons, R.id.minusbutton, def, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), false) setLabelToPlusMinusView(view, getString(R.string.action_carbs)) container.addView(view) view @@ -79,4 +87,4 @@ class TreatmentActivity : ViewSelectorActivity() { override fun isViewFromObject(view: View, `object`: Any): Boolean = view === `object` } -} \ No newline at end of file +} diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ViewSelectorActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ViewSelectorActivity.kt index 9fd6b9adf1..eb3a9b70d7 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ViewSelectorActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ViewSelectorActivity.kt @@ -73,13 +73,16 @@ open class ViewSelectorActivity : DaggerActivity() { } } - fun getInflatedPlusMinusView(container: ViewGroup?): View = - when (sp.getInt(R.string.key_input_design, 1)) { - 2 -> LayoutInflater.from(applicationContext).inflate(R.layout.action_editplusminus_item_quickrighty, container, false) - 3 -> LayoutInflater.from(applicationContext).inflate(R.layout.action_editplusminus_item_quicklefty, container, false) + fun getInflatedPlusMinusView(container: ViewGroup?, mulitple: Boolean = false): View { + val layoutRight = if (mulitple) R.layout.action_editplusminus_item_quickrighty_plus else R.layout.action_editplusminus_item_quickrighty + val layoutLeft = if (mulitple) R.layout.action_editplusminus_item_quicklefty_plus else R.layout.action_editplusminus_item_quicklefty + return when (sp.getInt(R.string.key_input_design, 1)) { + 2 -> LayoutInflater.from(applicationContext).inflate(layoutRight, container, false) + 3 -> LayoutInflater.from(applicationContext).inflate(layoutLeft, container, false) 4 -> LayoutInflater.from(applicationContext).inflate(R.layout.action_editplusminus_item_viktoria, container, false) else -> LayoutInflater.from(applicationContext).inflate(R.layout.action_editplusminus_item, container, false) } + } fun setLabelToPlusMinusView(view: View, labelText: String?) { val textView = view.findViewById(R.id.label) @@ -89,4 +92,4 @@ open class ViewSelectorActivity : DaggerActivity() { fun showToast(context: Context?, text: Int) { Toast.makeText(context, getString(text), Toast.LENGTH_LONG).show() } -} \ No newline at end of file +} diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.kt index f8c6208e52..dfd6e6291b 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.kt @@ -35,16 +35,19 @@ class WizardActivity : ViewSelectorActivity() { override fun getColumnCount(arg0: Int): Int = if (hasPercentage) 3 else 2 override fun getRowCount(): Int = 1 + private val increment1 = sp.getInt(R.string.key_carbs_button_increment_1, 5).toDouble() + private val increment2 = sp.getInt(R.string.key_carbs_button_increment_2, 10).toDouble() override fun instantiateItem(container: ViewGroup, row: Int, col: Int): Any { return if (col == 0) { - val view = getInflatedPlusMinusView(container) + val view = getInflatedPlusMinusView(container, true) val maxCarbs = sp.getInt(getString(R.string.key_treatments_safety_max_carbs), 48) + val buttons = listOf(Pair(R.id.plusbutton, 1.0), Pair(R.id.plusbutton2, increment1), Pair(R.id.plusbutton3, increment2)) editCarbs = if (editCarbs == null) { - PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, 0.0, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), false) + PlusMinusEditText(view, R.id.amountfield, buttons, R.id.minusbutton, 0.0, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), false) } else { val def = SafeParse.stringToDouble(editCarbs?.editText?.text.toString()) - PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), false) + PlusMinusEditText(view, R.id.amountfield, buttons, R.id.minusbutton, def, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), false) } setLabelToPlusMinusView(view, getString(R.string.action_carbs)) container.addView(view) @@ -84,4 +87,4 @@ class WizardActivity : ViewSelectorActivity() { override fun isViewFromObject(view: View, `object`: Any): Boolean = view === `object` } -} \ No newline at end of file +} diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt new file mode 100644 index 0000000000..4b3798940b --- /dev/null +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt @@ -0,0 +1,78 @@ +package info.nightscout.androidaps.interaction.utils + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import info.nightscout.androidaps.R +import info.nightscout.androidaps.databinding.ActionEditplusminusItemBinding +import info.nightscout.androidaps.databinding.ActionEditplusminusItemQuickleftyPlusBinding +import info.nightscout.androidaps.databinding.ActionEditplusminusItemQuickleftyBinding +import info.nightscout.androidaps.databinding.ActionEditplusminusItemQuickrightyBinding +import info.nightscout.androidaps.databinding.ActionEditplusminusItemQuickrightyPlusBinding +import info.nightscout.androidaps.databinding.ActionEditplusminusItemViktoriaBinding +import info.nightscout.shared.sharedPreferences.SP + +/** + * NumberPickerViewAdapter binds both NumberPickerLayoutBinding and NumberPickerLayoutVerticalBinding shared attributes to one common view adapter. + * Requires at least one of the ViewBinding as a parameter. Recommended to use the factory object to create the binding. + */ +class EditPlusMinusViewAdapter( + val eS: ActionEditplusminusItemBinding?, + val eQLP: ActionEditplusminusItemQuickleftyPlusBinding?, + val eQL: ActionEditplusminusItemQuickleftyBinding?, + val eQRP: ActionEditplusminusItemQuickleftyPlusBinding?, + val qQR: ActionEditplusminusItemQuickrightyBinding?, + val nQRP: ActionEditplusminusItemQuickrightyPlusBinding?, + val eV: ActionEditplusminusItemViktoriaBinding? +) { + + init { + if (eS == null && eQLP == null && eQL == null && eQRP == null && qQR == null && nQRP == null && eV == null) { + throw IllegalArgumentException("Require at least on Binding parameter") + } + } + + val amountField = + eS?.amountfield ?: eQLP?.amountfield ?: eQL?.amountfield ?: eQRP?.amountfield ?: qQR?.amountfield ?: nQRP?.amountfield ?: eV?.amountfield + ?: throw IllegalArgumentException("Missing require View Binding parameter display") + val minusButton = + eS?.minusbutton ?: eQLP?.minusbutton ?: eQL?.minusbutton ?: eQRP?.minusbutton ?: qQR?.minusbutton ?: nQRP?.minusbutton ?: eV?.minusbutton + ?: throw IllegalArgumentException("Missing require View Binding parameter display") + val plusButton = + eS?.plusbutton ?: eQLP?.plusbutton ?: eQL?.plusbutton ?: eQRP?.plusbutton ?: qQR?.plusbutton ?: nQRP?.plusbutton ?: eV?.plusbutton + ?: throw IllegalArgumentException("Missing require View Binding parameter display") + val label = + eS?.label ?: eQLP?.label ?: eQL?.label ?: eQRP?.label ?: qQR?.label ?: nQRP?.label ?: eV?.label + ?: throw IllegalArgumentException("Missing require View Binding parameter display") + val plusButton2 = eQLP?.plusbutton2 ?: eQRP?.plusbutton2 + val plusButton3 = eQLP?.plusbutton3 ?: eQRP?.plusbutton3 + val root = + eS?.root ?: eQLP?.root ?: eQL?.root ?: eQRP?.root ?: qQR?.root ?: nQRP?.root ?: eV?.root + ?: throw IllegalArgumentException("Missing require View Binding parameter display") + + companion object { + + fun getInflatedPlusMinusView(sp: SP, context: Context, container: ViewGroup?, mulitple: Boolean = false): EditPlusMinusViewAdapter { + val inflater = LayoutInflater.from(context) + val bindLayout = ActionEditplusminusItemBinding.inflate(inflater, container, false) + val binding = EditPlusMinusViewAdapter(bindLayout, null, null, null, null, null, null) + return binding + // val layoutRight = if (mulitple) R.layout.action_editplusminus_item_quickrighty_plus else R.layout.action_editplusminus_item_quickrighty + // val layoutLeft = if (mulitple) R.layout.action_editplusminus_item_quicklefty_plus else R.layout.action_editplusminus_item_quicklefty + // return when (sp.getInt(R.string.key_input_design, 1)) { + // 2 -> LayoutInflater.from(applicationContext).inflate(layoutRight, container, false) + // 3 -> LayoutInflater.from(applicationContext).inflate(layoutLeft, container, false) + // 4 -> LayoutInflater.from(applicationContext).inflate(R.layout.action_editplusminus_item_viktoria, container, false) + // else -> LayoutInflater.from(applicationContext).inflate(R.layout.action_editplusminus_item, container, false) + // } + } + // fun getBinding(bindLayout: NumberPickerLayoutBinding): NumberPickerViewAdapter { + // return NumberPickerViewAdapter(bindLayout, null) + // } + // + // fun getBinding(bindLayout: NumberPickerLayoutVerticalBinding): NumberPickerViewAdapter { + // return NumberPickerViewAdapter(null, bindLayout) + // } + } +} \ No newline at end of file diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt index 1ee994c9d3..f812b7e245 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt @@ -1,67 +1,82 @@ package info.nightscout.androidaps.interaction.utils -import android.os.Handler -import kotlin.jvm.JvmOverloads -import android.view.View.OnTouchListener -import android.view.View.OnGenericMotionListener -import android.widget.TextView -import android.view.MotionEvent -import android.os.Looper -import android.os.Message +import android.annotation.SuppressLint +import android.content.Context +import android.os.* import android.view.KeyEvent +import android.view.MotionEvent import android.view.View -import android.widget.ImageView +import android.view.View.OnGenericMotionListener +import android.view.View.OnTouchListener +import android.widget.TextView +import androidx.appcompat.widget.AppCompatButton import androidx.core.view.InputDeviceCompat import androidx.core.view.MotionEventCompat +import java.text.DecimalFormat import java.text.NumberFormat import java.util.concurrent.Executors import java.util.concurrent.ScheduledExecutorService import java.util.concurrent.TimeUnit +import kotlin.Pair /** * Created by mike on 28.06.2016. */ -class PlusMinusEditText @JvmOverloads constructor( +@SuppressLint("SetTextI18n") class PlusMinusEditText @JvmOverloads constructor( view: View, editTextID: Int, - plusID: Int, + private var plusButtons: List>, minusID: Int, initValue: Double, - minValue: Double, - maxValue: Double, - step: Double, - formatter: NumberFormat, - allowZero: Boolean, - roundRobin: Boolean = false + private val minValue: Double, + private val maxValue: Double, + private val stepGeneral: Double, + private val formatter: NumberFormat, + private val allowZero: Boolean, + private val roundRobin: Boolean = false, ) : View.OnKeyListener, OnTouchListener, View.OnClickListener, OnGenericMotionListener { + constructor( + view: View, + editTextID: Int, + plusID: Int, + minusID: Int, + initValue: Double, + minValue: Double, + maxValue: Double, + stepGeneral: Double, + formatter: NumberFormat, + allowZero: Boolean, + roundRobin: Boolean = false + ) : this(view, editTextID, listOf(Pair(plusID, stepGeneral)), minusID, initValue, minValue, maxValue, stepGeneral, formatter, allowZero, roundRobin) + var editText: TextView private set - private var minusImage: ImageView - private var plusImage: ImageView + private var minusImage: View + private var plusImage1: View + private var plusImage2: AppCompatButton? = null + private var plusImage3: AppCompatButton? = null private var value: Double - private var minValue: Double - private var maxValue: Double - private var step: Double - private var formatter: NumberFormat - private var allowZero: Boolean - private var roundRobin: Boolean + private val context: Context private var mChangeCounter = 0 private var mLastChange: Long = 0 private val mHandler: Handler private var mUpdater: ScheduledExecutorService? = null - private inner class UpdateCounterTask(private val mInc: Boolean) : Runnable { + private inner class UpdateCounterTask(private val mInc: Boolean, private val step: Double) : Runnable { private var repeated = 0 private var multiplier = 1 override fun run() { val msg = Message() val doubleLimit = 5 - if (repeated % doubleLimit == 0) multiplier *= 2 - repeated++ - msg.arg1 = multiplier - msg.arg2 = repeated + val multipleButtons = mInc && (plusImage2 != null || plusImage3 != null) + if (!multipleButtons && repeated % doubleLimit == 0) multiplier *= 2 + val bundle = Bundle() + bundle.putDouble("step", step) + bundle.putInt("multiplier", multiplier) + msg.data = bundle + if (mInc) { msg.what = MSG_INC } else { @@ -71,7 +86,7 @@ class PlusMinusEditText @JvmOverloads constructor( } } - private fun inc(multiplier: Int) { + private fun inc(multiplier: Int, step: Double, vibrate: Boolean = true) { value += step * multiplier if (value > maxValue) { if (roundRobin) { @@ -82,9 +97,10 @@ class PlusMinusEditText @JvmOverloads constructor( } } updateEditText() + if (vibrate) vibrateDevice() } - private fun dec(multiplier: Int) { + private fun dec(multiplier: Int, step: Double, vibrate: Boolean = true) { value -= step * multiplier if (value < minValue) { if (roundRobin) { @@ -95,20 +111,39 @@ class PlusMinusEditText @JvmOverloads constructor( } } updateEditText() + if (vibrate) vibrateDevice() + } + + fun vibrateDevice() { + val vibrator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + val vibratorManager = + context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager + vibratorManager.defaultVibrator + } else { + @Suppress("DEPRECATION") + context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + vibrator.vibrate(VibrationEffect.createOneShot(10, VibrationEffect.DEFAULT_AMPLITUDE)) + } else { + @Suppress("DEPRECATION") + vibrator.vibrate(10) + } } private fun updateEditText() { if (value == 0.0 && !allowZero) editText.text = "" else editText.text = formatter.format(value) } - private fun startUpdating(inc: Boolean) { + private fun startUpdating(inc: Boolean, step: Double) { if (mUpdater != null) { return } mUpdater = Executors.newSingleThreadScheduledExecutor() mUpdater?.scheduleAtFixedRate( - UpdateCounterTask(inc), 200, 200, + UpdateCounterTask(inc, step), 200, 200, TimeUnit.MILLISECONDS ) } @@ -118,12 +153,30 @@ class PlusMinusEditText @JvmOverloads constructor( mUpdater = null } + private fun getStep(v: View): Double { + return when (v) { + plusImage1 -> plusButtons[0].second + plusImage2 -> plusButtons[1].second + plusImage3 -> plusButtons[2].second + else -> stepGeneral + } + } + + private fun isIncrement(v: View): Boolean { + return when (v) { + plusImage1 -> true + plusImage2 -> true + plusImage3 -> true + else -> false + } + } + override fun onClick(v: View) { if (mUpdater == null) { - if (v === plusImage) { - inc(1) + if (isIncrement(v)) { + inc(1, getStep(v)) } else { - dec(1) + dec(1, getStep(v)) } } } @@ -135,7 +188,7 @@ class PlusMinusEditText @JvmOverloads constructor( if (isKeyOfInterest && isReleased) { stopUpdating() } else if (isKeyOfInterest && isPressed) { - startUpdating(v === plusImage) + startUpdating(isIncrement(v), stepGeneral) } return false } @@ -146,7 +199,7 @@ class PlusMinusEditText @JvmOverloads constructor( if (isReleased) { stopUpdating() } else if (isPressed) { - startUpdating(v === plusImage) + startUpdating(isIncrement(v), getStep(v)) } return false } @@ -158,9 +211,9 @@ class PlusMinusEditText @JvmOverloads constructor( val dynamicMultiplier = if (mChangeCounter < THRESHOLD_COUNTER) 1 else if (mChangeCounter < THRESHOLD_COUNTER_LONG) 2 else 4 val delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) if (delta > 0) { - inc(dynamicMultiplier) + inc(dynamicMultiplier, stepGeneral, false) } else { - dec(dynamicMultiplier) + dec(dynamicMultiplier, stepGeneral, false) } mLastChange = System.currentTimeMillis() mChangeCounter++ @@ -179,39 +232,59 @@ class PlusMinusEditText @JvmOverloads constructor( } init { + context = view.context editText = view.findViewById(editTextID) minusImage = view.findViewById(minusID) - plusImage = view.findViewById(plusID) + plusImage1 = view.findViewById(plusButtons.first().first) + val format = DecimalFormat("#.#") + plusButtons.getOrNull(1)?.let { + plusImage2 = view.findViewById(it.first) + plusImage2?.text = "+${format.format(it.second).replaceFirst("^0+(?!$)".toRegex(), "")}" + plusImage2?.visibility = View.VISIBLE + } + plusButtons.getOrNull(2)?.let { + plusImage3 = view.findViewById(it.first) + plusImage3?.text = "+${format.format(it.second).replaceFirst("^0+(?!$)".toRegex(), "")}" + plusImage3?.visibility = View.VISIBLE + } + value = initValue - this.minValue = minValue - this.maxValue = maxValue - this.step = step - this.formatter = formatter - this.allowZero = allowZero - this.roundRobin = roundRobin mHandler = object : Handler(Looper.getMainLooper()) { override fun handleMessage(msg: Message) { + val multiplier = msg.data.getInt("multiplier") + val step = msg.data.getDouble("step") + when (msg.what) { MSG_INC -> { - inc(msg.arg1) + inc(multiplier, step) return } MSG_DEC -> { - dec(msg.arg1) + dec(multiplier, step) return } } super.handleMessage(msg) } } + + editText.showSoftInputOnFocus = false + editText.setTextIsSelectable(false) minusImage.setOnTouchListener(this) minusImage.setOnKeyListener(this) minusImage.setOnClickListener(this) - plusImage.setOnTouchListener(this) - plusImage.setOnKeyListener(this) - plusImage.setOnClickListener(this) + plusImage1.setOnTouchListener(this) + plusImage1.setOnKeyListener(this) + plusImage1.setOnClickListener(this) + plusImage2?.setOnTouchListener(this) + plusImage2?.setOnKeyListener(this) + plusImage2?.setOnClickListener(this) + plusImage3?.setOnTouchListener(this) + plusImage3?.setOnKeyListener(this) + plusImage3?.setOnClickListener(this) editText.setOnGenericMotionListener(this) updateEditText() } + } diff --git a/wear/src/main/res/layout/action_editplusminus_item.xml b/wear/src/main/res/layout/action_editplusminus_item.xml index c3cbe263ba..5c5b8856d5 100644 --- a/wear/src/main/res/layout/action_editplusminus_item.xml +++ b/wear/src/main/res/layout/action_editplusminus_item.xml @@ -7,7 +7,7 @@ android:gravity="center" android:orientation="horizontal"> - - - diff --git a/wear/src/main/res/layout/action_editplusminus_item_quicklefty.xml b/wear/src/main/res/layout/action_editplusminus_item_quicklefty.xml index bf3418ca2c..d96ae1d26f 100644 --- a/wear/src/main/res/layout/action_editplusminus_item_quicklefty.xml +++ b/wear/src/main/res/layout/action_editplusminus_item_quicklefty.xml @@ -7,16 +7,52 @@ android:gravity="center" android:orientation="horizontal"> - + android:layout_marginEnd="-8dp" + android:orientation="vertical"> + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + diff --git a/wear/src/main/res/layout/action_editplusminus_item_quickrighty.xml b/wear/src/main/res/layout/action_editplusminus_item_quickrighty.xml index 78c5d7e817..7e3ae3dcb1 100644 --- a/wear/src/main/res/layout/action_editplusminus_item_quickrighty.xml +++ b/wear/src/main/res/layout/action_editplusminus_item_quickrighty.xml @@ -41,7 +41,7 @@ tools:ignore="LabelFor" tools:text="label" /> - - + android:layout_marginStart="-8dp" + android:orientation="vertical" + tools:visibility="visible"> + + + + + + + + diff --git a/wear/src/main/res/layout/action_editplusminus_item_quickrighty_plus.xml b/wear/src/main/res/layout/action_editplusminus_item_quickrighty_plus.xml new file mode 100644 index 0000000000..07a9101a0e --- /dev/null +++ b/wear/src/main/res/layout/action_editplusminus_item_quickrighty_plus.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/wear/src/main/res/layout/action_editplusminus_item_viktoria.xml b/wear/src/main/res/layout/action_editplusminus_item_viktoria.xml index 0b396d8b7f..b734b9db7b 100644 --- a/wear/src/main/res/layout/action_editplusminus_item_viktoria.xml +++ b/wear/src/main/res/layout/action_editplusminus_item_viktoria.xml @@ -25,7 +25,7 @@ android:layout_gravity="start|center_vertical|center_horizontal" android:orientation="vertical"> - - dark input_design complication_tap_action + insulin_button_increment_1 + insulin_button_increment_2 + carbs_button_increment_1 + carbs_button_increment_2 increment decrement H From 14d1ba80abd325b7fc2787eaa41c9021da72776b Mon Sep 17 00:00:00 2001 From: Andries Smit Date: Sun, 26 Jun 2022 13:17:16 +0200 Subject: [PATCH 021/154] chore: wear: plus minus view adapter --- .../interaction/actions/AcceptActivity.kt | 18 +- .../interaction/actions/BolusActivity.kt | 23 +-- .../interaction/actions/CarbActivity.kt | 23 +-- .../interaction/actions/ECarbActivity.kt | 43 +++-- .../interaction/actions/FillActivity.kt | 17 +- .../actions/ProfileSwitchActivity.kt | 26 +-- .../interaction/actions/TempTargetActivity.kt | 46 +++--- .../interaction/actions/TreatmentActivity.kt | 30 ++-- .../actions/ViewSelectorActivity.kt | 16 -- .../interaction/actions/WizardActivity.kt | 31 ++-- .../utils/EditPlusMinusViewAdapter.kt | 97 ++++++----- .../interaction/utils/PlusMinusEditText.kt | 102 +++++------- .../res/layout/action_editplusminus_item.xml | 156 ++++++++++++------ .../layout/action_editplusminus_item_plus.xml | 126 ++++++++++++++ .../action_editplusminus_item_quicklefty.xml | 37 +---- ...ion_editplusminus_item_quicklefty_plus.xml | 54 +++--- .../action_editplusminus_item_quickrighty.xml | 35 +--- ...on_editplusminus_item_quickrighty_plus.xml | 42 +++-- .../action_editplusminus_item_viktoria.xml | 8 +- 19 files changed, 544 insertions(+), 386 deletions(-) create mode 100644 wear/src/main/res/layout/action_editplusminus_item_plus.xml diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/AcceptActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/AcceptActivity.kt index 2134f60f6d..b3c395fb76 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/AcceptActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/AcceptActivity.kt @@ -56,10 +56,9 @@ class AcceptActivity : ViewSelectorActivity() { override fun getColumnCount(arg0: Int): Int = 2 override fun getRowCount(): Int = 1 - override fun instantiateItem(container: ViewGroup, row: Int, col: Int): Any { - val view: View - if (col == 0) { - view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_text, container, false) + override fun instantiateItem(container: ViewGroup, row: Int, col: Int): View = when (col) { + 0 -> { + val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_text, container, false) val textView = view.findViewById(R.id.message) val scrollView = view.findViewById(R.id.message_scroll) textView.text = message @@ -79,8 +78,11 @@ class AcceptActivity : ViewSelectorActivity() { false } scrollView.requestFocus() - } else { - view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) + view + } + + else -> { + val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) val confirmButton = view.findViewById(R.id.confirmbutton) confirmButton.setOnClickListener { if (actionKey.isNotEmpty()) startService(IntentWearToMobile(this@AcceptActivity, actionKey)) @@ -88,8 +90,8 @@ class AcceptActivity : ViewSelectorActivity() { finishAffinity() } container.addView(view) + view } - return view } override fun destroyItem(container: ViewGroup, row: Int, col: Int, view: Any) { @@ -127,4 +129,4 @@ class AcceptActivity : ViewSelectorActivity() { finish() } } -} \ No newline at end of file +} diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/BolusActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/BolusActivity.kt index 766983c581..012d5ec516 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/BolusActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/BolusActivity.kt @@ -37,20 +37,23 @@ class BolusActivity : ViewSelectorActivity() { val increment1 = (sp.getDouble(R.string.key_insulin_button_increment_1, 0.5) * 10).roundToInt() / 10.0 val increment2 = (sp.getDouble(R.string.key_insulin_button_increment_2, 1.0) * 10).roundToInt() / 10.0 + val stepValues = listOf(0.1, increment1, increment2) - override fun instantiateItem(container: ViewGroup, row: Int, col: Int): Any { - val view: View - if (col == 0) { - view = EditPlusMinusViewAdapter.getInflatedPlusMinusView(sp, applicationContext, container, true).root + override fun instantiateItem(container: ViewGroup, row: Int, col: Int): View = when (col) { + 0 -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, true) val initValue = if (editInsulin != null) SafeParse.stringToDouble(editInsulin?.editText?.text.toString()) else 0.0 val maxBolus = sp.getDouble(getString(R.string.key_treatments_safety_max_bolus), 3.0) - val buttons = listOf(Pair(R.id.plusbutton, 0.1), Pair(R.id.plusbutton2, increment1), Pair(R.id.plusbutton3, increment2)) // When taken form phone settings round. - editInsulin = PlusMinusEditText(view, R.id.amountfield, buttons, R.id.minusbutton, initValue, 0.0, maxBolus, 0.1, DecimalFormat("#0.0"), false) - setLabelToPlusMinusView(view, getString(R.string.action_insulin)) + val title = getString(R.string.action_insulin) + editInsulin = PlusMinusEditText(viewAdapter, initValue, 0.0, maxBolus, stepValues, DecimalFormat("#0.0"), false, title) + val view = viewAdapter.root container.addView(view) view.requestFocus() - } else { - view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) + view + } + + else -> { + val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) val confirmButton = view.findViewById(R.id.confirmbutton) confirmButton.setOnClickListener { rxBus.send(EventWearToMobile(ActionBolusPreCheck(SafeParse.stringToDouble(editInsulin?.editText?.text.toString()), 0))) @@ -58,8 +61,8 @@ class BolusActivity : ViewSelectorActivity() { finishAffinity() } container.addView(view) + view } - return view } override fun destroyItem(container: ViewGroup, row: Int, col: Int, view: Any) { diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/CarbActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/CarbActivity.kt index 7de9a45dd3..b941049002 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/CarbActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/CarbActivity.kt @@ -10,6 +10,7 @@ import android.view.ViewGroup import android.widget.ImageView import info.nightscout.androidaps.R import info.nightscout.androidaps.events.EventWearToMobile +import info.nightscout.androidaps.interaction.utils.EditPlusMinusViewAdapter import info.nightscout.androidaps.interaction.utils.PlusMinusEditText import info.nightscout.shared.SafeParse import info.nightscout.shared.weardata.EventData.ActionECarbsPreCheck @@ -32,26 +33,28 @@ class CarbActivity : ViewSelectorActivity() { val increment1 = sp.getInt(R.string.key_carbs_button_increment_1, 5).toDouble() val increment2 = sp.getInt(R.string.key_carbs_button_increment_2, 10).toDouble() + val stepValues = listOf(1.0, increment1, increment2) override fun getColumnCount(arg0: Int): Int = 2 override fun getRowCount(): Int = 1 - override fun instantiateItem(container: ViewGroup, row: Int, col: Int): Any { - val view: View - if (col == 0) { - view = getInflatedPlusMinusView(container, true) + override fun instantiateItem(container: ViewGroup, row: Int, col: Int): View = when (col) { + 0 -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, true) + val view = viewAdapter.root var def = 0.0 if (editCarbs != null) { def = SafeParse.stringToDouble(editCarbs?.editText?.text.toString()) } val maxCarbs = sp.getInt(getString(R.string.key_treatments_safety_max_carbs), 48) - val buttons = listOf(Pair(R.id.plusbutton, 1.0), Pair(R.id.plusbutton2, increment1), Pair(R.id.plusbutton3, increment2)) - editCarbs = PlusMinusEditText(view, R.id.amountfield, buttons, R.id.minusbutton, def, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), true) - setLabelToPlusMinusView(view, getString(R.string.action_carbs)) + editCarbs = PlusMinusEditText(viewAdapter, def, 0.0, maxCarbs.toDouble(), stepValues, DecimalFormat("0"), true, getString(R.string.action_carbs)) container.addView(view) view.requestFocus() - } else { - view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) + view + } + + else -> { + val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) val confirmButton = view.findViewById(R.id.confirmbutton) confirmButton.setOnClickListener { // With start time 0 and duration 0 @@ -61,8 +64,8 @@ class CarbActivity : ViewSelectorActivity() { finishAffinity() } container.addView(view) + view } - return view } override fun destroyItem(container: ViewGroup, row: Int, col: Int, view: Any) { diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.kt index 50988562a4..0a643e9bff 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.kt @@ -10,6 +10,7 @@ import android.view.ViewGroup import android.widget.ImageView import info.nightscout.androidaps.R import info.nightscout.androidaps.events.EventWearToMobile +import info.nightscout.androidaps.interaction.utils.EditPlusMinusViewAdapter import info.nightscout.androidaps.interaction.utils.PlusMinusEditText import info.nightscout.shared.SafeParse.stringToDouble import info.nightscout.shared.SafeParse.stringToInt @@ -36,44 +37,50 @@ class ECarbActivity : ViewSelectorActivity() { override fun getColumnCount(arg0: Int): Int = 4 override fun getRowCount(): Int = 1 - private val increment1 = sp.getInt(R.string.key_carbs_button_increment_1, 5).toDouble() - private val increment2 = sp.getInt(R.string.key_carbs_button_increment_2, 10).toDouble() + val increment1 = sp.getInt(R.string.key_carbs_button_increment_1, 5).toDouble() + val increment2 = sp.getInt(R.string.key_carbs_button_increment_2, 10).toDouble() + val stepValues = listOf(1.0, increment1, increment2) - override fun instantiateItem(container: ViewGroup, row: Int, col: Int): Any { - return if (col == 0) { - val view = getInflatedPlusMinusView(container, true) + override fun instantiateItem(container: ViewGroup, row: Int, col: Int): View = when (col) { + 0 -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, true) + val view = viewAdapter.root var def = 0.0 if (editCarbs != null) { def = stringToDouble(editCarbs?.editText?.text.toString()) } val maxCarbs = sp.getInt(getString(R.string.key_treatments_safety_max_carbs), 48) - val buttons = listOf(Pair(R.id.plusbutton, 1.0), Pair(R.id.plusbutton2, increment1), Pair(R.id.plusbutton3, increment2)) - editCarbs = PlusMinusEditText(view, R.id.amountfield, buttons, R.id.minusbutton, def, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), true) - setLabelToPlusMinusView(view, getString(R.string.action_carbs)) + editCarbs = PlusMinusEditText(viewAdapter, def, 0.0, maxCarbs.toDouble(), stepValues, DecimalFormat("0"), true, getString(R.string.action_carbs)) container.addView(view) view.requestFocus() view - } else if (col == 1) { - val view = getInflatedPlusMinusView(container) + } + + 1 -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, false) + val view = viewAdapter.root var def = 0.0 if (editStartTime != null) { def = stringToDouble(editStartTime?.editText?.text.toString()) } - editStartTime = PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, -60.0, 300.0, 15.0, DecimalFormat("0"), false) - setLabelToPlusMinusView(view, getString(R.string.action_start_min)) + editStartTime = PlusMinusEditText(viewAdapter, 15.0, def, -60.0, 300.0, DecimalFormat("0"), false, getString(R.string.action_start_min)) container.addView(view) view - } else if (col == 2) { - val view = getInflatedPlusMinusView(container) + } + + 2 -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, false) + val view = viewAdapter.root var def = 0.0 if (editDuration != null) { def = stringToDouble(editDuration?.editText?.text.toString()) } - editDuration = PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 0.0, 8.0, 1.0, DecimalFormat("0"), false) - setLabelToPlusMinusView(view, getString(R.string.action_duration_h)) + editDuration = PlusMinusEditText(viewAdapter, 1.0, def, 0.0, 8.0, DecimalFormat("0"), false, getString(R.string.action_duration_h)) container.addView(view) view - } else { + } + + else -> { val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) val confirmButton = view.findViewById(R.id.confirmbutton) confirmButton.setOnClickListener { @@ -102,4 +109,4 @@ class ECarbActivity : ViewSelectorActivity() { override fun isViewFromObject(view: View, `object`: Any): Boolean = view === `object` } -} +} \ No newline at end of file diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/FillActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/FillActivity.kt index a10163e466..2525033df0 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/FillActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/FillActivity.kt @@ -10,6 +10,7 @@ import android.view.ViewGroup import android.widget.ImageView import info.nightscout.androidaps.R import info.nightscout.androidaps.events.EventWearToMobile +import info.nightscout.androidaps.interaction.utils.EditPlusMinusViewAdapter import info.nightscout.androidaps.interaction.utils.PlusMinusEditText import info.nightscout.shared.SafeParse.stringToDouble import info.nightscout.shared.weardata.EventData.ActionFillPreCheck @@ -33,19 +34,21 @@ class FillActivity : ViewSelectorActivity() { override fun getColumnCount(arg0: Int): Int = 2 override fun getRowCount(): Int = 1 - override fun instantiateItem(container: ViewGroup, row: Int, col: Int): Any { - return if (col == 0) { - val view = getInflatedPlusMinusView(container) + override fun instantiateItem(container: ViewGroup, row: Int, col: Int): View = when (col) { + 0 -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, false) + val view = viewAdapter.root var def = 0.0 if (editInsulin != null) { def = stringToDouble(editInsulin?.editText?.text.toString()) } - editInsulin = PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 0.0, 30.0, 0.1, DecimalFormat("#0.0"), false) - setLabelToPlusMinusView(view, getString(R.string.action_insulin)) + editInsulin = PlusMinusEditText(viewAdapter, def, 0.0, 30.0, 0.1, DecimalFormat("#0.0"), false, getString(R.string.action_insulin)) container.addView(view) view.requestFocus() view - } else { + } + + else -> { val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) val confirmButton = view.findViewById(R.id.confirmbutton) confirmButton.setOnClickListener { @@ -68,4 +71,4 @@ class FillActivity : ViewSelectorActivity() { override fun isViewFromObject(view: View, `object`: Any): Boolean = view === `object` } -} \ No newline at end of file +} diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ProfileSwitchActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ProfileSwitchActivity.kt index 73b9551b53..c6498f2638 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ProfileSwitchActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ProfileSwitchActivity.kt @@ -10,6 +10,7 @@ import android.view.ViewGroup import android.widget.ImageView import info.nightscout.androidaps.R import info.nightscout.androidaps.events.EventWearToMobile +import info.nightscout.androidaps.interaction.utils.EditPlusMinusViewAdapter import info.nightscout.androidaps.interaction.utils.PlusMinusEditText import info.nightscout.shared.SafeParse import info.nightscout.shared.weardata.EventData.ActionProfileSwitchPreCheck @@ -43,29 +44,34 @@ class ProfileSwitchActivity : ViewSelectorActivity() { override fun getColumnCount(arg0: Int): Int = 3 override fun getRowCount(): Int = 1 - override fun instantiateItem(container: ViewGroup, row: Int, col: Int): Any { - return if (col == 0) { - val view = getInflatedPlusMinusView(container) + override fun instantiateItem(container: ViewGroup, row: Int, col: Int): View = when (col) { + 0 -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, false) + val view = viewAdapter.root var def = timeshift.toDouble() if (editTimeshift != null) { def = SafeParse.stringToDouble(editTimeshift?.editText?.text.toString()) } - editTimeshift = PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 0.0, 23.0, 1.0, DecimalFormat("0"), true, true) - setLabelToPlusMinusView(view, getString(R.string.action_timeshift)) + editTimeshift = PlusMinusEditText(viewAdapter, def, 0.0, 23.0, 1.0, DecimalFormat("0"), true, getString(R.string.action_timeshift), true) container.addView(view) view.requestFocus() view - } else if (col == 1) { - val view = getInflatedPlusMinusView(container) + } + + 1 -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, false) + val view = viewAdapter.root var def = percentage.toDouble() if (editPercentage != null) { def = SafeParse.stringToDouble(editPercentage?.editText?.text.toString()) } - editPercentage = PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 30.0, 250.0, 1.0, DecimalFormat("0"), false) - setLabelToPlusMinusView(view, getString(R.string.action_percentage)) + editPercentage = PlusMinusEditText(viewAdapter, def, 30.0, 250.0, 1.0, DecimalFormat("0"), false, getString(R.string.action_percentage)) + container.addView(view) view - } else { + } + + else -> { val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) val confirmButton = view.findViewById(R.id.confirmbutton) confirmButton.setOnClickListener { diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.kt index cab25b52eb..26570a6bdd 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.kt @@ -10,6 +10,7 @@ import android.view.ViewGroup import android.widget.ImageView import info.nightscout.androidaps.R import info.nightscout.androidaps.events.EventWearToMobile +import info.nightscout.androidaps.interaction.utils.EditPlusMinusViewAdapter import info.nightscout.androidaps.interaction.utils.PlusMinusEditText import info.nightscout.shared.SafeParse import info.nightscout.shared.weardata.EventData.ActionTempTargetPreCheck @@ -45,49 +46,56 @@ class TempTargetActivity : ViewSelectorActivity() { return 1 } - override fun instantiateItem(container: ViewGroup, row: Int, col: Int): Any { - return if (col == 0) { - val view = getInflatedPlusMinusView(container) + override fun instantiateItem(container: ViewGroup, row: Int, col: Int): View = when { + col == 0 -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, false) + val view = viewAdapter.root time = if (time == null) { - PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, 60.0, 0.0, 24 * 60.0, 5.0, DecimalFormat("0"), false) + PlusMinusEditText(viewAdapter, 60.0, 0.0, 24 * 60.0, 5.0, DecimalFormat("0"), false, getString(R.string.action_duration)) } else { val def = SafeParse.stringToDouble(time?.editText?.text.toString()) - PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 0.0, 24 * 60.0, 5.0, DecimalFormat("0"), false) + PlusMinusEditText(viewAdapter, def, 0.0, 24 * 60.0, 5.0, DecimalFormat("0"), false, getString(R.string.action_duration)) } - setLabelToPlusMinusView(view, getString(R.string.action_duration)) container.addView(view) view.requestFocus() view - } else if (col == 1) { - val view = getInflatedPlusMinusView(container) + } + + col == 1 -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, false) + val view = viewAdapter.root + val title = if (isSingleTarget) getString(R.string.action_target) else getString(R.string.action_low) if (isMGDL) { var def = 100.0 if (lowRange != null) def = SafeParse.stringToDouble(lowRange?.editText?.text.toString()) - lowRange = PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 72.0, 180.0, 1.0, DecimalFormat("0"), false) + lowRange = PlusMinusEditText(viewAdapter, def, 72.0, 180.0, 1.0, DecimalFormat("0"), false, title) } else { var def = 5.5 if (lowRange != null) def = SafeParse.stringToDouble(lowRange?.editText?.text.toString()) - lowRange = PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 4.0, 10.0, 0.1, DecimalFormat("#0.0"), false) + lowRange = PlusMinusEditText(viewAdapter, def, 4.0, 10.0, 0.1, DecimalFormat("#0.0"), false, title) } - if (isSingleTarget) setLabelToPlusMinusView(view, getString(R.string.action_target)) - else setLabelToPlusMinusView(view, getString(R.string.action_low)) + container.addView(view) view - } else if (col == 2 && !isSingleTarget) { - val view = getInflatedPlusMinusView(container) + } + + col == 2 && !isSingleTarget -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, false) + val view = viewAdapter.root if (isMGDL) { var def = 100.0 if (highRange != null) def = SafeParse.stringToDouble(highRange?.editText?.text.toString()) - highRange = PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 72.0, 180.0, 1.0, DecimalFormat("0"), false) + highRange = PlusMinusEditText(viewAdapter, def, 72.0, 180.0, 1.0, DecimalFormat("0"), false, getString(R.string.action_high)) } else { var def = 5.5 if (highRange != null) def = SafeParse.stringToDouble(highRange?.editText?.text.toString()) - highRange = PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 4.0, 10.0, 0.1, DecimalFormat("#0.0"), false) + highRange = PlusMinusEditText(viewAdapter, def, 4.0, 10.0, 0.1, DecimalFormat("#0.0"), false, getString(R.string.action_high)) } - setLabelToPlusMinusView(view, getString(R.string.action_high)) container.addView(view) view - } else { + } + + else -> { val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) val confirmButton = view.findViewById(R.id.confirmbutton) confirmButton.setOnClickListener { @@ -119,4 +127,4 @@ class TempTargetActivity : ViewSelectorActivity() { return view === `object` } } -} \ No newline at end of file +} diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TreatmentActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TreatmentActivity.kt index 630317b89a..55805803d4 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TreatmentActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TreatmentActivity.kt @@ -10,6 +10,7 @@ import android.view.ViewGroup import android.widget.ImageView import info.nightscout.androidaps.R import info.nightscout.androidaps.events.EventWearToMobile +import info.nightscout.androidaps.interaction.utils.EditPlusMinusViewAdapter import info.nightscout.androidaps.interaction.utils.PlusMinusEditText import info.nightscout.shared.SafeParse.stringToDouble import info.nightscout.shared.SafeParse.stringToInt @@ -38,32 +39,37 @@ class TreatmentActivity : ViewSelectorActivity() { val incrementInsulin1 = (sp.getDouble(R.string.key_insulin_button_increment_1, 0.5) * 10).roundToInt() / 10.0 val incrementInsulin2 = (sp.getDouble(R.string.key_insulin_button_increment_2, 1.0) * 10).roundToInt() / 10.0 + val stepValuesInsulin = listOf(0.1, incrementInsulin1, incrementInsulin2) val incrementCarbs1 = sp.getInt(R.string.key_carbs_button_increment_1, 5).toDouble() val incrementCarbs2 = sp.getInt(R.string.key_carbs_button_increment_2, 10).toDouble() + val stepValuesCarbs = listOf(1.0, incrementCarbs1, incrementCarbs2) - override fun instantiateItem(container: ViewGroup, row: Int, col: Int): Any { - return if (col == 0) { - val view = getInflatedPlusMinusView(container, true) + override fun instantiateItem(container: ViewGroup, row: Int, col: Int): View = when (col) { + 0 -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, true) + val view = viewAdapter.root var def = 0.0 if (editInsulin != null) def = stringToDouble(editInsulin?.editText?.text.toString()) val maxBolus = sp.getDouble(getString(R.string.key_treatments_safety_max_bolus), 3.0) - val buttons = listOf(Pair(R.id.plusbutton, 0.1), Pair(R.id.plusbutton2, incrementInsulin1), Pair(R.id.plusbutton3, incrementInsulin2)) - editInsulin = PlusMinusEditText(view, R.id.amountfield, buttons, R.id.minusbutton, def, 0.0, maxBolus, 0.1, DecimalFormat("#0.0"), false) - setLabelToPlusMinusView(view, getString(R.string.action_insulin)) + editInsulin = PlusMinusEditText(viewAdapter, def, 0.0, maxBolus, stepValuesInsulin, DecimalFormat("#0.0"), false, getString(R.string.action_insulin)) container.addView(view) view.requestFocus() view - } else if (col == 1) { - val view = getInflatedPlusMinusView(container, true) + } + + 1 -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, true) + val view = viewAdapter.root var def = 0.0 val maxCarbs = sp.getInt(getString(R.string.key_treatments_safety_max_carbs), 48) if (editCarbs != null) def = stringToDouble(editCarbs?.editText?.text.toString()) - val buttons = listOf(Pair(R.id.plusbutton, 1.0), Pair(R.id.plusbutton2, incrementCarbs1), Pair(R.id.plusbutton3, incrementCarbs2)) - editCarbs = PlusMinusEditText(view, R.id.amountfield, buttons, R.id.minusbutton, def, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), false) - setLabelToPlusMinusView(view, getString(R.string.action_carbs)) + + editCarbs = PlusMinusEditText(viewAdapter, def, 0.0, maxCarbs.toDouble(), stepValuesCarbs, DecimalFormat("0"), false, getString(R.string.action_carbs)) container.addView(view) view - } else { + } + + else -> { val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) val confirmButton = view.findViewById(R.id.confirmbutton) confirmButton.setOnClickListener { diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ViewSelectorActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ViewSelectorActivity.kt index eb3a9b70d7..d1d3b19099 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ViewSelectorActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ViewSelectorActivity.kt @@ -73,22 +73,6 @@ open class ViewSelectorActivity : DaggerActivity() { } } - fun getInflatedPlusMinusView(container: ViewGroup?, mulitple: Boolean = false): View { - val layoutRight = if (mulitple) R.layout.action_editplusminus_item_quickrighty_plus else R.layout.action_editplusminus_item_quickrighty - val layoutLeft = if (mulitple) R.layout.action_editplusminus_item_quicklefty_plus else R.layout.action_editplusminus_item_quicklefty - return when (sp.getInt(R.string.key_input_design, 1)) { - 2 -> LayoutInflater.from(applicationContext).inflate(layoutRight, container, false) - 3 -> LayoutInflater.from(applicationContext).inflate(layoutLeft, container, false) - 4 -> LayoutInflater.from(applicationContext).inflate(R.layout.action_editplusminus_item_viktoria, container, false) - else -> LayoutInflater.from(applicationContext).inflate(R.layout.action_editplusminus_item, container, false) - } - } - - fun setLabelToPlusMinusView(view: View, labelText: String?) { - val textView = view.findViewById(R.id.label) - textView.text = labelText - } - fun showToast(context: Context?, text: Int) { Toast.makeText(context, getString(text), Toast.LENGTH_LONG).show() } diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.kt index dfd6e6291b..9a9bd01967 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.kt @@ -10,6 +10,7 @@ import android.view.ViewGroup import android.widget.ImageView import info.nightscout.androidaps.R import info.nightscout.androidaps.events.EventWearToMobile +import info.nightscout.androidaps.interaction.utils.EditPlusMinusViewAdapter import info.nightscout.androidaps.interaction.utils.PlusMinusEditText import info.nightscout.shared.SafeParse import info.nightscout.shared.weardata.EventData.ActionWizardPreCheck @@ -37,35 +38,39 @@ class WizardActivity : ViewSelectorActivity() { override fun getRowCount(): Int = 1 private val increment1 = sp.getInt(R.string.key_carbs_button_increment_1, 5).toDouble() private val increment2 = sp.getInt(R.string.key_carbs_button_increment_2, 10).toDouble() + val stepValues = listOf(1.0, increment1, increment2) - override fun instantiateItem(container: ViewGroup, row: Int, col: Int): Any { - return if (col == 0) { - val view = getInflatedPlusMinusView(container, true) + override fun instantiateItem(container: ViewGroup, row: Int, col: Int): View = when { + col == 0 -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, true) + val view = viewAdapter.root val maxCarbs = sp.getInt(getString(R.string.key_treatments_safety_max_carbs), 48) - val buttons = listOf(Pair(R.id.plusbutton, 1.0), Pair(R.id.plusbutton2, increment1), Pair(R.id.plusbutton3, increment2)) editCarbs = if (editCarbs == null) { - PlusMinusEditText(view, R.id.amountfield, buttons, R.id.minusbutton, 0.0, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), false) + PlusMinusEditText(viewAdapter, 0.0, 0.0, maxCarbs.toDouble(), stepValues, DecimalFormat("0"), false, getString(R.string.action_carbs)) } else { val def = SafeParse.stringToDouble(editCarbs?.editText?.text.toString()) - PlusMinusEditText(view, R.id.amountfield, buttons, R.id.minusbutton, def, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), false) + PlusMinusEditText(viewAdapter, def, 0.0, maxCarbs.toDouble(), 1.0, DecimalFormat("0"), false, getString(R.string.action_carbs)) } - setLabelToPlusMinusView(view, getString(R.string.action_carbs)) container.addView(view) view.requestFocus() view - } else if (col == 1 && hasPercentage) { - val view = getInflatedPlusMinusView(container) + } + + col == 1 && hasPercentage -> { + val viewAdapter = EditPlusMinusViewAdapter.getViewAdapter(sp, applicationContext, container, false) + val view = viewAdapter.root val percentage = sp.getInt(getString(R.string.key_bolus_wizard_percentage), 100) editPercentage = if (editPercentage == null) { - PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, percentage.toDouble(), 50.0, 150.0, 1.0, DecimalFormat("0"), false) + PlusMinusEditText(viewAdapter, percentage.toDouble(), 50.0, 150.0, 1.0, DecimalFormat("0"), false, getString(R.string.action_percentage)) } else { val def = SafeParse.stringToDouble(editPercentage?.editText?.text.toString()) - PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 50.0, 150.0, 1.0, DecimalFormat("0"), false) + PlusMinusEditText(viewAdapter, def, 50.0, 150.0, 1.0, DecimalFormat("0"), false, getString(R.string.action_percentage)) } - setLabelToPlusMinusView(view, getString(R.string.action_percentage)) container.addView(view) view - } else { + } + + else -> { val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) view.findViewById(R.id.confirmbutton) .setOnClickListener { diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt index 4b3798940b..a1de3f1e9d 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt @@ -2,10 +2,10 @@ package info.nightscout.androidaps.interaction.utils import android.content.Context import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import info.nightscout.androidaps.R import info.nightscout.androidaps.databinding.ActionEditplusminusItemBinding +import info.nightscout.androidaps.databinding.ActionEditplusminusItemPlusBinding import info.nightscout.androidaps.databinding.ActionEditplusminusItemQuickleftyPlusBinding import info.nightscout.androidaps.databinding.ActionEditplusminusItemQuickleftyBinding import info.nightscout.androidaps.databinding.ActionEditplusminusItemQuickrightyBinding @@ -14,65 +14,84 @@ import info.nightscout.androidaps.databinding.ActionEditplusminusItemViktoriaBin import info.nightscout.shared.sharedPreferences.SP /** - * NumberPickerViewAdapter binds both NumberPickerLayoutBinding and NumberPickerLayoutVerticalBinding shared attributes to one common view adapter. + * EditPlusMinusViewAdapter binds both ActionEditplusminusItemBinding variants shared attributes to one common view adapter. * Requires at least one of the ViewBinding as a parameter. Recommended to use the factory object to create the binding. */ class EditPlusMinusViewAdapter( - val eS: ActionEditplusminusItemBinding?, - val eQLP: ActionEditplusminusItemQuickleftyPlusBinding?, - val eQL: ActionEditplusminusItemQuickleftyBinding?, - val eQRP: ActionEditplusminusItemQuickleftyPlusBinding?, - val qQR: ActionEditplusminusItemQuickrightyBinding?, - val nQRP: ActionEditplusminusItemQuickrightyPlusBinding?, - val eV: ActionEditplusminusItemViktoriaBinding? + eD: ActionEditplusminusItemBinding?, + eDP: ActionEditplusminusItemPlusBinding?, + eQL: ActionEditplusminusItemQuickleftyBinding?, + eQLP: ActionEditplusminusItemQuickleftyPlusBinding?, + eQR: ActionEditplusminusItemQuickrightyBinding?, + eQRP: ActionEditplusminusItemQuickrightyPlusBinding?, + eV: ActionEditplusminusItemViktoriaBinding? ) { init { - if (eS == null && eQLP == null && eQL == null && eQRP == null && qQR == null && nQRP == null && eV == null) { + if (eD == null && eDP == null && eQL == null && eQLP == null && eQR == null && eQRP == null && eV == null) { throw IllegalArgumentException("Require at least on Binding parameter") } } - val amountField = - eS?.amountfield ?: eQLP?.amountfield ?: eQL?.amountfield ?: eQRP?.amountfield ?: qQR?.amountfield ?: nQRP?.amountfield ?: eV?.amountfield + val editText = + eD?.editText ?: eDP?.editText ?: eQL?.editText ?: eQLP?.editText ?: eQR?.editText ?: eQRP?.editText ?: eV?.editText ?: throw IllegalArgumentException("Missing require View Binding parameter display") val minusButton = - eS?.minusbutton ?: eQLP?.minusbutton ?: eQL?.minusbutton ?: eQRP?.minusbutton ?: qQR?.minusbutton ?: nQRP?.minusbutton ?: eV?.minusbutton + eD?.minusButton ?: eDP?.minusButton ?: eQL?.minusButton ?: eQLP?.minusButton ?: eQR?.minusButton ?: eQRP?.minusButton ?: eV?.minusButton ?: throw IllegalArgumentException("Missing require View Binding parameter display") - val plusButton = - eS?.plusbutton ?: eQLP?.plusbutton ?: eQL?.plusbutton ?: eQRP?.plusbutton ?: qQR?.plusbutton ?: nQRP?.plusbutton ?: eV?.plusbutton + val plusButton1 = + eD?.plusButton1 ?: eDP?.plusButton1 ?: eQL?.plusButton1 ?: eQLP?.plusButton1 ?: eQR?.plusButton1 ?: eQRP?.plusButton1 ?: eV?.plusButton1 ?: throw IllegalArgumentException("Missing require View Binding parameter display") val label = - eS?.label ?: eQLP?.label ?: eQL?.label ?: eQRP?.label ?: qQR?.label ?: nQRP?.label ?: eV?.label + eD?.label ?: eDP?.label ?: eQL?.label ?: eQLP?.label ?: eQR?.label ?: eQRP?.label ?: eV?.label ?: throw IllegalArgumentException("Missing require View Binding parameter display") - val plusButton2 = eQLP?.plusbutton2 ?: eQRP?.plusbutton2 - val plusButton3 = eQLP?.plusbutton3 ?: eQRP?.plusbutton3 + val plusButton2 = eDP?.plusButton2 ?: eQLP?.plusButton2 ?: eQRP?.plusButton2 + val plusButton3 = eDP?.plusButton3 ?: eQLP?.plusButton3 ?: eQRP?.plusButton3 val root = - eS?.root ?: eQLP?.root ?: eQL?.root ?: eQRP?.root ?: qQR?.root ?: nQRP?.root ?: eV?.root + eD?.root ?: eDP?.root ?: eQL?.root ?: eQLP?.root ?: eQR?.root ?: eQRP?.root ?: eV?.root ?: throw IllegalArgumentException("Missing require View Binding parameter display") companion object { - fun getInflatedPlusMinusView(sp: SP, context: Context, container: ViewGroup?, mulitple: Boolean = false): EditPlusMinusViewAdapter { + fun getViewAdapter(sp: SP, context: Context, container: ViewGroup?, multiple: Boolean = false): EditPlusMinusViewAdapter { val inflater = LayoutInflater.from(context) - val bindLayout = ActionEditplusminusItemBinding.inflate(inflater, container, false) - val binding = EditPlusMinusViewAdapter(bindLayout, null, null, null, null, null, null) - return binding - // val layoutRight = if (mulitple) R.layout.action_editplusminus_item_quickrighty_plus else R.layout.action_editplusminus_item_quickrighty - // val layoutLeft = if (mulitple) R.layout.action_editplusminus_item_quicklefty_plus else R.layout.action_editplusminus_item_quicklefty - // return when (sp.getInt(R.string.key_input_design, 1)) { - // 2 -> LayoutInflater.from(applicationContext).inflate(layoutRight, container, false) - // 3 -> LayoutInflater.from(applicationContext).inflate(layoutLeft, container, false) - // 4 -> LayoutInflater.from(applicationContext).inflate(R.layout.action_editplusminus_item_viktoria, container, false) - // else -> LayoutInflater.from(applicationContext).inflate(R.layout.action_editplusminus_item, container, false) - // } + + return when (sp.getInt(R.string.key_input_design, 1)) { + 2 -> { + if (multiple) { + val bindLayout = ActionEditplusminusItemQuickrightyPlusBinding.inflate(inflater, container, false) + EditPlusMinusViewAdapter(null, null, null, null, null, bindLayout, null) + } else { + val bindLayout = ActionEditplusminusItemQuickrightyBinding.inflate(inflater, container, false) + EditPlusMinusViewAdapter(null, null, null, null, bindLayout, null, null) + } + } + + 3 -> { + if (multiple) { + val bindLayout = ActionEditplusminusItemQuickleftyPlusBinding.inflate(inflater, container, false) + EditPlusMinusViewAdapter(null, null, null, bindLayout, null, null, null) + } else { + val bindLayout = ActionEditplusminusItemQuickleftyBinding.inflate(inflater, container, false) + EditPlusMinusViewAdapter(null, null, bindLayout, null, null, null, null) + } + } + + 4 -> { + val bindLayout = ActionEditplusminusItemViktoriaBinding.inflate(inflater, container, false) + EditPlusMinusViewAdapter(null, null, null, null, null, null, bindLayout) + } + + else -> { + if (multiple) { + val bindLayout = ActionEditplusminusItemPlusBinding.inflate(inflater, container, false) + EditPlusMinusViewAdapter(null, bindLayout, null, null, null, null, null) + } else { + val bindLayout = ActionEditplusminusItemBinding.inflate(inflater, container, false) + EditPlusMinusViewAdapter(bindLayout, null, null, null, null, null, null) + } + } + } } - // fun getBinding(bindLayout: NumberPickerLayoutBinding): NumberPickerViewAdapter { - // return NumberPickerViewAdapter(bindLayout, null) - // } - // - // fun getBinding(bindLayout: NumberPickerLayoutVerticalBinding): NumberPickerViewAdapter { - // return NumberPickerViewAdapter(null, bindLayout) - // } } -} \ No newline at end of file +} diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt index f812b7e245..2430c9e677 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt @@ -9,7 +9,6 @@ import android.view.View import android.view.View.OnGenericMotionListener import android.view.View.OnTouchListener import android.widget.TextView -import androidx.appcompat.widget.AppCompatButton import androidx.core.view.InputDeviceCompat import androidx.core.view.MotionEventCompat import java.text.DecimalFormat @@ -17,47 +16,38 @@ import java.text.NumberFormat import java.util.concurrent.Executors import java.util.concurrent.ScheduledExecutorService import java.util.concurrent.TimeUnit -import kotlin.Pair /** * Created by mike on 28.06.2016. */ @SuppressLint("SetTextI18n") class PlusMinusEditText @JvmOverloads constructor( - view: View, - editTextID: Int, - private var plusButtons: List>, - minusID: Int, + private val binding: EditPlusMinusViewAdapter, initValue: Double, private val minValue: Double, private val maxValue: Double, - private val stepGeneral: Double, + private val stepValues: List, private val formatter: NumberFormat, private val allowZero: Boolean, + label: String, private val roundRobin: Boolean = false, ) : View.OnKeyListener, OnTouchListener, View.OnClickListener, OnGenericMotionListener { constructor( - view: View, - editTextID: Int, - plusID: Int, - minusID: Int, + binding: EditPlusMinusViewAdapter, initValue: Double, minValue: Double, maxValue: Double, - stepGeneral: Double, + step: Double, formatter: NumberFormat, allowZero: Boolean, + label: String, roundRobin: Boolean = false - ) : this(view, editTextID, listOf(Pair(plusID, stepGeneral)), minusID, initValue, minValue, maxValue, stepGeneral, formatter, allowZero, roundRobin) + ) : this(binding, initValue, minValue, maxValue, listOf(step), formatter, allowZero, label, roundRobin) + private val stepGeneral: Double = stepValues[0] var editText: TextView private set - private var minusImage: View - private var plusImage1: View - private var plusImage2: AppCompatButton? = null - private var plusImage3: AppCompatButton? = null private var value: Double - private val context: Context private var mChangeCounter = 0 private var mLastChange: Long = 0 private val mHandler: Handler @@ -70,11 +60,11 @@ import kotlin.Pair override fun run() { val msg = Message() val doubleLimit = 5 - val multipleButtons = mInc && (plusImage2 != null || plusImage3 != null) + val multipleButtons = mInc && (binding.plusButton2 != null || binding.plusButton3 != null) if (!multipleButtons && repeated % doubleLimit == 0) multiplier *= 2 val bundle = Bundle() - bundle.putDouble("step", step) - bundle.putInt("multiplier", multiplier) + bundle.putDouble(STEP, step) + bundle.putInt(MULTIPLIER, multiplier) msg.data = bundle if (mInc) { @@ -114,14 +104,14 @@ import kotlin.Pair if (vibrate) vibrateDevice() } - fun vibrateDevice() { + private fun vibrateDevice() { val vibrator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { val vibratorManager = - context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager + binding.root.context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager vibratorManager.defaultVibrator } else { @Suppress("DEPRECATION") - context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator + binding.root.context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -155,19 +145,19 @@ import kotlin.Pair private fun getStep(v: View): Double { return when (v) { - plusImage1 -> plusButtons[0].second - plusImage2 -> plusButtons[1].second - plusImage3 -> plusButtons[2].second - else -> stepGeneral + binding.plusButton1 -> stepValues[0] + binding.plusButton2 -> stepValues[1] + binding.plusButton3 -> stepValues[2] + else -> stepValues[0] } } private fun isIncrement(v: View): Boolean { return when (v) { - plusImage1 -> true - plusImage2 -> true - plusImage3 -> true - else -> false + binding.plusButton1 -> true + binding.plusButton2 -> true + binding.plusButton3 -> true + else -> false } } @@ -229,30 +219,22 @@ import kotlin.Pair private const val THRESHOLD_TIME = 100 private const val MSG_INC = 0 private const val MSG_DEC = 1 + private const val STEP = "step" + private const val MULTIPLIER = "multiplier" } init { - context = view.context - editText = view.findViewById(editTextID) - minusImage = view.findViewById(minusID) - plusImage1 = view.findViewById(plusButtons.first().first) + editText = binding.editText + binding.label.text = label val format = DecimalFormat("#.#") - plusButtons.getOrNull(1)?.let { - plusImage2 = view.findViewById(it.first) - plusImage2?.text = "+${format.format(it.second).replaceFirst("^0+(?!$)".toRegex(), "")}" - plusImage2?.visibility = View.VISIBLE - } - plusButtons.getOrNull(2)?.let { - plusImage3 = view.findViewById(it.first) - plusImage3?.text = "+${format.format(it.second).replaceFirst("^0+(?!$)".toRegex(), "")}" - plusImage3?.visibility = View.VISIBLE - } + binding.plusButton2?.text = "+${format.format(stepValues[1]).replaceFirst("^0+(?!$)".toRegex(), "")}" + binding.plusButton3?.text = "+${format.format(stepValues[2]).replaceFirst("^0+(?!$)".toRegex(), "")}" value = initValue mHandler = object : Handler(Looper.getMainLooper()) { override fun handleMessage(msg: Message) { - val multiplier = msg.data.getInt("multiplier") - val step = msg.data.getDouble("step") + val multiplier = msg.data.getInt(MULTIPLIER) + val step = msg.data.getDouble(STEP) when (msg.what) { MSG_INC -> { @@ -271,18 +253,18 @@ import kotlin.Pair editText.showSoftInputOnFocus = false editText.setTextIsSelectable(false) - minusImage.setOnTouchListener(this) - minusImage.setOnKeyListener(this) - minusImage.setOnClickListener(this) - plusImage1.setOnTouchListener(this) - plusImage1.setOnKeyListener(this) - plusImage1.setOnClickListener(this) - plusImage2?.setOnTouchListener(this) - plusImage2?.setOnKeyListener(this) - plusImage2?.setOnClickListener(this) - plusImage3?.setOnTouchListener(this) - plusImage3?.setOnKeyListener(this) - plusImage3?.setOnClickListener(this) + binding.minusButton.setOnTouchListener(this) + binding.minusButton.setOnKeyListener(this) + binding.minusButton.setOnClickListener(this) + binding.plusButton1.setOnTouchListener(this) + binding.plusButton1.setOnKeyListener(this) + binding.plusButton1.setOnClickListener(this) + binding.plusButton2?.setOnTouchListener(this) + binding.plusButton2?.setOnKeyListener(this) + binding.plusButton2?.setOnClickListener(this) + binding.plusButton3?.setOnTouchListener(this) + binding.plusButton3?.setOnKeyListener(this) + binding.plusButton3?.setOnClickListener(this) editText.setOnGenericMotionListener(this) updateEditText() } diff --git a/wear/src/main/res/layout/action_editplusminus_item.xml b/wear/src/main/res/layout/action_editplusminus_item.xml index 5c5b8856d5..75c3b21594 100644 --- a/wear/src/main/res/layout/action_editplusminus_item.xml +++ b/wear/src/main/res/layout/action_editplusminus_item.xml @@ -1,67 +1,131 @@ - + android:layout_height="match_parent"> - + + + + + + + android:tint="@color/white" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintCircle="@+id/center" + app:layout_constraintCircleAngle="145" + app:layout_constraintCircleRadius="70dp" + app:layout_constraintLeft_toLeftOf="parent" /> - + + + + + android:layout_marginBottom="8dp" + android:background="@drawable/circle" + android:backgroundTint="@color/gray_700" + android:contentDescription="@string/increment" + app:layout_constraintBottom_toTopOf="@+id/minus_button" + app:layout_constraintCircle="@+id/center" + app:layout_constraintCircleAngle="55" + app:layout_constraintCircleRadius="40dp" + app:layout_constraintRight_toLeftOf="@id/plus_button1"> - - - - - + + android:tint="@color/white" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintCircle="@+id/center" + app:layout_constraintCircleAngle="215" + app:layout_constraintCircleRadius="70dp" + app:layout_constraintRight_toRightOf="parent" /> - + diff --git a/wear/src/main/res/layout/action_editplusminus_item_plus.xml b/wear/src/main/res/layout/action_editplusminus_item_plus.xml new file mode 100644 index 0000000000..18ea44cc13 --- /dev/null +++ b/wear/src/main/res/layout/action_editplusminus_item_plus.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/wear/src/main/res/layout/action_editplusminus_item_quicklefty.xml b/wear/src/main/res/layout/action_editplusminus_item_quicklefty.xml index d96ae1d26f..d857446caa 100644 --- a/wear/src/main/res/layout/action_editplusminus_item_quicklefty.xml +++ b/wear/src/main/res/layout/action_editplusminus_item_quicklefty.xml @@ -14,38 +14,11 @@ android:layout_marginEnd="-8dp" android:orientation="vertical"> - - - - - - + android:importantForAccessibility="no" + app:layout_constraintBottom_toTopOf="@+id/minus_button" + app:layout_constraintDimensionRatio="1:1" + app:layout_constraintLeft_toRightOf="@+id/plus_button3" + app:layout_constraintTop_toTopOf="@+id/plus_button3" /> diff --git a/wear/src/main/res/layout/action_editplusminus_item_quickrighty.xml b/wear/src/main/res/layout/action_editplusminus_item_quickrighty.xml index 7e3ae3dcb1..d2e7950a05 100644 --- a/wear/src/main/res/layout/action_editplusminus_item_quickrighty.xml +++ b/wear/src/main/res/layout/action_editplusminus_item_quickrighty.xml @@ -15,7 +15,7 @@ android:orientation="vertical"> - - - - + android:importantForAccessibility="no" - + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> Date: Tue, 28 Jun 2022 09:49:39 +0200 Subject: [PATCH 022/154] chore: align plus min item --- .../utils/EditPlusMinusViewAdapter.kt | 4 +- .../interaction/utils/PlusMinusEditText.kt | 6 +- .../res/layout/action_editplusminus_item.xml | 156 ++++++------------ .../layout/action_editplusminus_item_plus.xml | 13 +- .../action_editplusminus_item_quicklefty.xml | 2 +- ...ion_editplusminus_item_quicklefty_plus.xml | 33 ++-- .../action_editplusminus_item_quickrighty.xml | 2 +- ...on_editplusminus_item_quickrighty_plus.xml | 18 +- .../action_editplusminus_item_viktoria.xml | 6 +- 9 files changed, 86 insertions(+), 154 deletions(-) diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt index a1de3f1e9d..81c343db74 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt @@ -36,8 +36,8 @@ class EditPlusMinusViewAdapter( val editText = eD?.editText ?: eDP?.editText ?: eQL?.editText ?: eQLP?.editText ?: eQR?.editText ?: eQRP?.editText ?: eV?.editText ?: throw IllegalArgumentException("Missing require View Binding parameter display") - val minusButton = - eD?.minusButton ?: eDP?.minusButton ?: eQL?.minusButton ?: eQLP?.minusButton ?: eQR?.minusButton ?: eQRP?.minusButton ?: eV?.minusButton + val minButton = + eD?.minButton ?: eDP?.minButton ?: eQL?.minButton ?: eQLP?.minButton ?: eQR?.minButton ?: eQRP?.minButton ?: eV?.minButton ?: throw IllegalArgumentException("Missing require View Binding parameter display") val plusButton1 = eD?.plusButton1 ?: eDP?.plusButton1 ?: eQL?.plusButton1 ?: eQLP?.plusButton1 ?: eQR?.plusButton1 ?: eQRP?.plusButton1 ?: eV?.plusButton1 diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt index 2430c9e677..f3af7a89eb 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt @@ -253,9 +253,9 @@ import java.util.concurrent.TimeUnit editText.showSoftInputOnFocus = false editText.setTextIsSelectable(false) - binding.minusButton.setOnTouchListener(this) - binding.minusButton.setOnKeyListener(this) - binding.minusButton.setOnClickListener(this) + binding.minButton.setOnTouchListener(this) + binding.minButton.setOnKeyListener(this) + binding.minButton.setOnClickListener(this) binding.plusButton1.setOnTouchListener(this) binding.plusButton1.setOnKeyListener(this) binding.plusButton1.setOnClickListener(this) diff --git a/wear/src/main/res/layout/action_editplusminus_item.xml b/wear/src/main/res/layout/action_editplusminus_item.xml index 75c3b21594..5360d811dd 100644 --- a/wear/src/main/res/layout/action_editplusminus_item.xml +++ b/wear/src/main/res/layout/action_editplusminus_item.xml @@ -1,131 +1,67 @@ - - - - - - - + android:layout_height="match_parent" + android:layout_gravity="center" + android:gravity="center" + android:orientation="horizontal"> + android:tint="@color/white" /> - - - - - + android:orientation="vertical"> - + + + + + + android:tint="@color/white" /> - + diff --git a/wear/src/main/res/layout/action_editplusminus_item_plus.xml b/wear/src/main/res/layout/action_editplusminus_item_plus.xml index 18ea44cc13..2cbf3a620c 100644 --- a/wear/src/main/res/layout/action_editplusminus_item_plus.xml +++ b/wear/src/main/res/layout/action_editplusminus_item_plus.xml @@ -18,13 +18,13 @@ android:id="@+id/edit_text" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="-6dp" android:layout_marginHorizontal="10dp" + android:layout_marginTop="-6dp" android:cursorVisible="false" + android:gravity="center" android:inputType="numberDecimal" android:textColor="@color/white" android:textSize="40sp" - android:gravity="center" app:layout_constraintEnd_toEndOf="@+id/value_background" app:layout_constraintStart_toStartOf="@+id/value_background" app:layout_constraintTop_toTopOf="@+id/value_background" @@ -34,8 +34,8 @@ android:id="@+id/label" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="-10dp" android:layout_below="@+id/edit_text" + android:layout_marginTop="-10dp" android:gravity="center" android:labelFor="@+id/edit_text" android:textColor="@color/white" @@ -47,7 +47,7 @@ tools:text="label" /> - @@ -89,26 +89,25 @@ android:textSize="30sp" app:layout_constraintBottom_toTopOf="@+id/plus_button1" app:layout_constraintCircle="@+id/center" - app:layout_constraintCircleAngle="270" - app:layout_constraintCircleRadius="65dp" + app:layout_constraintCircleAngle="90" + app:layout_constraintCircleRadius="70dp" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/plus_button3" tools:text="+5" /> + app:layout_constraintBottom_toTopOf="@+id/min_button" + app:layout_constraintCircle="@+id/center" + app:layout_constraintCircleAngle="305" + app:layout_constraintCircleRadius="40dp" + app:layout_constraintRight_toLeftOf="@id/plus_button1" /> diff --git a/wear/src/main/res/layout/action_editplusminus_item_quickrighty.xml b/wear/src/main/res/layout/action_editplusminus_item_quickrighty.xml index d2e7950a05..16daa2e8c6 100644 --- a/wear/src/main/res/layout/action_editplusminus_item_quickrighty.xml +++ b/wear/src/main/res/layout/action_editplusminus_item_quickrighty.xml @@ -42,7 +42,7 @@ tools:text="label" /> + android:background="@drawable/circle" + android:backgroundTint="@color/gray_700" + android:contentDescription="@string/increment" + app:layout_constraintBottom_toTopOf="@+id/min_button" + app:layout_constraintCircle="@+id/center" + app:layout_constraintCircleAngle="305" + app:layout_constraintCircleRadius="40dp" + app:layout_constraintRight_toLeftOf="@id/plus_button1" /> + tools:text="label" /> - - From f0076ed0dd1fa3ce0c3242ebbc6be8b75be49d11 Mon Sep 17 00:00:00 2001 From: Andries Smit Date: Tue, 28 Jun 2022 10:06:05 +0200 Subject: [PATCH 023/154] chore: wear rename editplusmin layouts --- .../utils/EditPlusMinusViewAdapter.kt | 42 +++++++++---------- ...sminus_item.xml => action_editplusmin.xml} | 0 ..._plus.xml => action_editplusmin_multi.xml} | 0 ....xml => action_editplusmin_quicklefty.xml} | 0 ...> action_editplusmin_quicklefty_multi.xml} | 4 +- ...xml => action_editplusmin_quickrighty.xml} | 0 ... action_editplusmin_quickrighty_multi.xml} | 2 +- ...ia.xml => action_editplusmin_viktoria.xml} | 0 8 files changed, 24 insertions(+), 24 deletions(-) rename wear/src/main/res/layout/{action_editplusminus_item.xml => action_editplusmin.xml} (100%) rename wear/src/main/res/layout/{action_editplusminus_item_plus.xml => action_editplusmin_multi.xml} (100%) rename wear/src/main/res/layout/{action_editplusminus_item_quicklefty.xml => action_editplusmin_quicklefty.xml} (100%) rename wear/src/main/res/layout/{action_editplusminus_item_quicklefty_plus.xml => action_editplusmin_quicklefty_multi.xml} (98%) rename wear/src/main/res/layout/{action_editplusminus_item_quickrighty.xml => action_editplusmin_quickrighty.xml} (100%) rename wear/src/main/res/layout/{action_editplusminus_item_quickrighty_plus.xml => action_editplusmin_quickrighty_multi.xml} (99%) rename wear/src/main/res/layout/{action_editplusminus_item_viktoria.xml => action_editplusmin_viktoria.xml} (100%) diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt index 81c343db74..df13d69b8a 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt @@ -4,13 +4,13 @@ import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup import info.nightscout.androidaps.R -import info.nightscout.androidaps.databinding.ActionEditplusminusItemBinding -import info.nightscout.androidaps.databinding.ActionEditplusminusItemPlusBinding -import info.nightscout.androidaps.databinding.ActionEditplusminusItemQuickleftyPlusBinding -import info.nightscout.androidaps.databinding.ActionEditplusminusItemQuickleftyBinding -import info.nightscout.androidaps.databinding.ActionEditplusminusItemQuickrightyBinding -import info.nightscout.androidaps.databinding.ActionEditplusminusItemQuickrightyPlusBinding -import info.nightscout.androidaps.databinding.ActionEditplusminusItemViktoriaBinding +import info.nightscout.androidaps.databinding.ActionEditplusminBinding +import info.nightscout.androidaps.databinding.ActionEditplusminMultiBinding +import info.nightscout.androidaps.databinding.ActionEditplusminQuickleftyMultiBinding +import info.nightscout.androidaps.databinding.ActionEditplusminQuickleftyBinding +import info.nightscout.androidaps.databinding.ActionEditplusminQuickrightyBinding +import info.nightscout.androidaps.databinding.ActionEditplusminQuickrightyMultiBinding +import info.nightscout.androidaps.databinding.ActionEditplusminViktoriaBinding import info.nightscout.shared.sharedPreferences.SP /** @@ -18,13 +18,13 @@ import info.nightscout.shared.sharedPreferences.SP * Requires at least one of the ViewBinding as a parameter. Recommended to use the factory object to create the binding. */ class EditPlusMinusViewAdapter( - eD: ActionEditplusminusItemBinding?, - eDP: ActionEditplusminusItemPlusBinding?, - eQL: ActionEditplusminusItemQuickleftyBinding?, - eQLP: ActionEditplusminusItemQuickleftyPlusBinding?, - eQR: ActionEditplusminusItemQuickrightyBinding?, - eQRP: ActionEditplusminusItemQuickrightyPlusBinding?, - eV: ActionEditplusminusItemViktoriaBinding? + eD: ActionEditplusminBinding?, + eDP: ActionEditplusminMultiBinding?, + eQL: ActionEditplusminQuickleftyBinding?, + eQLP: ActionEditplusminQuickleftyMultiBinding?, + eQR: ActionEditplusminQuickrightyBinding?, + eQRP: ActionEditplusminQuickrightyMultiBinding?, + eV: ActionEditplusminViktoriaBinding? ) { init { @@ -59,35 +59,35 @@ class EditPlusMinusViewAdapter( return when (sp.getInt(R.string.key_input_design, 1)) { 2 -> { if (multiple) { - val bindLayout = ActionEditplusminusItemQuickrightyPlusBinding.inflate(inflater, container, false) + val bindLayout = ActionEditplusminQuickrightyMultiBinding.inflate(inflater, container, false) EditPlusMinusViewAdapter(null, null, null, null, null, bindLayout, null) } else { - val bindLayout = ActionEditplusminusItemQuickrightyBinding.inflate(inflater, container, false) + val bindLayout = ActionEditplusminQuickrightyBinding.inflate(inflater, container, false) EditPlusMinusViewAdapter(null, null, null, null, bindLayout, null, null) } } 3 -> { if (multiple) { - val bindLayout = ActionEditplusminusItemQuickleftyPlusBinding.inflate(inflater, container, false) + val bindLayout = ActionEditplusminQuickleftyMultiBinding.inflate(inflater, container, false) EditPlusMinusViewAdapter(null, null, null, bindLayout, null, null, null) } else { - val bindLayout = ActionEditplusminusItemQuickleftyBinding.inflate(inflater, container, false) + val bindLayout = ActionEditplusminQuickleftyBinding.inflate(inflater, container, false) EditPlusMinusViewAdapter(null, null, bindLayout, null, null, null, null) } } 4 -> { - val bindLayout = ActionEditplusminusItemViktoriaBinding.inflate(inflater, container, false) + val bindLayout = ActionEditplusminViktoriaBinding.inflate(inflater, container, false) EditPlusMinusViewAdapter(null, null, null, null, null, null, bindLayout) } else -> { if (multiple) { - val bindLayout = ActionEditplusminusItemPlusBinding.inflate(inflater, container, false) + val bindLayout = ActionEditplusminMultiBinding.inflate(inflater, container, false) EditPlusMinusViewAdapter(null, bindLayout, null, null, null, null, null) } else { - val bindLayout = ActionEditplusminusItemBinding.inflate(inflater, container, false) + val bindLayout = ActionEditplusminBinding.inflate(inflater, container, false) EditPlusMinusViewAdapter(bindLayout, null, null, null, null, null, null) } } diff --git a/wear/src/main/res/layout/action_editplusminus_item.xml b/wear/src/main/res/layout/action_editplusmin.xml similarity index 100% rename from wear/src/main/res/layout/action_editplusminus_item.xml rename to wear/src/main/res/layout/action_editplusmin.xml diff --git a/wear/src/main/res/layout/action_editplusminus_item_plus.xml b/wear/src/main/res/layout/action_editplusmin_multi.xml similarity index 100% rename from wear/src/main/res/layout/action_editplusminus_item_plus.xml rename to wear/src/main/res/layout/action_editplusmin_multi.xml diff --git a/wear/src/main/res/layout/action_editplusminus_item_quicklefty.xml b/wear/src/main/res/layout/action_editplusmin_quicklefty.xml similarity index 100% rename from wear/src/main/res/layout/action_editplusminus_item_quicklefty.xml rename to wear/src/main/res/layout/action_editplusmin_quicklefty.xml diff --git a/wear/src/main/res/layout/action_editplusminus_item_quicklefty_plus.xml b/wear/src/main/res/layout/action_editplusmin_quicklefty_multi.xml similarity index 98% rename from wear/src/main/res/layout/action_editplusminus_item_quicklefty_plus.xml rename to wear/src/main/res/layout/action_editplusmin_quicklefty_multi.xml index 121be927ac..5a4e9b10cb 100644 --- a/wear/src/main/res/layout/action_editplusminus_item_quicklefty_plus.xml +++ b/wear/src/main/res/layout/action_editplusmin_quicklefty_multi.xml @@ -35,7 +35,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/edit_text" - android:layout_marginTop="-8dp" + android:layout_marginTop="-9dp" android:gravity="center" android:labelFor="@+id/edit_text" android:textColor="@color/white" @@ -44,7 +44,7 @@ app:layout_constraintStart_toStartOf="@+id/edit_text" app:layout_constraintTop_toBottomOf="@id/edit_text" tools:ignore="LabelFor" - tools:text="label" /> + tools:text="label123" /> Date: Tue, 28 Jun 2022 10:58:45 +0200 Subject: [PATCH 024/154] chore: fix code smells --- .../wear/wearintegration/DataHandlerMobile.kt | 8 ++++---- .../info/nightscout/shared/weardata/EventData.kt | 8 ++++---- .../androidaps/comm/DataHandlerWear.kt | 8 ++++---- .../interaction/actions/TempTargetActivity.kt | 1 - .../utils/EditPlusMinusViewAdapter.kt | 16 ++++++++-------- .../interaction/utils/PlusMinusEditText.kt | 7 ++----- 6 files changed, 22 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt index 25017bfa3b..4ddbd962cd 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt @@ -697,10 +697,10 @@ class DataHandlerMobile @Inject constructor( bolusPercentage = sp.getInt(R.string.key_boluswizard_percentage, 100), maxCarbs = sp.getInt(R.string.key_treatmentssafety_maxcarbs, 48), maxBolus = sp.getDouble(R.string.key_treatmentssafety_maxbolus, 3.0), - insulin_button_increment_1 = sp.getDouble(R.string.key_insulin_button_increment_1, InsulinDialog.PLUS1_DEFAULT), - insulin_button_increment_2 = sp.getDouble(R.string.key_insulin_button_increment_2, InsulinDialog.PLUS2_DEFAULT), - carbs_button_increment_1 = sp.getInt(R.string.key_carbs_button_increment_1, CarbsDialog.FAV1_DEFAULT), - carbs_button_increment_2 = sp.getInt(R.string.key_carbs_button_increment_2, CarbsDialog.FAV2_DEFAULT) + insulinButtonIncrement1 = sp.getDouble(R.string.key_insulin_button_increment_1, InsulinDialog.PLUS1_DEFAULT), + insulinButtonIncrement2 = sp.getDouble(R.string.key_insulin_button_increment_2, InsulinDialog.PLUS2_DEFAULT), + carbsButtonIncrement1 = sp.getInt(R.string.key_carbs_button_increment_1, CarbsDialog.FAV1_DEFAULT), + carbsButtonIncrement2 = sp.getInt(R.string.key_carbs_button_increment_2, CarbsDialog.FAV2_DEFAULT) ) ) ) diff --git a/shared/src/main/java/info/nightscout/shared/weardata/EventData.kt b/shared/src/main/java/info/nightscout/shared/weardata/EventData.kt index bd0d06711b..b0fe71d4aa 100644 --- a/shared/src/main/java/info/nightscout/shared/weardata/EventData.kt +++ b/shared/src/main/java/info/nightscout/shared/weardata/EventData.kt @@ -209,10 +209,10 @@ sealed class EventData : Event() { val bolusPercentage: Int, val maxCarbs: Int, val maxBolus: Double, - val insulin_button_increment_1: Double, - val insulin_button_increment_2: Double, - val carbs_button_increment_1: Int, - val carbs_button_increment_2: Int + val insulinButtonIncrement1: Double, + val insulinButtonIncrement2: Double, + val carbsButtonIncrement1: Int, + val carbsButtonIncrement2: Int ) : EventData() @Serializable diff --git a/wear/src/main/java/info/nightscout/androidaps/comm/DataHandlerWear.kt b/wear/src/main/java/info/nightscout/androidaps/comm/DataHandlerWear.kt index 3a05c06cf0..321ccefeeb 100644 --- a/wear/src/main/java/info/nightscout/androidaps/comm/DataHandlerWear.kt +++ b/wear/src/main/java/info/nightscout/androidaps/comm/DataHandlerWear.kt @@ -162,10 +162,10 @@ class DataHandlerWear @Inject constructor( sp.putInt(R.string.key_bolus_wizard_percentage, it.bolusPercentage) sp.putInt(R.string.key_treatments_safety_max_carbs, it.maxCarbs) sp.putDouble(R.string.key_treatments_safety_max_bolus, it.maxBolus) - sp.putDouble(R.string.key_insulin_button_increment_1, it.insulin_button_increment_1) - sp.putDouble(R.string.key_insulin_button_increment_2, it.insulin_button_increment_2) - sp.putInt(R.string.key_carbs_button_increment_1, it.carbs_button_increment_1) - sp.putInt(R.string.key_carbs_button_increment_2, it.carbs_button_increment_2) + sp.putDouble(R.string.key_insulin_button_increment_1, it.insulinButtonIncrement1) + sp.putDouble(R.string.key_insulin_button_increment_2, it.insulinButtonIncrement2) + sp.putInt(R.string.key_carbs_button_increment_1, it.carbsButtonIncrement1) + sp.putInt(R.string.key_carbs_button_increment_2, it.carbsButtonIncrement2) } disposable += rxBus .toObservable(EventData.QuickWizard::class.java) diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.kt index 26570a6bdd..80180d850a 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.kt @@ -74,7 +74,6 @@ class TempTargetActivity : ViewSelectorActivity() { if (lowRange != null) def = SafeParse.stringToDouble(lowRange?.editText?.text.toString()) lowRange = PlusMinusEditText(viewAdapter, def, 4.0, 10.0, 0.1, DecimalFormat("#0.0"), false, title) } - container.addView(view) view } diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt index df13d69b8a..4bb22f95e4 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/EditPlusMinusViewAdapter.kt @@ -14,7 +14,7 @@ import info.nightscout.androidaps.databinding.ActionEditplusminViktoriaBinding import info.nightscout.shared.sharedPreferences.SP /** - * EditPlusMinusViewAdapter binds both ActionEditplusminusItemBinding variants shared attributes to one common view adapter. + * EditPlusMinusViewAdapter binds both ActionEditplusminBinding variants shared attributes to one common view adapter. * Requires at least one of the ViewBinding as a parameter. Recommended to use the factory object to create the binding. */ class EditPlusMinusViewAdapter( @@ -32,28 +32,28 @@ class EditPlusMinusViewAdapter( throw IllegalArgumentException("Require at least on Binding parameter") } } - + private val errorMessage = "Missing require View Binding parameter" val editText = eD?.editText ?: eDP?.editText ?: eQL?.editText ?: eQLP?.editText ?: eQR?.editText ?: eQRP?.editText ?: eV?.editText - ?: throw IllegalArgumentException("Missing require View Binding parameter display") + ?: throw IllegalArgumentException(errorMessage) val minButton = eD?.minButton ?: eDP?.minButton ?: eQL?.minButton ?: eQLP?.minButton ?: eQR?.minButton ?: eQRP?.minButton ?: eV?.minButton - ?: throw IllegalArgumentException("Missing require View Binding parameter display") + ?: throw IllegalArgumentException(errorMessage) val plusButton1 = eD?.plusButton1 ?: eDP?.plusButton1 ?: eQL?.plusButton1 ?: eQLP?.plusButton1 ?: eQR?.plusButton1 ?: eQRP?.plusButton1 ?: eV?.plusButton1 - ?: throw IllegalArgumentException("Missing require View Binding parameter display") + ?: throw IllegalArgumentException(errorMessage) val label = eD?.label ?: eDP?.label ?: eQL?.label ?: eQLP?.label ?: eQR?.label ?: eQRP?.label ?: eV?.label - ?: throw IllegalArgumentException("Missing require View Binding parameter display") + ?: throw IllegalArgumentException(errorMessage) val plusButton2 = eDP?.plusButton2 ?: eQLP?.plusButton2 ?: eQRP?.plusButton2 val plusButton3 = eDP?.plusButton3 ?: eQLP?.plusButton3 ?: eQRP?.plusButton3 val root = eD?.root ?: eDP?.root ?: eQL?.root ?: eQLP?.root ?: eQR?.root ?: eQRP?.root ?: eV?.root - ?: throw IllegalArgumentException("Missing require View Binding parameter display") + ?: throw IllegalArgumentException(errorMessage) companion object { - fun getViewAdapter(sp: SP, context: Context, container: ViewGroup?, multiple: Boolean = false): EditPlusMinusViewAdapter { + fun getViewAdapter(sp: SP, context: Context, container: ViewGroup, multiple: Boolean = false): EditPlusMinusViewAdapter { val inflater = LayoutInflater.from(context) return when (sp.getInt(R.string.key_input_design, 1)) { diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt index f3af7a89eb..d6933c1a13 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/PlusMinusEditText.kt @@ -1,6 +1,5 @@ package info.nightscout.androidaps.interaction.utils -import android.annotation.SuppressLint import android.content.Context import android.os.* import android.view.KeyEvent @@ -20,7 +19,7 @@ import java.util.concurrent.TimeUnit /** * Created by mike on 28.06.2016. */ -@SuppressLint("SetTextI18n") class PlusMinusEditText @JvmOverloads constructor( +class PlusMinusEditText @JvmOverloads constructor( private val binding: EditPlusMinusViewAdapter, initValue: Double, private val minValue: Double, @@ -106,9 +105,7 @@ import java.util.concurrent.TimeUnit private fun vibrateDevice() { val vibrator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - val vibratorManager = - binding.root.context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager - vibratorManager.defaultVibrator + (binding.root.context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager).defaultVibrator } else { @Suppress("DEPRECATION") binding.root.context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator From 951b33ded7741aa2c7fd5d47a23eddcd93f3d62e Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 28 Jun 2022 11:25:14 +0200 Subject: [PATCH 025/154] Autotune: resolve NPE --- .../activities/MyPreferenceFragment.kt | 2 +- .../general/autotune/AutotuneFragment.kt | 101 ++++++++++-------- .../general/nsclient/NSClientFragment.kt | 28 +++++ 3 files changed, 83 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt b/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt index ccd6b6f484..c0f577d427 100644 --- a/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt @@ -350,7 +350,7 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang } } if (pref is EditTextPreference) { - if (pref.getKey().contains("password") || pref.getKey().contains("pin") || pref.getKey().contains("secret")) { + if (pref.getKey().contains("password") || pref.getKey().contains("pin") || pref.getKey().contains("secret") || pref.getKey().contains("token")) { pref.setSummary("******") } else if (pref.text != null) { pref.dialogMessage = pref.dialogMessage diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneFragment.kt index 2b467cb500..b0f3303c4e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneFragment.kt @@ -18,37 +18,37 @@ import dagger.android.HasAndroidInjector import dagger.android.support.DaggerFragment import info.nightscout.androidaps.Constants import info.nightscout.androidaps.R +import info.nightscout.androidaps.data.LocalInsulin +import info.nightscout.androidaps.data.ProfileSealed +import info.nightscout.androidaps.database.entities.UserEntry +import info.nightscout.androidaps.database.entities.ValueWithUnit import info.nightscout.androidaps.databinding.AutotuneFragmentBinding import info.nightscout.androidaps.dialogs.ProfileViewerDialog +import info.nightscout.androidaps.extensions.runOnUiThread +import info.nightscout.androidaps.extensions.toVisibility +import info.nightscout.androidaps.interfaces.* +import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.plugins.general.autotune.data.ATProfile import info.nightscout.androidaps.plugins.general.autotune.events.EventAutotuneUpdateGui import info.nightscout.androidaps.plugins.profile.local.LocalProfilePlugin import info.nightscout.androidaps.plugins.profile.local.events.EventLocalProfileChanged -import info.nightscout.androidaps.data.LocalInsulin -import info.nightscout.androidaps.data.ProfileSealed -import info.nightscout.androidaps.database.entities.UserEntry -import info.nightscout.androidaps.database.entities.ValueWithUnit -import info.nightscout.androidaps.extensions.runOnUiThread -import info.nightscout.androidaps.interfaces.* -import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.MidnightTime import info.nightscout.androidaps.utils.Round import info.nightscout.androidaps.utils.alertDialogs.OKDialog.showConfirmation +import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.shared.SafeParse import info.nightscout.shared.sharedPreferences.SP -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign import org.json.JSONObject -//import org.slf4j.LoggerFactory import java.text.DecimalFormat -import java.util.* import javax.inject.Inject class AutotuneFragment : DaggerFragment() { + @Inject lateinit var profileFunction: ProfileFunction @Inject lateinit var autotunePlugin: AutotunePlugin @Inject lateinit var autotuneFS: AutotuneFS @@ -61,13 +61,16 @@ class AutotuneFragment : DaggerFragment() { @Inject lateinit var rh: ResourceHelper @Inject lateinit var rxBus: RxBus @Inject lateinit var injector: HasAndroidInjector + @Inject lateinit var aapsSchedulers: AapsSchedulers private var disposable: CompositeDisposable = CompositeDisposable() + //private val log = LoggerFactory.getLogger(AutotunePlugin::class.java) private var _binding: AutotuneFragmentBinding? = null private lateinit var profileStore: ProfileStore private var profileName = "" - private lateinit var profile: ATProfile + private var profile: ATProfile? = null + // This property is only valid between onCreateView and // onDestroyView. private val binding get() = _binding!! @@ -88,12 +91,13 @@ class AutotuneFragment : DaggerFragment() { profileStore = activePlugin.activeProfileSource.profile ?: ProfileStore(injector, JSONObject(), dateUtil) profileName = if (binding.profileList.text.toString() == rh.gs(R.string.active)) "" else binding.profileList.text.toString() profileFunction.getProfile()?.let { currentProfile -> - profile = ATProfile(profileStore.getSpecificProfile(profileName)?.let { ProfileSealed.Pure(it) } ?:currentProfile, LocalInsulin(""), injector) + profile = ATProfile(profileStore.getSpecificProfile(profileName)?.let { ProfileSealed.Pure(it) } ?: currentProfile, LocalInsulin(""), injector) } binding.tuneDays.setParams( savedInstanceState?.getDouble("tunedays") - ?: defaultValue, 1.0, 30.0, 1.0, DecimalFormat("0"), false, null, textWatcher) + ?: defaultValue, 1.0, 30.0, 1.0, DecimalFormat("0"), false, null, textWatcher + ) binding.autotuneRun.setOnClickListener { val daysBack = SafeParse.stringToInt(binding.tuneDays.text) autotunePlugin.calculationRunning = true @@ -105,11 +109,10 @@ class AutotuneFragment : DaggerFragment() { updateGui() } binding.profileList.onItemClickListener = AdapterView.OnItemClickListener { _, _, _, _ -> - if (!autotunePlugin.calculationRunning) - { + if (!autotunePlugin.calculationRunning) { profileName = if (binding.profileList.text.toString() == rh.gs(R.string.active)) "" else binding.profileList.text.toString() profileFunction.getProfile()?.let { currentProfile -> - profile = ATProfile(profileStore.getSpecificProfile(profileName)?.let { ProfileSealed.Pure(it) } ?:currentProfile, LocalInsulin(""), injector) + profile = ATProfile(profileStore.getSpecificProfile(profileName)?.let { ProfileSealed.Pure(it) } ?: currentProfile, LocalInsulin(""), injector) } autotunePlugin.selectedProfile = profileName resetParam() @@ -120,7 +123,7 @@ class AutotuneFragment : DaggerFragment() { binding.autotuneCopylocal.setOnClickListener { val localName = rh.gs(R.string.autotune_tunedprofile_name) + " " + dateUtil.dateAndTimeString(autotunePlugin.lastRun) val circadian = sp.getBoolean(R.string.key_autotune_circadian_ic_isf, false) - autotunePlugin.tunedProfile?.let { tunedProfile -> + autotunePlugin.tunedProfile?.let { tunedProfile -> showConfirmation(requireContext(), rh.gs(R.string.autotune_copy_localprofile_button), rh.gs(R.string.autotune_copy_local_profile_message) + "\n" + localName + " " + dateUtil.dateAndTimeString(autotunePlugin.lastRun), @@ -204,13 +207,13 @@ class AutotuneFragment : DaggerFragment() { binding.autotuneCompare.setOnClickListener { val pumpProfile = autotunePlugin.pumpProfile val circadian = sp.getBoolean(R.string.key_autotune_circadian_ic_isf, false) - val tunedprofile = if (circadian) autotunePlugin.tunedProfile?.circadianProfile else autotunePlugin.tunedProfile?.profile + val tunedProfile = if (circadian) autotunePlugin.tunedProfile?.circadianProfile else autotunePlugin.tunedProfile?.profile ProfileViewerDialog().also { pvd -> pvd.arguments = Bundle().also { it.putLong("time", dateUtil.now()) it.putInt("mode", ProfileViewerDialog.Mode.PROFILE_COMPARE.ordinal) it.putString("customProfile", pumpProfile.profile.toPureNsJson(dateUtil).toString()) - it.putString("customProfile2", tunedprofile?.toPureNsJson(dateUtil).toString()) + it.putString("customProfile2", tunedProfile?.toPureNsJson(dateUtil).toString()) it.putString("customProfileUnits", profileFunction.getUnits().asText) it.putString("customProfileName", pumpProfile.profilename + "\n" + rh.gs(R.string.autotune_tunedprofile_name)) } @@ -270,10 +273,8 @@ class AutotuneFragment : DaggerFragment() { super.onResume() disposable += rxBus .toObservable(EventAutotuneUpdateGui::class.java) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - updateGui() - }, { fabricPrivacy.logException(it) }) + .observeOn(aapsSchedulers.main) + .subscribe({ updateGui() }, fabricPrivacy::logException) checkNewDay() updateGui() } @@ -291,7 +292,7 @@ class AutotuneFragment : DaggerFragment() { profileStore = activePlugin.activeProfileSource.profile ?: ProfileStore(injector, JSONObject(), dateUtil) profileName = if (binding.profileList.text.toString() == rh.gs(R.string.active)) "" else binding.profileList.text.toString() profileFunction.getProfile()?.let { currentProfile -> - profile = ATProfile(profileStore.getSpecificProfile(profileName)?.let { ProfileSealed.Pure(it) } ?:currentProfile, LocalInsulin(""), injector) + profile = ATProfile(profileStore.getSpecificProfile(profileName)?.let { ProfileSealed.Pure(it) } ?: currentProfile, LocalInsulin(""), injector) } val profileList: ArrayList = profileStore.getProfileList() profileList.add(0, rh.gs(R.string.active)) @@ -315,17 +316,18 @@ class AutotuneFragment : DaggerFragment() { autotunePlugin.calculationRunning -> { binding.tuneWarning.text = rh.gs(R.string.autotune_warning_during_run) } + autotunePlugin.lastRunSuccess -> { - binding.autotuneCopylocal.visibility = View.VISIBLE - binding.autotuneUpdateProfile.visibility = autotunePlugin.updateButtonVisibility - binding.autotuneRevertProfile.visibility = if (autotunePlugin.updateButtonVisibility == View.VISIBLE) View.GONE else View.VISIBLE - binding.autotuneProfileswitch.visibility = View.VISIBLE - binding.tuneWarning.text = rh.gs(R.string.autotune_warning_after_run) + binding.autotuneCopylocal.visibility = View.VISIBLE + binding.autotuneUpdateProfile.visibility = autotunePlugin.updateButtonVisibility + binding.autotuneRevertProfile.visibility = if (autotunePlugin.updateButtonVisibility == View.VISIBLE) View.GONE else View.VISIBLE + binding.autotuneProfileswitch.visibility = View.VISIBLE + binding.tuneWarning.text = rh.gs(R.string.autotune_warning_after_run) binding.autotuneCompare.visibility = View.VISIBLE } + else -> { - if (profile.isValid) - binding.autotuneRun.visibility = View.VISIBLE + binding.autotuneRun.visibility = (profile?.isValid == true).toVisibility() binding.autotuneCheckInputProfile.visibility = View.VISIBLE } } @@ -335,10 +337,9 @@ class AutotuneFragment : DaggerFragment() { private fun checkNewDay() { val runToday = autotunePlugin.lastRun > MidnightTime.calc(dateUtil.now() - autotunePlugin.autotuneStartHour * 3600 * 1000L) + autotunePlugin.autotuneStartHour * 3600 * 1000L - if (runToday && autotunePlugin.result != "") - { + if (runToday && autotunePlugin.result != "") { binding.tuneWarning.text = rh.gs(R.string.autotune_warning_after_run) - } else if (!runToday || autotunePlugin.result.isEmpty()) { //if new day reinit result, default days, warning and button's visibility + } else if (!runToday || autotunePlugin.result.isEmpty()) { //if new day re-init result, default days, warning and button's visibility resetParam(!runToday) } } @@ -348,17 +349,18 @@ class AutotuneFragment : DaggerFragment() { var nl = "" if (profileFunction.getProfile() == null) { warning = rh.gs(R.string.profileswitch_ismissing) - return warning + return warning } profileFunction.getProfile()?.let { currentProfile -> - profile = ATProfile(profileStore.getSpecificProfile(profileName)?.let { ProfileSealed.Pure(it) } ?:currentProfile, LocalInsulin(""), injector) - if (!profile.isValid) return rh.gs(R.string.autotune_profile_invalid) - if (profile.icSize > 1) { - warning += nl + rh.gs(R.string.autotune_ic_warning, profile.icSize, profile.ic) - nl = "\n" - } - if (profile.isfSize > 1) { - warning += nl + rh.gs(R.string.autotune_isf_warning, profile.isfSize, Profile.fromMgdlToUnits(profile.isf, profileFunction.getUnits()), profileFunction.getUnits().asText) + profile = ATProfile(profileStore.getSpecificProfile(profileName)?.let { ProfileSealed.Pure(it) } ?: currentProfile, LocalInsulin(""), injector).also { profile -> + if (!profile.isValid) return rh.gs(R.string.autotune_profile_invalid) + if (profile.icSize > 1) { + warning += nl + rh.gs(R.string.autotune_ic_warning, profile.icSize, profile.ic) + nl = "\n" + } + if (profile.isfSize > 1) { + warning += nl + rh.gs(R.string.autotune_isf_warning, profile.isfSize, Profile.fromMgdlToUnits(profile.isf, profileFunction.getUnits()), profileFunction.getUnits().asText) + } } } return warning @@ -376,7 +378,10 @@ class AutotuneFragment : DaggerFragment() { } private val textWatcher = object : TextWatcher { - override fun afterTextChanged(s: Editable) { updateGui() } + override fun afterTextChanged(s: Editable) { + updateGui() + } + override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { if (binding.tuneDays.text.isNotEmpty()) { @@ -387,7 +392,9 @@ class AutotuneFragment : DaggerFragment() { autotunePlugin.lastNbDays = binding.tuneDays.text resetParam(false) } - } catch (e:Exception) { } + } catch (e: Exception) { + fabricPrivacy.logException(e) + } } } } @@ -469,7 +476,7 @@ class AutotuneFragment : DaggerFragment() { } } - private fun toTableRowHeader(basal:Boolean = false): TableRow = + private fun toTableRowHeader(basal: Boolean = false): TableRow = TableRow(context).also { header -> val lp = TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT).apply { weight = 1f } header.layoutParams = TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT).apply { gravity = Gravity.CENTER_HORIZONTAL } @@ -500,7 +507,7 @@ class AutotuneFragment : DaggerFragment() { }) } - private fun toTableRowValue(hour: String, inputValue: Double, tunedValue: Double, format:String = "%.3f", missing: String = ""): TableRow = + private fun toTableRowValue(hour: String, inputValue: Double, tunedValue: Double, format: String = "%.3f", missing: String = ""): TableRow = TableRow(context).also { row -> val percentValue = Round.roundTo(tunedValue / inputValue * 100 - 100, 1.0).toInt().toString() + "%" val lp = TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT).apply { weight = 1f } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientFragment.kt index 43061ed25f..a8049910f8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientFragment.kt @@ -17,9 +17,15 @@ import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientU import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.alertDialogs.OKDialog import info.nightscout.androidaps.utils.rx.AapsSchedulers +import info.nightscout.sdk.NSAndroidClient +import info.nightscout.shared.logging.AAPSLogger import info.nightscout.shared.sharedPreferences.SP import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch import javax.inject.Inject class NSClientFragment : DaggerFragment() { @@ -32,6 +38,7 @@ class NSClientFragment : DaggerFragment() { @Inject lateinit var aapsSchedulers: AapsSchedulers @Inject lateinit var dataSyncSelector: DataSyncSelector @Inject lateinit var uel: UserEntryLogger + @Inject lateinit var aapsLogger: AAPSLogger companion object { @@ -39,6 +46,7 @@ class NSClientFragment : DaggerFragment() { const val ID_MENU_RESTART = 7 const val ID_MENU_SEND_NOW = 8 const val ID_MENU_FULL_SYNC = 9 + const val ID_MENU_STATUS = 10 } private val disposable = CompositeDisposable() @@ -80,6 +88,7 @@ class NSClientFragment : DaggerFragment() { menu.add(Menu.FIRST, ID_MENU_RESTART, 0, rh.gs(R.string.restart)).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) menu.add(Menu.FIRST, ID_MENU_SEND_NOW, 0, rh.gs(R.string.deliver_now)).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) menu.add(Menu.FIRST, ID_MENU_FULL_SYNC, 0, rh.gs(R.string.full_sync)).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) + menu.add(Menu.FIRST, ID_MENU_STATUS, 0, "TEST STATUS").setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) menu.setGroupDividerEnabled(true) } } @@ -111,6 +120,25 @@ class NSClientFragment : DaggerFragment() { true } + ID_MENU_STATUS -> { + context?.let { context -> + val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) + scope.launch { + val client = NSAndroidClient( + baseUrl = sp.getString(R.string.key_nsclientinternal_url, "").lowercase().replace("https://", ""), + accessToken = sp.getString(R.string.key_nsclient_token, ""), + context = context, + logging = true + ) + val status = client.getStatus() + aapsLogger.debug(status.toString()) + val svgs = client.getSgvs() + aapsLogger.debug(svgs.toString()) + } + } + true + } + else -> false } From b223dfbaf023df2a8cc2182bd1393274642b7e02 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 28 Jun 2022 18:07:59 +0200 Subject: [PATCH 026/154] fix NSClientFragment --- .../general/nsclient/NSClientFragment.kt | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientFragment.kt index a8049910f8..43061ed25f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientFragment.kt @@ -17,15 +17,9 @@ import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientU import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.alertDialogs.OKDialog import info.nightscout.androidaps.utils.rx.AapsSchedulers -import info.nightscout.sdk.NSAndroidClient -import info.nightscout.shared.logging.AAPSLogger import info.nightscout.shared.sharedPreferences.SP import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.launch import javax.inject.Inject class NSClientFragment : DaggerFragment() { @@ -38,7 +32,6 @@ class NSClientFragment : DaggerFragment() { @Inject lateinit var aapsSchedulers: AapsSchedulers @Inject lateinit var dataSyncSelector: DataSyncSelector @Inject lateinit var uel: UserEntryLogger - @Inject lateinit var aapsLogger: AAPSLogger companion object { @@ -46,7 +39,6 @@ class NSClientFragment : DaggerFragment() { const val ID_MENU_RESTART = 7 const val ID_MENU_SEND_NOW = 8 const val ID_MENU_FULL_SYNC = 9 - const val ID_MENU_STATUS = 10 } private val disposable = CompositeDisposable() @@ -88,7 +80,6 @@ class NSClientFragment : DaggerFragment() { menu.add(Menu.FIRST, ID_MENU_RESTART, 0, rh.gs(R.string.restart)).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) menu.add(Menu.FIRST, ID_MENU_SEND_NOW, 0, rh.gs(R.string.deliver_now)).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) menu.add(Menu.FIRST, ID_MENU_FULL_SYNC, 0, rh.gs(R.string.full_sync)).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) - menu.add(Menu.FIRST, ID_MENU_STATUS, 0, "TEST STATUS").setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) menu.setGroupDividerEnabled(true) } } @@ -120,25 +111,6 @@ class NSClientFragment : DaggerFragment() { true } - ID_MENU_STATUS -> { - context?.let { context -> - val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) - scope.launch { - val client = NSAndroidClient( - baseUrl = sp.getString(R.string.key_nsclientinternal_url, "").lowercase().replace("https://", ""), - accessToken = sp.getString(R.string.key_nsclient_token, ""), - context = context, - logging = true - ) - val status = client.getStatus() - aapsLogger.debug(status.toString()) - val svgs = client.getSgvs() - aapsLogger.debug(svgs.toString()) - } - } - true - } - else -> false } From 6a83642c2e9cbfd05df1859475d6c549e211e309 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 27 Jun 2022 21:59:40 +0200 Subject: [PATCH 027/154] cleanup & turn on looging in tests --- app/build.gradle | 6 - .../plugins/general/autotune/AutotuneIob.kt | 32 ++-- .../androidaps/TestBaseWithProfile.kt | 4 +- .../general/autotune/AutotuneCoreTest.kt | 68 ++++----- .../general/autotune/AutotunePrepTest.kt | 138 +++++++++--------- .../general/autotune/PreppedGlucoseTest.kt | 47 +++--- core/test_dependencies.gradle | 7 + 7 files changed, 158 insertions(+), 144 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 132de499a8..6d46474f35 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -97,12 +97,6 @@ def allCommitted = { -> return stringBuilder.toString().isEmpty() } -tasks.matching { it instanceof Test }.all { - testLogging.events = ["failed", "skipped", "started"] - // testLogging.events = ["failed", "skipped", "started", "standard_out"] use to display stdout in travis - testLogging.exceptionFormat = "full" -} - android { namespace 'info.nightscout.androidaps' diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneIob.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneIob.kt index c12909848c..bac89d9f9e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneIob.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneIob.kt @@ -2,31 +2,31 @@ package info.nightscout.androidaps.plugins.general.autotune import info.nightscout.androidaps.Constants import info.nightscout.androidaps.R -import info.nightscout.androidaps.data.* +import info.nightscout.androidaps.data.IobTotal +import info.nightscout.androidaps.data.LocalInsulin import info.nightscout.androidaps.database.AppRepository import info.nightscout.androidaps.database.embedments.InterfaceIDs -import info.nightscout.androidaps.interfaces.ActivePlugin -import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.androidaps.database.entities.* import info.nightscout.androidaps.extensions.durationInMinutes import info.nightscout.androidaps.extensions.iobCalc import info.nightscout.androidaps.extensions.toJson import info.nightscout.androidaps.extensions.toTemporaryBasal +import info.nightscout.androidaps.interfaces.ActivePlugin import info.nightscout.androidaps.interfaces.Profile +import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.androidaps.plugins.general.autotune.data.ATProfile import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.Round import info.nightscout.androidaps.utils.T import info.nightscout.shared.logging.AAPSLogger +import info.nightscout.shared.logging.LTag import info.nightscout.shared.sharedPreferences.SP import org.json.JSONArray import org.json.JSONObject -import org.slf4j.LoggerFactory import java.util.* import javax.inject.Inject import javax.inject.Singleton import kotlin.math.ceil -import kotlin.math.roundToInt @Singleton open class AutotuneIob @Inject constructor( @@ -59,24 +59,24 @@ open class AutotuneIob @Inject constructor( initializeTreatmentData(from - range(), to) initializeTempBasalData(from - range(), to, tunedProfile) initializeExtendedBolusData(from - range(), to, tunedProfile) - Collections.sort(tempBasals) { o1: TemporaryBasal, o2: TemporaryBasal -> (o2.timestamp - o1.timestamp).toInt() } + tempBasals.sortWith { o1: TemporaryBasal, o2: TemporaryBasal -> (o2.timestamp - o1.timestamp).toInt() } // Without Neutral TBR, Autotune Web will ignore iob for periods without TBR running addNeutralTempBasal(from - range(), to, tunedProfile) - Collections.sort(nsTreatments) { o1: NsTreatment, o2: NsTreatment -> (o2.date - o1.date).toInt() } - Collections.sort(boluses) { o1: Bolus, o2: Bolus -> (o2.timestamp - o1.timestamp).toInt() } - log.debug("D/AutotunePlugin: Nb Treatments: " + nsTreatments.size + " Nb meals: " + meals.size) + nsTreatments.sortWith { o1: NsTreatment, o2: NsTreatment -> (o2.date - o1.date).toInt() } + this.boluses.sortWith { o1: Bolus, o2: Bolus -> (o2.timestamp - o1.timestamp).toInt() } + aapsLogger.debug(LTag.AUTOTUNE, "Nb Treatments: " + nsTreatments.size + " Nb meals: " + meals.size) } private fun initializeBgreadings(from: Long, to: Long) { - glucose = repository.compatGetBgReadingsDataFromTime(from, to, false).blockingGet(); + glucose = repository.compatGetBgReadingsDataFromTime(from, to, false).blockingGet() } //nsTreatment is used only for export data, meals is used in AutotunePrep private fun initializeTreatmentData(from: Long, to: Long) { - val oldestBgDate = if (glucose.size > 0) glucose[glucose.size - 1].timestamp else from - log.debug("AutotunePlugin Check BG date: BG Size: " + glucose.size + " OldestBG: " + dateUtil.dateAndTimeAndSecondsString(oldestBgDate) + " to: " + dateUtil.dateAndTimeAndSecondsString(to)) + val oldestBgDate = if (glucose.isNotEmpty()) glucose[glucose.size - 1].timestamp else from + aapsLogger.debug(LTag.AUTOTUNE, "Check BG date: BG Size: " + glucose.size + " OldestBG: " + dateUtil.dateAndTimeAndSecondsString(oldestBgDate) + " to: " + dateUtil.dateAndTimeAndSecondsString(to)) val tmpCarbs = repository.getCarbsDataFromTimeToTimeExpanded(from, to, false).blockingGet() - log.debug("AutotunePlugin Nb treatments after query: " + tmpCarbs.size) + aapsLogger.debug(LTag.AUTOTUNE, "Nb treatments after query: " + tmpCarbs.size) meals.clear() boluses.clear() var nbCarbs = 0 @@ -217,7 +217,7 @@ open class AutotuneIob @Inject constructor( tempBasals.add(newtb) nsTreatments.add(NsTreatment(newtb)) splittedTimestamp += durationFilled - splittedDuration = splittedDuration - durationFilled + splittedDuration -= durationFilled val profile = profileFunction.getProfile(newtb.timestamp) ?:continue boluses.addAll(convertToBoluses(newtb, profile, tunedProfile.profile)) // required for correct iob calculation with oref0 algo } @@ -377,8 +377,4 @@ open class AutotuneIob @Inject constructor( private fun log(message: String) { autotuneFS.atLog("[iob] $message") } - - companion object { - private val log = LoggerFactory.getLogger(AutotunePlugin::class.java) - } } \ No newline at end of file diff --git a/app/src/test/java/info/nightscout/androidaps/TestBaseWithProfile.kt b/app/src/test/java/info/nightscout/androidaps/TestBaseWithProfile.kt index fb7412a3f3..0eb177fb7c 100644 --- a/app/src/test/java/info/nightscout/androidaps/TestBaseWithProfile.kt +++ b/app/src/test/java/info/nightscout/androidaps/TestBaseWithProfile.kt @@ -23,6 +23,7 @@ import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyString import org.mockito.Mock import org.mockito.Mockito +import org.mockito.Mockito.`when` import org.mockito.invocation.InvocationOnMock @Suppress("SpellCheckingInspection") @@ -52,7 +53,8 @@ open class TestBaseWithProfile : TestBase() { validProfileJSON = "{\"dia\":\"5\",\"carbratio\":[{\"time\":\"00:00\",\"value\":\"30\"}],\"carbs_hr\":\"20\",\"delay\":\"20\",\"sens\":[{\"time\":\"00:00\",\"value\":\"3\"}," + "{\"time\":\"2:00\",\"value\":\"3.4\"}],\"timezone\":\"UTC\",\"basal\":[{\"time\":\"00:00\",\"value\":\"1\"}],\"target_low\":[{\"time\":\"00:00\",\"value\":\"4.5\"}]," + "\"target_high\":[{\"time\":\"00:00\",\"value\":\"7\"}],\"startDate\":\"1970-01-01T00:00:00.000Z\",\"units\":\"mmol\"}" - dateUtil = DateUtil(context) + dateUtil = Mockito.spy(DateUtil(context)) + `when`(dateUtil.now()).thenReturn(1656358822000) validProfile = ProfileSealed.Pure(pureProfileFromJson(JSONObject(validProfileJSON), dateUtil)!!) effectiveProfileSwitch = EffectiveProfileSwitch( timestamp = dateUtil.now(), diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneCoreTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneCoreTest.kt index 2eb422e717..afdb10994a 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneCoreTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotuneCoreTest.kt @@ -25,71 +25,74 @@ import java.io.File import java.util.* class AutotuneCoreTest : TestBaseWithProfile() { + @Mock lateinit var sp: SP @Mock lateinit var autotuneFS: AutotuneFS @Mock lateinit var injector: HasAndroidInjector @Mock lateinit var activePlugin: ActivePlugin - lateinit var autotuneCore: AutotuneCore - var min5mCarbImpact = 0.0 - var autotuneMin = 0.0 - var autotuneMax = 0.0 + private lateinit var autotuneCore: AutotuneCore + private var min5mCarbImpact = 0.0 + private var autotuneMin = 0.0 + private var autotuneMax = 0.0 - @Before + @Before fun initData() { - autotuneCore = AutotuneCore(sp,autotuneFS) + autotuneCore = AutotuneCore(sp, autotuneFS) TimeZone.setDefault(TimeZone.getTimeZone("GMT+2")) } + @Suppress("SpellCheckingInspection") @Test - fun autotuneCoreTest1() { // Test if AutotuneCore with input files of OpenAPS categorisation gives correct ouput profile - val prepjson = File("src/test/res/autotune/test1/autotune.2022-05-21.json").readText() + fun autotuneCoreTest1() { // Test if AutotuneCore with input files of OpenAPS categorisation gives correct output profile + val prepJson = File("src/test/res/autotune/test1/autotune.2022-05-21.json").readText() val inputProfileJson = File("src/test/res/autotune/test1/profile.pump.json").readText() val inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! - val prep = PreppedGlucose(JSONObject(prepjson), dateUtil) + val prep = PreppedGlucose(JSONObject(prepJson), dateUtil) `when`(sp.getDouble(R.string.key_openapsama_autosens_max, 1.2)).thenReturn(autotuneMax) `when`(sp.getDouble(R.string.key_openapsama_autosens_min, 0.7)).thenReturn(autotuneMin) `when`(sp.getDouble(R.string.key_openapsama_min_5m_carbimpact, 3.0)).thenReturn(min5mCarbImpact) - val OapsOutputProfileJson = File("src/test/res/autotune/test1/aapsorefprofile.json").readText() - val OapsOutputProfile = atProfileFromOapsJson(JSONObject(OapsOutputProfileJson),dateUtil) + val oapsOutputProfileJson = File("src/test/res/autotune/test1/aapsorefprofile.json").readText() + val oapsOutputProfile = atProfileFromOapsJson(JSONObject(oapsOutputProfileJson), dateUtil) val outProfile = autotuneCore.tuneAllTheThings(prep, inputProfile, inputProfile) - OapsOutputProfile?.let { - Assert.assertEquals(OapsOutputProfile.isf, outProfile.isf, 0.0) - Assert.assertEquals(OapsOutputProfile.ic, outProfile.ic, 0.0) + oapsOutputProfile?.let { + Assert.assertEquals(oapsOutputProfile.isf, outProfile.isf, 0.0) + Assert.assertEquals(oapsOutputProfile.ic, outProfile.ic, 0.0) for (i in 0..23) - Assert.assertEquals(OapsOutputProfile.basal[i], outProfile.basal[i], 0.0) + Assert.assertEquals(oapsOutputProfile.basal[i], outProfile.basal[i], 0.0) } - ?:Assert.fail() + ?: Assert.fail() } + @Suppress("SpellCheckingInspection") @Test fun autotuneCoreTest4() { // Test if limiting modification with Min Max Autosens parameter works (18h on basal and on ISF value) - val prepjson = File("src/test/res/autotune/test4/autotune.2022-05-30.json").readText() + val prepJson = File("src/test/res/autotune/test4/autotune.2022-05-30.json").readText() val inputProfileJson = File("src/test/res/autotune/test4/profile.2022-05-30.json").readText() val inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! val pumpProfileJson = File("src/test/res/autotune/test4/profile.pump.json").readText() val pumpProfile = atProfileFromOapsJson(JSONObject(pumpProfileJson), dateUtil)!! - val prep = PreppedGlucose(JSONObject(prepjson), dateUtil) + val prep = PreppedGlucose(JSONObject(prepJson), dateUtil) `when`(sp.getDouble(R.string.key_openapsama_autosens_max, 1.2)).thenReturn(autotuneMax) `when`(sp.getDouble(R.string.key_openapsama_autosens_min, 0.7)).thenReturn(autotuneMin) `when`(sp.getDouble(R.string.key_openapsama_min_5m_carbimpact, 3.0)).thenReturn(min5mCarbImpact) - val OapsOutputProfileJson = File("src/test/res/autotune/test4/newprofile.2022-05-30.json").readText() - val OapsOutputProfile = atProfileFromOapsJson(JSONObject(OapsOutputProfileJson),dateUtil) + val oapsOutputProfileJson = File("src/test/res/autotune/test4/newprofile.2022-05-30.json").readText() + val oapsOutputProfile = atProfileFromOapsJson(JSONObject(oapsOutputProfileJson), dateUtil) val outProfile = autotuneCore.tuneAllTheThings(prep, inputProfile, pumpProfile) - OapsOutputProfile?.let { - Assert.assertEquals(OapsOutputProfile.isf, outProfile.isf, 0.0) - Assert.assertEquals(OapsOutputProfile.ic, outProfile.ic, 0.0) + oapsOutputProfile?.let { + Assert.assertEquals(oapsOutputProfile.isf, outProfile.isf, 0.0) + Assert.assertEquals(oapsOutputProfile.ic, outProfile.ic, 0.0) for (i in 0..23) - Assert.assertEquals(OapsOutputProfile.basal[i], outProfile.basal[i], 0.0) + Assert.assertEquals(oapsOutputProfile.basal[i], outProfile.basal[i], 0.0) } - ?:Assert.fail() + ?: Assert.fail() } - /** * OpenAPS profile for Autotune only have one ISF value and one IC value */ - fun atProfileFromOapsJson(jsonObject: JSONObject, dateUtil: DateUtil, defaultUnits: String? = null): ATProfile? { + @Suppress("SpellCheckingInspection") + private fun atProfileFromOapsJson(jsonObject: JSONObject, dateUtil: DateUtil, defaultUnits: String? = null): ATProfile? { try { min5mCarbImpact = JsonHelper.safeGetDoubleAllowNull(jsonObject, "min_5m_carbimpact") ?: return null autotuneMin = JsonHelper.safeGetDoubleAllowNull(jsonObject, "autosens_min") ?: return null @@ -104,13 +107,13 @@ class AutotuneCoreTest : TestBaseWithProfile() { val isfBlocks = ArrayList(1).also { val isfJsonArray = isfJson.getJSONArray("sensitivities") val value = isfJsonArray.getJSONObject(0).getDouble("sensitivity") - it.add(0,Block((T.hours(24).secs()) * 1000L, value)) + it.add(0, Block((T.hours(24).secs()) * 1000L, value)) } val icBlocks = ArrayList(1).also { val value = jsonObject.getDouble("carb_ratio") - it.add(0,Block((T.hours(24).secs()) * 1000L, value)) + it.add(0, Block((T.hours(24).secs()) * 1000L, value)) } - val basalBlocks = blockFromJsonArray(jsonObject.getJSONArray("basalprofile"), dateUtil) + val basalBlocks = blockFromJsonArray(jsonObject.getJSONArray("basalprofile")) ?: return null val targetBlocks = ArrayList(1).also { it.add(0, TargetBlock((T.hours(24).secs()) * 1000L, 100.0, 100.0)) @@ -126,14 +129,13 @@ class AutotuneCoreTest : TestBaseWithProfile() { timeZone = timezone, dia = dia ) - return ATProfile(ProfileSealed.Pure(pure), localInsulin, profileInjector).also { it.dateUtil = dateUtil} + return ATProfile(ProfileSealed.Pure(pure), localInsulin, profileInjector).also { it.dateUtil = dateUtil } } catch (ignored: Exception) { return null } } - - fun blockFromJsonArray(jsonArray: JSONArray?, dateUtil: DateUtil): List? { + private fun blockFromJsonArray(jsonArray: JSONArray?): List? { val size = jsonArray?.length() ?: return null val ret = ArrayList(size) try { diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt index 9ac1c3272f..f7fb47cecb 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt @@ -29,20 +29,20 @@ import org.mockito.Mock import org.mockito.Mockito.`when` import java.io.File import java.util.* -import kotlin.collections.ArrayList class AutotunePrepTest : TestBaseWithProfile() { + @Mock lateinit var sp: SP @Mock lateinit var autotuneFS: AutotuneFS @Mock lateinit var injector: HasAndroidInjector @Mock lateinit var activePlugin: ActivePlugin @Mock lateinit var repository: AppRepository - lateinit var autotunePrep: AutotunePrep - lateinit var autotuneIob: TestAutotuneIob - var min5mCarbImpact = 0.0 - var autotuneMin = 0.0 - var autotuneMax = 0.0 - var startDayTime = 0L + private lateinit var autotunePrep: AutotunePrep + private lateinit var autotuneIob: TestAutotuneIob + private var min5mCarbImpact = 0.0 + private var autotuneMin = 0.0 + private var autotuneMax = 0.0 + private var startDayTime = 0L @Before fun initData() { @@ -52,17 +52,17 @@ class AutotunePrepTest : TestBaseWithProfile() { @Test fun autotunePrepTest1() { // Test if categorisation with standard treatments with carbs is Ok val inputIobJson = File("src/test/res/autotune/test1/oaps-iobCalc.2022-05-21.json").readText() //json files build with iob/activity calculated by OAPS - val iobOapsCalcul = buildIobOaps(JSONArray(inputIobJson)) - autotuneIob = TestAutotuneIob(aapsLogger, repository, profileFunction, sp, dateUtil, activePlugin, autotuneFS, iobOapsCalcul) + val iobOapsCalculation = buildIobOaps(JSONArray(inputIobJson)) + autotuneIob = TestAutotuneIob(aapsLogger, repository, profileFunction, sp, dateUtil, activePlugin, autotuneFS, iobOapsCalculation) autotunePrep = AutotunePrep(sp, dateUtil, autotuneFS, autotuneIob) val inputProfileJson = File("src/test/res/autotune/test1/profile.pump.json").readText() val inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! - val prepjson = File("src/test/res/autotune/test1/autotune.2022-05-21.json").readText() - val oapsPreppedGlucose = PreppedGlucose(JSONObject(prepjson), dateUtil) //prep data calculated by OpenAPS autotune + val prepJson = File("src/test/res/autotune/test1/autotune.2022-05-21.json").readText() + val oapsPreppedGlucose = PreppedGlucose(JSONObject(prepJson), dateUtil) //prep data calculated by OpenAPS autotune val oapsEntriesJson = File("src/test/res/autotune/test1/aaps-entries.2022-05-21.json").readText() - autotuneIob.glucose = buildGlucose(JSONArray(oapsEntriesJson)) + autotuneIob.glucose = buildGlucose(JSONArray(oapsEntriesJson)) val oapsTreatmentsJson = File("src/test/res/autotune/test1/aaps-treatments.2022-05-21.json").readText() - autotuneIob.meals = buildMeals(JSONArray(oapsTreatmentsJson)) //Only meals is used in unit test, Insulin only used for iob calculation + autotuneIob.meals = buildMeals(JSONArray(oapsTreatmentsJson)) //Only meals is used in unit test, Insulin only used for iob calculation autotuneIob.boluses = buildBoluses(oapsPreppedGlucose) //Values from oapsPrepData because linked to iob calculation method for TBR `when`(sp.getDouble(R.string.key_openapsama_min_5m_carbimpact, 3.0)).thenReturn(min5mCarbImpact) `when`(sp.getBoolean(R.string.key_autotune_categorize_uam_as_basal, false)).thenReturn(false) @@ -88,21 +88,20 @@ class AutotunePrepTest : TestBaseWithProfile() { } } - @Test fun autotunePrepTest2() { // Test if categorisation without carbs (full UAM) and categorize UAM as basal false is Ok val inputIobJson = File("src/test/res/autotune/test2/oaps-iobCalc.2022-05-21.json").readText() //json files build with iob/activity calculated by OAPS - val iobOapsCalcul = buildIobOaps(JSONArray(inputIobJson)) - autotuneIob = TestAutotuneIob(aapsLogger, repository, profileFunction, sp, dateUtil, activePlugin, autotuneFS, iobOapsCalcul) + val iobOapsCalculation = buildIobOaps(JSONArray(inputIobJson)) + autotuneIob = TestAutotuneIob(aapsLogger, repository, profileFunction, sp, dateUtil, activePlugin, autotuneFS, iobOapsCalculation) autotunePrep = AutotunePrep(sp, dateUtil, autotuneFS, autotuneIob) val inputProfileJson = File("src/test/res/autotune/test2/profile.pump.json").readText() val inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! - val prepjson = File("src/test/res/autotune/test2/autotune.2022-05-21.json").readText() - val oapsPreppedGlucose = PreppedGlucose(JSONObject(prepjson), dateUtil) //prep data calculated by OpenAPS autotune + val prepJson = File("src/test/res/autotune/test2/autotune.2022-05-21.json").readText() + val oapsPreppedGlucose = PreppedGlucose(JSONObject(prepJson), dateUtil) //prep data calculated by OpenAPS autotune val oapsEntriesJson = File("src/test/res/autotune/test2/aaps-entries.2022-05-21.json").readText() - autotuneIob.glucose = buildGlucose(JSONArray(oapsEntriesJson)) + autotuneIob.glucose = buildGlucose(JSONArray(oapsEntriesJson)) val oapsTreatmentsJson = File("src/test/res/autotune/test2/aaps-treatments.2022-05-21.json").readText() - autotuneIob.meals = buildMeals(JSONArray(oapsTreatmentsJson)) //Only meals is used in unit test, Insulin only used for iob calculation + autotuneIob.meals = buildMeals(JSONArray(oapsTreatmentsJson)) //Only meals is used in unit test, Insulin only used for iob calculation autotuneIob.boluses = buildBoluses(oapsPreppedGlucose) //Values from oapsPrepData because linked to iob calculation method for TBR `when`(sp.getDouble(R.string.key_openapsama_min_5m_carbimpact, 3.0)).thenReturn(min5mCarbImpact) `when`(sp.getBoolean(R.string.key_autotune_categorize_uam_as_basal, false)).thenReturn(false) // CategorizeUAM as Basal = False @@ -131,17 +130,17 @@ class AutotunePrepTest : TestBaseWithProfile() { @Test fun autotunePrepTest3() { // Test if categorisation without carbs (full UAM) and categorize UAM as basal true is Ok val inputIobJson = File("src/test/res/autotune/test3/oaps-iobCalc.2022-05-21.json").readText() //json files build with iob/activity calculated by OAPS - val iobOapsCalcul = buildIobOaps(JSONArray(inputIobJson)) - autotuneIob = TestAutotuneIob(aapsLogger, repository, profileFunction, sp, dateUtil, activePlugin, autotuneFS, iobOapsCalcul) + val iobOapsCalculation = buildIobOaps(JSONArray(inputIobJson)) + autotuneIob = TestAutotuneIob(aapsLogger, repository, profileFunction, sp, dateUtil, activePlugin, autotuneFS, iobOapsCalculation) autotunePrep = AutotunePrep(sp, dateUtil, autotuneFS, autotuneIob) val inputProfileJson = File("src/test/res/autotune/test3/profile.pump.json").readText() val inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! - val prepjson = File("src/test/res/autotune/test3/autotune.2022-05-21.json").readText() - val oapsPreppedGlucose = PreppedGlucose(JSONObject(prepjson), dateUtil) //prep data calculated by OpenAPS autotune + val prepJson = File("src/test/res/autotune/test3/autotune.2022-05-21.json").readText() + val oapsPreppedGlucose = PreppedGlucose(JSONObject(prepJson), dateUtil) //prep data calculated by OpenAPS autotune val oapsEntriesJson = File("src/test/res/autotune/test3/aaps-entries.2022-05-21.json").readText() - autotuneIob.glucose = buildGlucose(JSONArray(oapsEntriesJson)) + autotuneIob.glucose = buildGlucose(JSONArray(oapsEntriesJson)) val oapsTreatmentsJson = File("src/test/res/autotune/test3/aaps-treatments.2022-05-21.json").readText() - autotuneIob.meals = buildMeals(JSONArray(oapsTreatmentsJson)) //Only meals is used in unit test, Insulin only used for iob calculation + autotuneIob.meals = buildMeals(JSONArray(oapsTreatmentsJson)) //Only meals is used in unit test, Insulin only used for iob calculation autotuneIob.boluses = buildBoluses(oapsPreppedGlucose) //Values from oapsPrepData because linked to iob calculation method for TBR `when`(sp.getDouble(R.string.key_openapsama_min_5m_carbimpact, 3.0)).thenReturn(min5mCarbImpact) `when`(sp.getBoolean(R.string.key_autotune_categorize_uam_as_basal, false)).thenReturn(true) // CategorizeUAM as Basal = True @@ -170,7 +169,8 @@ class AutotunePrepTest : TestBaseWithProfile() { /************************************************************************************************************************************************************************************* * OpenAPS profile for Autotune only have one ISF value and one IC value */ - fun atProfileFromOapsJson(jsonObject: JSONObject, dateUtil: DateUtil, defaultUnits: String? = null): ATProfile? { + @Suppress("SpellCheckingInspection") + private fun atProfileFromOapsJson(jsonObject: JSONObject, dateUtil: DateUtil, defaultUnits: String? = null): ATProfile? { try { min5mCarbImpact = JsonHelper.safeGetDoubleAllowNull(jsonObject, "min_5m_carbimpact") ?: return null autotuneMin = JsonHelper.safeGetDoubleAllowNull(jsonObject, "autosens_min") ?: return null @@ -185,13 +185,13 @@ class AutotunePrepTest : TestBaseWithProfile() { val isfBlocks = ArrayList(1).also { val isfJsonArray = isfJson.getJSONArray("sensitivities") val value = isfJsonArray.getJSONObject(0).getDouble("sensitivity") - it.add(0,Block((T.hours(24).secs()) * 1000L, value)) + it.add(0, Block((T.hours(24).secs()) * 1000L, value)) } val icBlocks = ArrayList(1).also { val value = jsonObject.getDouble("carb_ratio") - it.add(0,Block((T.hours(24).secs()) * 1000L, value)) + it.add(0, Block((T.hours(24).secs()) * 1000L, value)) } - val basalBlocks = blockFromJsonArray(jsonObject.getJSONArray("basalprofile"), dateUtil) + val basalBlocks = blockFromJsonArray(jsonObject.getJSONArray("basalprofile")) ?: return null val targetBlocks = ArrayList(1).also { it.add(0, TargetBlock((T.hours(24).secs()) * 1000L, 100.0, 100.0)) @@ -207,14 +207,13 @@ class AutotunePrepTest : TestBaseWithProfile() { timeZone = timezone, dia = dia ) - return ATProfile(ProfileSealed.Pure(pure), localInsulin, profileInjector).also { it.dateUtil = dateUtil} + return ATProfile(ProfileSealed.Pure(pure), localInsulin, profileInjector).also { it.dateUtil = dateUtil } } catch (ignored: Exception) { return null } } - - fun blockFromJsonArray(jsonArray: JSONArray?, dateUtil: DateUtil): List? { + private fun blockFromJsonArray(jsonArray: JSONArray?): List? { val size = jsonArray?.length() ?: return null val ret = ArrayList(size) try { @@ -238,19 +237,19 @@ class AutotunePrepTest : TestBaseWithProfile() { return ret } - fun buildBoluses(preppedGlucose: PreppedGlucose): ArrayList { //if categorization is correct then I return for dose function the crInsulin calculated in Oaps + private fun buildBoluses(preppedGlucose: PreppedGlucose): ArrayList { //if categorization is correct then I return for dose function the crInsulin calculated in Oaps val boluses: ArrayList = ArrayList() - try { - for (i in preppedGlucose.crData.indices) { - boluses.add( - Bolus( - timestamp = preppedGlucose.crData[i].crEndTime, - amount = preppedGlucose.crData[i].crInsulin, - type = Bolus.Type.NORMAL - ) +// try { + for (i in preppedGlucose.crData.indices) { + boluses.add( + Bolus( + timestamp = preppedGlucose.crData[i].crEndTime, + amount = preppedGlucose.crData[i].crInsulin, + type = Bolus.Type.NORMAL ) - } - } catch (e: Exception) { } + ) + } +// } catch (e: Exception) { } if (boluses.size == 0) //Add at least one insulin treatment for tests to avoid return null in categorization boluses.add( Bolus( @@ -262,41 +261,41 @@ class AutotunePrepTest : TestBaseWithProfile() { return boluses } - fun buildMeals(jsonArray: JSONArray): ArrayList { + private fun buildMeals(jsonArray: JSONArray): ArrayList { val list: ArrayList = ArrayList() - try { - for (index in 0 until jsonArray.length()) { - val json = jsonArray.getJSONObject(index) - val value = JsonHelper.safeGetDouble(json, "carbs", 0.0) - val timestamp = JsonHelper.safeGetLong(json, "date") - if (value > 0.0 && timestamp > startDayTime) { - list.add(Carbs(timestamp=timestamp, amount = value, duration = 0)) - } +// try { + for (index in 0 until jsonArray.length()) { + val json = jsonArray.getJSONObject(index) + val value = JsonHelper.safeGetDouble(json, "carbs", 0.0) + val timestamp = JsonHelper.safeGetLong(json, "date") + if (value > 0.0 && timestamp > startDayTime) { + list.add(Carbs(timestamp = timestamp, amount = value, duration = 0)) } - } catch (e: Exception) { } + } +// } catch (e: Exception) { } return list } - fun buildGlucose(jsonArray: JSONArray): List { + private fun buildGlucose(jsonArray: JSONArray): List { val list: ArrayList = ArrayList() - try { - for (index in 0 until jsonArray.length()) { - val json = jsonArray.getJSONObject(index) - val value = JsonHelper.safeGetDouble(json, "sgv") - val timestamp = JsonHelper.safeGetLong(json, "date") - list.add(GlucoseValue(raw = value, noise = 0.0, value = value, timestamp = timestamp, sourceSensor = GlucoseValue.SourceSensor.UNKNOWN, trendArrow = GlucoseValue.TrendArrow.FLAT)) - } - } catch (e: Exception) { } +// try { + for (index in 0 until jsonArray.length()) { + val json = jsonArray.getJSONObject(index) + val value = JsonHelper.safeGetDouble(json, "sgv") + val timestamp = JsonHelper.safeGetLong(json, "date") + list.add(GlucoseValue(raw = value, noise = 0.0, value = value, timestamp = timestamp, sourceSensor = GlucoseValue.SourceSensor.UNKNOWN, trendArrow = GlucoseValue.TrendArrow.FLAT)) + } +// } catch (e: Exception) { } if (list.size > 0) - startDayTime = list[list.size-1].timestamp + startDayTime = list[list.size - 1].timestamp return list } - fun buildIobOaps(jsonArray: JSONArray): ArrayList { //if categorization is correct then I return for dose function the crInsulin calculated in Oaps + private fun buildIobOaps(jsonArray: JSONArray): ArrayList { //if categorization is correct then I return for dose function the crInsulin calculated in Oaps val list: ArrayList = ArrayList() for (index in 0 until jsonArray.length()) { val json = jsonArray.getJSONObject(index) - val time = JsonHelper.safeGetLong(json,"date") + val time = JsonHelper.safeGetLong(json, "date") val iob = JsonHelper.safeGetDouble(json, "iob") val activity = JsonHelper.safeGetDouble(json, "activity") val iobTotal = IobTotal(time) @@ -315,7 +314,7 @@ class AutotunePrepTest : TestBaseWithProfile() { val dateUtil: DateUtil, val activePlugin: ActivePlugin, autotuneFS: AutotuneFS, - val iobOapsCalcul: ArrayList + private val iobOapsCalculation: ArrayList ) : AutotuneIob( aapsLogger, repository, @@ -325,9 +324,10 @@ class AutotunePrepTest : TestBaseWithProfile() { activePlugin, autotuneFS ) { + override fun getIOB(time: Long, localInsulin: LocalInsulin): IobTotal { - var bolusIob = IobTotal(time) - iobOapsCalcul.forEach { + val bolusIob = IobTotal(time) + iobOapsCalculation.forEach { if (it.time == time) return it } diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/PreppedGlucoseTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/PreppedGlucoseTest.kt index f769e5af72..9150c87bb2 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/PreppedGlucoseTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/PreppedGlucoseTest.kt @@ -1,35 +1,48 @@ package info.nightscout.androidaps.plugins.general.autotune -import android.content.Context -import info.nightscout.androidaps.TestBase -import info.nightscout.androidaps.plugins.general.autotune.data.* -import info.nightscout.androidaps.utils.DateUtil +import info.nightscout.androidaps.TestBaseWithProfile +import info.nightscout.androidaps.plugins.general.autotune.data.BGDatum +import info.nightscout.androidaps.plugins.general.autotune.data.CRDatum +import info.nightscout.androidaps.plugins.general.autotune.data.PreppedGlucose import org.json.JSONObject import org.junit.Assert import org.junit.Before import org.junit.Test -import org.mockito.Mock import java.io.File -class PreppedGlucoseTest : TestBase() { - @Mock lateinit var context: Context - lateinit var dateUtil: DateUtil - lateinit var prep1: PreppedGlucose - lateinit var prepjson1: String +class PreppedGlucoseTest : TestBaseWithProfile() { + + private lateinit var prep1: PreppedGlucose + private lateinit var prepJson1: String @Before fun initData() { - dateUtil = DateUtil(context) - prepjson1 = File("src/test/res/autotune/test1/autotune.2022-05-21.json").readText() - prep1 = PreppedGlucose(JSONObject(prepjson1), dateUtil) + prepJson1 = File("src/test/res/autotune/test1/autotune.2022-05-21.json").readText() + prep1 = PreppedGlucose(JSONObject(prepJson1), dateUtil) } @Test fun preppedGlucoseLoadTest() { // Test if load from file of OpenAPS categorisation is Ok - val crData0 = CRDatum(JSONObject("{\"CRInitialIOB\":13.594,\"CRInitialBG\":123,\"CRInitialCarbTime\":\"2022-05-21T07:54:09.000Z\",\"CREndIOB\":-0.155,\"CREndBG\":98,\"CREndTime\":\"2022-05-21T11:19:08.000Z\",\"CRCarbs\":70,\"CRInsulin\":-2.13}"), dateUtil) - val csfDataEnd = BGDatum(JSONObject("{\"device\":\"AndroidAPS-DexcomG6\",\"date\":1653176050000,\"dateString\":\"2022-05-21T23:34:10.000Z\",\"isValid\":true,\"sgv\":127,\"direction\":\"Flat\",\"type\":\"sgv\",\"_id\":\"6289771371a363000480abc1\",\"glucose\":127,\"avgDelta\":\"2.50\",\"BGI\":-2.93,\"deviation\":\"5.43\",\"mealCarbs\":0,\"mealAbsorption\":\"end\"}"), dateUtil) - val isfData0 = BGDatum(JSONObject("{\"device\":\"AndroidAPS-DexcomG6\",\"date\":1653108249000,\"dateString\":\"2022-05-21T04:44:09.000Z\",\"isValid\":true,\"sgv\":123,\"direction\":\"FortyFiveDown\",\"type\":\"sgv\",\"_id\":\"62886e2919e2e60004989bba\",\"glucose\":123,\"avgDelta\":\"-7.50\",\"BGI\":-7.59,\"deviation\":\"0.09\"}"), dateUtil) - val basalDataEnd = BGDatum(JSONObject("{\"device\":\"AndroidAPS-DexcomG6\",\"date\":1653180549000,\"dateString\":\"2022-05-22T00:49:09.000Z\",\"isValid\":true,\"sgv\":121,\"direction\":\"FortyFiveDown\",\"type\":\"sgv\",\"_id\":\"628988a3da46aa0004d1e0f5\",\"glucose\":121,\"avgDelta\":\"-5.25\",\"BGI\":-3.32,\"deviation\":\"-1.93\"}"), dateUtil) + val crData0 = + CRDatum( + JSONObject("{\"CRInitialIOB\":13.594,\"CRInitialBG\":123,\"CRInitialCarbTime\":\"2022-05-21T07:54:09.000Z\",\"CREndIOB\":-0.155,\"CREndBG\":98,\"CREndTime\":\"2022-05-21T11:19:08.000Z\",\"CRCarbs\":70,\"CRInsulin\":-2.13}"), + dateUtil + ) + val csfDataEnd = + BGDatum( + JSONObject("{\"device\":\"AndroidAPS-DexcomG6\",\"date\":1653176050000,\"dateString\":\"2022-05-21T23:34:10.000Z\",\"isValid\":true,\"sgv\":127,\"direction\":\"Flat\",\"type\":\"sgv\",\"_id\":\"6289771371a363000480abc1\",\"glucose\":127,\"avgDelta\":\"2.50\",\"BGI\":-2.93,\"deviation\":\"5.43\",\"mealCarbs\":0,\"mealAbsorption\":\"end\"}"), + dateUtil + ) + val isfData0 = + BGDatum( + JSONObject("{\"device\":\"AndroidAPS-DexcomG6\",\"date\":1653108249000,\"dateString\":\"2022-05-21T04:44:09.000Z\",\"isValid\":true,\"sgv\":123,\"direction\":\"FortyFiveDown\",\"type\":\"sgv\",\"_id\":\"62886e2919e2e60004989bba\",\"glucose\":123,\"avgDelta\":\"-7.50\",\"BGI\":-7.59,\"deviation\":\"0.09\"}"), + dateUtil + ) + val basalDataEnd = + BGDatum( + JSONObject("{\"device\":\"AndroidAPS-DexcomG6\",\"date\":1653180549000,\"dateString\":\"2022-05-22T00:49:09.000Z\",\"isValid\":true,\"sgv\":121,\"direction\":\"FortyFiveDown\",\"type\":\"sgv\",\"_id\":\"628988a3da46aa0004d1e0f5\",\"glucose\":121,\"avgDelta\":\"-5.25\",\"BGI\":-3.32,\"deviation\":\"-1.93\"}"), + dateUtil + ) Assert.assertEquals(3, prep1.crData.size) Assert.assertTrue(crData0.equals(prep1.crData[0])) Assert.assertTrue(csfDataEnd.equals(prep1.csfGlucoseData[prep1.csfGlucoseData.size - 1])) diff --git a/core/test_dependencies.gradle b/core/test_dependencies.gradle index 9628a048a9..bc9915e4bb 100644 --- a/core/test_dependencies.gradle +++ b/core/test_dependencies.gradle @@ -15,6 +15,13 @@ dependencies { androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' } +tasks.matching { it instanceof Test }.all { + //testLogging.events = ["failed", "skipped", "started"] + // use to display stdout in travis + testLogging.events = ["failed", "skipped", "started", "standard_out"] + testLogging.exceptionFormat = "full" +} + android { testOptions { unitTests { From 9b6477381bc96f073b874b209f342b0e815a3a3f Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Wed, 29 Jun 2022 09:25:27 +0200 Subject: [PATCH 028/154] Wear: fix ecarbs activity --- .../plugins/general/wear/wearintegration/DataHandlerMobile.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt index a0ccacf982..63429ac077 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/DataHandlerMobile.kt @@ -472,7 +472,7 @@ class DataHandlerMobile @Inject constructor( } private fun handleECarbsPreCheck(command: EventData.ActionECarbsPreCheck) { - val startTimeStamp = System.currentTimeMillis() + T.hours(command.carbsTimeShift.toLong()).msecs() + val startTimeStamp = System.currentTimeMillis() + T.mins(command.carbsTimeShift.toLong()).msecs() val carbsAfterConstraints = constraintChecker.applyCarbsConstraints(Constraint(command.carbs)).value() var message = rh.gs(R.string.carbs) + ": " + carbsAfterConstraints + "g" + "\n" + rh.gs(R.string.time) + ": " + dateUtil.timeString(startTimeStamp) + From 0e0470a4e84041aa00e3f42e828583ea0365b25d Mon Sep 17 00:00:00 2001 From: Philoul Date: Thu, 30 Jun 2022 01:03:00 +0200 Subject: [PATCH 029/154] Fix AutotunePrepTest (add timeshift in input profile to get correct basal consistant with OpenAps run) --- .../plugins/general/autotune/AutotunePrep.kt | 43 +++++++++++++++---- .../general/autotune/AutotunePrepTest.kt | 18 +++----- 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrep.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrep.kt index edba396893..63617e908e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrep.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrep.kt @@ -10,6 +10,8 @@ import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.MidnightTime import info.nightscout.androidaps.utils.Round import info.nightscout.androidaps.utils.T +import info.nightscout.shared.logging.AAPSLogger +import info.nightscout.shared.logging.LTag import info.nightscout.shared.sharedPreferences.SP import java.util.* import javax.inject.Inject @@ -17,6 +19,7 @@ import javax.inject.Singleton @Singleton class AutotunePrep @Inject constructor( + private val aapsLogger: AAPSLogger, private val sp: SP, private val dateUtil: DateUtil, private val autotuneFS: AutotuneFS, @@ -146,6 +149,7 @@ class AutotunePrep @Inject constructor( } } if (glucose.size == 0 || glucoseData.size == 0 ) { + //aapsLogger.debug(LTag.AUTOTUNE, "No BG value received") if (verbose) log("No BG value received") return null @@ -159,11 +163,13 @@ class AutotunePrep @Inject constructor( //val boluses = 0 //val maxCarbs = 0 if (treatments.size == 0) { + //aapsLogger.debug(LTag.AUTOTUNE, "No Carbs entries") if (verbose) log("No Carbs entries") //return null } if (autotuneIob.boluses.size == 0) { + //aapsLogger.debug(LTag.AUTOTUNE, "No treatment received") if (verbose) log("No treatment received") return null @@ -253,6 +259,7 @@ class AutotunePrep @Inject constructor( } avgDelta = (bg - bucketedData[i + 4].value) / 4 } else { + //aapsLogger.debug(LTag.AUTOTUNE, "Could not find glucose data") if (verbose) log("Could not find glucose data") } @@ -320,8 +327,9 @@ class AutotunePrep @Inject constructor( crInitialIOB = iob.iob crInitialBG = glucoseDatum.value crInitialCarbTime = glucoseDatum.date + //aapsLogger.debug(LTag.AUTOTUNE, "CRInitialIOB: $crInitialIOB CRInitialBG: $crInitialBG CRInitialCarbTime: ${dateUtil.toISOString(crInitialCarbTime)}") if (verbose) - log("CRInitialIOB: " + crInitialIOB + " CRInitialBG: " + crInitialBG + " CRInitialCarbTime: " + dateUtil.toISOString(crInitialCarbTime)) + log("CRInitialIOB: $crInitialIOB CRInitialBG: $crInitialBG CRInitialCarbTime: ${dateUtil.toISOString(crInitialCarbTime)}") } // keep calculatingCR as long as we have COB or enough IOB if (mealCOB > 0 && i > 1) { @@ -333,8 +341,9 @@ class AutotunePrep @Inject constructor( val crEndIOB = iob.iob val crEndBG = glucoseDatum.value val crEndTime = glucoseDatum.date + //aapsLogger.debug(LTag.AUTOTUNE, "CREndIOB: $crEndIOB CREndBG: $crEndBG CREndTime: ${dateUtil.toISOString(crEndTime)}") if (verbose) - log("CREndIOB: " + crEndIOB + " CREndBG: " + crEndBG + " CREndTime: " + dateUtil.toISOString(crEndTime)) + log("CREndIOB: $crEndIOB CREndBG: $crEndBG CREndTime: ${dateUtil.toISOString(crEndTime)}") val crDatum = CRDatum(dateUtil) crDatum.crInitialBG = crInitialBG crDatum.crInitialIOB = crInitialIOB @@ -349,6 +358,7 @@ class AutotunePrep @Inject constructor( //log.debug(CREndTime - CRInitialCarbTime, CRElapsedMinutes); if (CRElapsedMinutes < 60 || i == 1 && mealCOB > 0) { + //aapsLogger.debug(LTag.AUTOTUNE, "Ignoring $CRElapsedMinutes m CR period.") if (verbose) log("Ignoring $CRElapsedMinutes m CR period.") } else { @@ -378,8 +388,9 @@ class AutotunePrep @Inject constructor( //log.debug(type); if (type != "csf") { glucoseDatum.mealAbsorption = "start" + //aapsLogger.debug(LTag.AUTOTUNE, "${glucoseDatum.mealAbsorption} carb absorption") if (verbose) - log(glucoseDatum.mealAbsorption + " carb absorption") + log("${glucoseDatum.mealAbsorption} carb absorption") } type = "csf" glucoseDatum.mealCarbs = mealCarbs.toInt() @@ -389,8 +400,9 @@ class AutotunePrep @Inject constructor( // check previous "type" value, and if it was csf, set a mealAbsorption end flag if (type == "csf") { csfGlucoseData[csfGlucoseData.size - 1].mealAbsorption = "end" + //aapsLogger.debug(LTag.AUTOTUNE, "${csfGlucoseData[csfGlucoseData.size - 1].mealAbsorption} carb absorption") if (verbose) - log(csfGlucoseData[csfGlucoseData.size - 1].mealAbsorption + " carb absorption") + log("${csfGlucoseData[csfGlucoseData.size - 1].mealAbsorption} carb absorption") } if (iob.iob > 2 * currentBasal || deviation > 6 || uam) { uam = if (deviation > 0) { @@ -400,6 +412,7 @@ class AutotunePrep @Inject constructor( } if (type != "uam") { glucoseDatum.uamAbsorption = "start" + //aapsLogger.debug(LTag.AUTOTUNE, "${glucoseDatum.uamAbsorption} unannnounced meal absorption") if (verbose) log(glucoseDatum.uamAbsorption + " unannnounced meal absorption") } @@ -407,6 +420,7 @@ class AutotunePrep @Inject constructor( uamGlucoseData.add(glucoseDatum) } else { if (type == "uam") { + //aapsLogger.debug(LTag.AUTOTUNE, "end unannounced meal absorption") if (verbose) log("end unannounced meal absorption") } @@ -433,8 +447,10 @@ class AutotunePrep @Inject constructor( } } // debug line to print out all the things + //aapsLogger.debug(LTag.AUTOTUNE, "${(if (absorbing) 1 else 0)} mealCOB: ${Round.roundTo(mealCOB, 0.1)} mealCarbs: ${Math.round(mealCarbs)} basalBGI: ${Round.roundTo(basalBGI, 0.1)} BGI: ${Round.roundTo(BGI, 0.1)} IOB: ${iob.iob} Activity: ${iob.activity} at ${dateUtil.timeStringWithSeconds(BGTime)} dev: $deviation avgDelta: $avgDelta $type") if (verbose) - log((if (absorbing) 1 else 0).toString() + " mealCOB: " + Round.roundTo(mealCOB, 0.1) + " mealCarbs: " + Math.round(mealCarbs) + " basalBGI: " + Round.roundTo(basalBGI, 0.1) + " BGI: " + Round.roundTo(BGI, 0.1) + " IOB: " + iob.iob+ " Activity: " + iob.activity + " at " + dateUtil.timeStringWithSeconds(BGTime) + " dev: " + deviation + " avgDelta: " + avgDelta + " " + type) + log("${(if (absorbing) 1 else 0)} mealCOB: ${Round.roundTo(mealCOB, 0.1)} mealCarbs: ${Math.round(mealCarbs)} basalBGI: ${Round.roundTo(basalBGI, 0.1)} BGI: ${Round + .roundTo(BGI, 0.1)} IOB: ${iob.iob} Activity: ${iob.activity} at ${dateUtil.timeStringWithSeconds(BGTime)} dev: $deviation avgDelta: $avgDelta $type") } //**************************************************************************************************************************************** @@ -449,16 +465,20 @@ class AutotunePrep @Inject constructor( val UAMLength = uamGlucoseData.size var basalLength = basalGlucoseData.size if (sp.getBoolean(R.string.key_autotune_categorize_uam_as_basal, false)) { + //aapsLogger.debug(LTag.AUTOTUNE, "Categorizing all UAM data as basal.") if (verbose) log("Categorizing all UAM data as basal.") basalGlucoseData.addAll(uamGlucoseData) } else if (CSFLength > 12) { + //aapsLogger.debug(LTag.AUTOTUNE, "Found at least 1h of carb: assuming meals were announced, and categorizing UAM data as basal.") if (verbose) log("Found at least 1h of carb: assuming meals were announced, and categorizing UAM data as basal.") basalGlucoseData.addAll(uamGlucoseData) } else { if (2 * basalLength < UAMLength) { //log.debug(basalGlucoseData, UAMGlucoseData); + //aapsLogger.debug(LTag.AUTOTUNE, "Warning: too many deviations categorized as UnAnnounced Meals") + //aapsLogger.debug(LTag.AUTOTUNE, "Adding $UAMLength UAM deviations to $basalLength basal ones") if (verbose) { log("Warning: too many deviations categorized as UnAnnounced Meals") log("Adding $UAMLength UAM deviations to $basalLength basal ones") @@ -473,10 +493,12 @@ class AutotunePrep @Inject constructor( } //log.debug(newBasalGlucose); basalGlucoseData = newBasalGlucose + //aapsLogger.debug(LTag.AUTOTUNE, "and selecting the lowest 50%, leaving ${basalGlucoseData.size} basal+UAM ones") if (verbose) - log("and selecting the lowest 50%, leaving " + basalGlucoseData.size + " basal+UAM ones") + log("and selecting the lowest 50%, leaving ${basalGlucoseData.size} basal+UAM ones") } if (2 * ISFLength < UAMLength) { + //aapsLogger.debug(LTag.AUTOTUNE, "Adding $UAMLength UAM deviations to $ISFLength ISF ones") if (verbose) log("Adding $UAMLength UAM deviations to $ISFLength ISF ones") isfGlucoseData.addAll(uamGlucoseData) @@ -488,14 +510,17 @@ class AutotunePrep @Inject constructor( } //console.error(newISFGlucose); isfGlucoseData = newISFGlucose + //aapsLogger.debug(LTag.AUTOTUNE, "and selecting the lowest 50%, leaving ${isfGlucoseData.size} ISF+UAM ones") if (verbose) - log("and selecting the lowest 50%, leaving " + isfGlucoseData.size + " ISF+UAM ones") + log("and selecting the lowest 50%, leaving ${isfGlucoseData.size} ISF+UAM ones") //log.error(ISFGlucoseData.length, UAMLength); } } basalLength = basalGlucoseData.size ISFLength = isfGlucoseData.size if (4 * basalLength + ISFLength < CSFLength && ISFLength < 10) { + //aapsLogger.debug(LTag.AUTOTUNE, "Warning: too many deviations categorized as meals") + //aapsLogger.debug(LTag.AUTOTUNE, "Adding $CSFLength CSF deviations to $ISFLength ISF ones") if (verbose) { log("Warning: too many deviations categorized as meals") //log.debug("Adding",CSFLength,"CSF deviations to",basalLength,"basal ones"); @@ -507,8 +532,9 @@ class AutotunePrep @Inject constructor( } // categorize.js Lines 437-444 + //aapsLogger.debug(LTag.AUTOTUNE, "CRData: ${crData.size} CSFGlucoseData: ${csfGlucoseData.size} ISFGlucoseData: ${isfGlucoseData.size} BasalGlucoseData: ${basalGlucoseData.size}") if (verbose) - log("CRData: " + crData.size + " CSFGlucoseData: " + csfGlucoseData.size + " ISFGlucoseData: " + isfGlucoseData.size + " BasalGlucoseData: " + basalGlucoseData.size) + log("CRData: ${crData.size} CSFGlucoseData: ${csfGlucoseData.size} ISFGlucoseData: ${isfGlucoseData.size} BasalGlucoseData: ${basalGlucoseData.size}") return PreppedGlucose(autotuneIob.startBG, crData, csfGlucoseData, isfGlucoseData, basalGlucoseData, dateUtil) } @@ -516,6 +542,7 @@ class AutotunePrep @Inject constructor( //dosed.js full private fun dosed(start: Long, end: Long, treatments: List): Double { var insulinDosed = 0.0 + //aapsLogger.debug(LTag.AUTOTUNE, "No treatments to process.") if (treatments.size == 0) { log("No treatments to process.") return 0.0 diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt index f7fb47cecb..ea797d8566 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/autotune/AutotunePrepTest.kt @@ -13,6 +13,7 @@ import info.nightscout.androidaps.database.data.TargetBlock import info.nightscout.androidaps.database.entities.Bolus import info.nightscout.androidaps.database.entities.Carbs import info.nightscout.androidaps.database.entities.GlucoseValue +import info.nightscout.androidaps.extensions.shiftBlock import info.nightscout.androidaps.interfaces.* import info.nightscout.androidaps.plugins.general.autotune.data.* import info.nightscout.androidaps.utils.DateUtil @@ -39,6 +40,7 @@ class AutotunePrepTest : TestBaseWithProfile() { @Mock lateinit var repository: AppRepository private lateinit var autotunePrep: AutotunePrep private lateinit var autotuneIob: TestAutotuneIob + private var ts = 0 private var min5mCarbImpact = 0.0 private var autotuneMin = 0.0 private var autotuneMax = 0.0 @@ -46,7 +48,7 @@ class AutotunePrepTest : TestBaseWithProfile() { @Before fun initData() { - TimeZone.setDefault(TimeZone.getTimeZone("GMT+2")) + ts = T.msecs(TimeZone.getDefault().getOffset(System.currentTimeMillis()).toLong()).hours().toInt() - 2 } @Test @@ -54,7 +56,7 @@ class AutotunePrepTest : TestBaseWithProfile() { val inputIobJson = File("src/test/res/autotune/test1/oaps-iobCalc.2022-05-21.json").readText() //json files build with iob/activity calculated by OAPS val iobOapsCalculation = buildIobOaps(JSONArray(inputIobJson)) autotuneIob = TestAutotuneIob(aapsLogger, repository, profileFunction, sp, dateUtil, activePlugin, autotuneFS, iobOapsCalculation) - autotunePrep = AutotunePrep(sp, dateUtil, autotuneFS, autotuneIob) + autotunePrep = AutotunePrep(aapsLogger, sp, dateUtil, autotuneFS, autotuneIob) val inputProfileJson = File("src/test/res/autotune/test1/profile.pump.json").readText() val inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! val prepJson = File("src/test/res/autotune/test1/autotune.2022-05-21.json").readText() @@ -93,7 +95,7 @@ class AutotunePrepTest : TestBaseWithProfile() { val inputIobJson = File("src/test/res/autotune/test2/oaps-iobCalc.2022-05-21.json").readText() //json files build with iob/activity calculated by OAPS val iobOapsCalculation = buildIobOaps(JSONArray(inputIobJson)) autotuneIob = TestAutotuneIob(aapsLogger, repository, profileFunction, sp, dateUtil, activePlugin, autotuneFS, iobOapsCalculation) - autotunePrep = AutotunePrep(sp, dateUtil, autotuneFS, autotuneIob) + autotunePrep = AutotunePrep(aapsLogger, sp, dateUtil, autotuneFS, autotuneIob) val inputProfileJson = File("src/test/res/autotune/test2/profile.pump.json").readText() val inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! val prepJson = File("src/test/res/autotune/test2/autotune.2022-05-21.json").readText() @@ -132,7 +134,7 @@ class AutotunePrepTest : TestBaseWithProfile() { val inputIobJson = File("src/test/res/autotune/test3/oaps-iobCalc.2022-05-21.json").readText() //json files build with iob/activity calculated by OAPS val iobOapsCalculation = buildIobOaps(JSONArray(inputIobJson)) autotuneIob = TestAutotuneIob(aapsLogger, repository, profileFunction, sp, dateUtil, activePlugin, autotuneFS, iobOapsCalculation) - autotunePrep = AutotunePrep(sp, dateUtil, autotuneFS, autotuneIob) + autotunePrep = AutotunePrep(aapsLogger, sp, dateUtil, autotuneFS, autotuneIob) val inputProfileJson = File("src/test/res/autotune/test3/profile.pump.json").readText() val inputProfile = atProfileFromOapsJson(JSONObject(inputProfileJson), dateUtil)!! val prepJson = File("src/test/res/autotune/test3/autotune.2022-05-21.json").readText() @@ -199,7 +201,7 @@ class AutotunePrepTest : TestBaseWithProfile() { val pure = PureProfile( jsonObject = jsonObject, - basalBlocks = basalBlocks, + basalBlocks = basalBlocks.shiftBlock(1.0,ts), isfBlocks = isfBlocks, icBlocks = icBlocks, targetBlocks = targetBlocks, @@ -239,7 +241,6 @@ class AutotunePrepTest : TestBaseWithProfile() { private fun buildBoluses(preppedGlucose: PreppedGlucose): ArrayList { //if categorization is correct then I return for dose function the crInsulin calculated in Oaps val boluses: ArrayList = ArrayList() -// try { for (i in preppedGlucose.crData.indices) { boluses.add( Bolus( @@ -249,7 +250,6 @@ class AutotunePrepTest : TestBaseWithProfile() { ) ) } -// } catch (e: Exception) { } if (boluses.size == 0) //Add at least one insulin treatment for tests to avoid return null in categorization boluses.add( Bolus( @@ -263,7 +263,6 @@ class AutotunePrepTest : TestBaseWithProfile() { private fun buildMeals(jsonArray: JSONArray): ArrayList { val list: ArrayList = ArrayList() -// try { for (index in 0 until jsonArray.length()) { val json = jsonArray.getJSONObject(index) val value = JsonHelper.safeGetDouble(json, "carbs", 0.0) @@ -272,20 +271,17 @@ class AutotunePrepTest : TestBaseWithProfile() { list.add(Carbs(timestamp = timestamp, amount = value, duration = 0)) } } -// } catch (e: Exception) { } return list } private fun buildGlucose(jsonArray: JSONArray): List { val list: ArrayList = ArrayList() -// try { for (index in 0 until jsonArray.length()) { val json = jsonArray.getJSONObject(index) val value = JsonHelper.safeGetDouble(json, "sgv") val timestamp = JsonHelper.safeGetLong(json, "date") list.add(GlucoseValue(raw = value, noise = 0.0, value = value, timestamp = timestamp, sourceSensor = GlucoseValue.SourceSensor.UNKNOWN, trendArrow = GlucoseValue.TrendArrow.FLAT)) } -// } catch (e: Exception) { } if (list.size > 0) startDayTime = list[list.size - 1].timestamp return list From 6f6b16805632b1b286948e447c2be06a4bbbb79d Mon Sep 17 00:00:00 2001 From: Andries Smit Date: Thu, 30 Jun 2022 08:53:42 +0200 Subject: [PATCH 030/154] chore: wear remove bg multi plus --- .../interaction/actions/ECarbActivity.kt | 3 +-- .../interaction/actions/FillActivity.kt | 2 +- .../actions/ProfileSwitchActivity.kt | 2 +- .../interaction/actions/TempTargetActivity.kt | 2 +- .../interaction/actions/TreatmentActivity.kt | 2 +- .../action_editplusmin_quicklefty_multi.xml | 24 ++++++++----------- .../action_editplusmin_quickrighty_multi.xml | 9 ++----- 7 files changed, 17 insertions(+), 27 deletions(-) diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.kt index 0a643e9bff..919d92b1dd 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.kt @@ -84,8 +84,7 @@ class ECarbActivity : ViewSelectorActivity() { val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) val confirmButton = view.findViewById(R.id.confirmbutton) confirmButton.setOnClickListener { - - //check if it can happen that the fragment is never created that hold data? + // check if it can happen that the fragment is never created that hold data? // (you have to swipe past them anyways - but still) val bolus = ActionECarbsPreCheck( stringToInt(editCarbs?.editText?.text.toString()), diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/FillActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/FillActivity.kt index 2525033df0..9fdfa97d26 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/FillActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/FillActivity.kt @@ -52,7 +52,7 @@ class FillActivity : ViewSelectorActivity() { val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) val confirmButton = view.findViewById(R.id.confirmbutton) confirmButton.setOnClickListener { - //check if it can happen that the fragment is never created that hold data? + // check if it can happen that the fragment is never created that hold data? // (you have to swipe past them anyways - but still) rxBus.send(EventWearToMobile(ActionFillPreCheck(stringToDouble(editInsulin?.editText?.text.toString())))) showToast(this@FillActivity, R.string.action_fill_confirmation) diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ProfileSwitchActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ProfileSwitchActivity.kt index c6498f2638..8aa2a26437 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ProfileSwitchActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ProfileSwitchActivity.kt @@ -75,7 +75,7 @@ class ProfileSwitchActivity : ViewSelectorActivity() { val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) val confirmButton = view.findViewById(R.id.confirmbutton) confirmButton.setOnClickListener { - //check if it can happen that the fragment is never created that hold data? + // check if it can happen that the fragment is never created that hold data? // (you have to swipe past them anyways - but still) val ps = ActionProfileSwitchPreCheck(SafeParse.stringToInt(editTimeshift?.editText?.text.toString()), SafeParse.stringToInt(editPercentage?.editText?.text.toString())) rxBus.send(EventWearToMobile(ps)) diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.kt index 80180d850a..77f1c256dc 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TempTargetActivity.kt @@ -98,7 +98,7 @@ class TempTargetActivity : ViewSelectorActivity() { val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) val confirmButton = view.findViewById(R.id.confirmbutton) confirmButton.setOnClickListener { - //check if it can happen that the fragment is never created that hold data? + // check if it can happen that the fragment is never created that hold data? // (you have to swipe past them anyways - but still) val action = ActionTempTargetPreCheck( ActionTempTargetPreCheck.TempTargetCommand.MANUAL, diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TreatmentActivity.kt b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TreatmentActivity.kt index 55805803d4..1cb7c36879 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TreatmentActivity.kt +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/TreatmentActivity.kt @@ -73,7 +73,7 @@ class TreatmentActivity : ViewSelectorActivity() { val view = LayoutInflater.from(applicationContext).inflate(R.layout.action_confirm_ok, container, false) val confirmButton = view.findViewById(R.id.confirmbutton) confirmButton.setOnClickListener { - //check if it can happen that the fragment is never created that hold data? + // check if it can happen that the fragment is never created that hold data? // (you have to swipe past them anyways - but still) val bolus = ActionBolusPreCheck(stringToDouble(editInsulin?.editText?.text.toString()), stringToInt(editCarbs?.editText?.text.toString())) rxBus.send(EventWearToMobile(bolus)) diff --git a/wear/src/main/res/layout/action_editplusmin_quicklefty_multi.xml b/wear/src/main/res/layout/action_editplusmin_quicklefty_multi.xml index 5a4e9b10cb..d5acf0460d 100644 --- a/wear/src/main/res/layout/action_editplusmin_quicklefty_multi.xml +++ b/wear/src/main/res/layout/action_editplusmin_quicklefty_multi.xml @@ -19,7 +19,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="10dp" - android:layout_marginTop="-10dp" + android:layout_marginTop="-5dp" android:cursorVisible="false" android:gravity="center" android:inputType="numberDecimal" @@ -44,7 +44,7 @@ app:layout_constraintStart_toStartOf="@+id/edit_text" app:layout_constraintTop_toBottomOf="@id/edit_text" tools:ignore="LabelFor" - tools:text="label123" /> + tools:text="label" /> @@ -72,7 +72,7 @@ android:textSize="25sp" android:visibility="visible" app:layout_constraintCircle="@+id/center" - app:layout_constraintCircleAngle="35" + app:layout_constraintCircleAngle="325" app:layout_constraintCircleRadius="70dp" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -89,25 +89,21 @@ android:textSize="30sp" app:layout_constraintBottom_toTopOf="@+id/plus_button1" app:layout_constraintCircle="@+id/center" - app:layout_constraintCircleAngle="90" + app:layout_constraintCircleAngle="270" app:layout_constraintCircleRadius="70dp" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/plus_button3" tools:text="+5" /> - + app:layout_constraintLeft_toRightOf="@id/plus_button3" /> diff --git a/wear/src/main/res/layout/action_editplusmin_quickrighty_multi.xml b/wear/src/main/res/layout/action_editplusmin_quickrighty_multi.xml index 93840e6869..0cd6b4f344 100644 --- a/wear/src/main/res/layout/action_editplusmin_quickrighty_multi.xml +++ b/wear/src/main/res/layout/action_editplusmin_quickrighty_multi.xml @@ -19,7 +19,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="10dp" - android:layout_marginTop="-1dp" + android:layout_marginTop="-5dp" android:cursorVisible="false" android:gravity="center" android:inputType="numberDecimal" @@ -95,15 +95,10 @@ app:layout_constraintTop_toBottomOf="@+id/plus_button3" tools:text="+5" /> - Date: Thu, 30 Jun 2022 08:10:07 +0000 Subject: [PATCH 031/154] Bump lifecycle-livedata-ktx from 2.4.1 to 2.5.0 Bumps lifecycle-livedata-ktx from 2.4.1 to 2.5.0. --- updated-dependencies: - dependency-name: androidx.lifecycle:lifecycle-livedata-ktx dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f4ac0a131f..0f1228a852 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { rxandroid_version = '3.0.0' rxkotlin_version = '3.0.1' room_version = '2.4.2' - lifecycle_version = '2.4.1' + lifecycle_version = '2.5.0' dagger_version = '2.42' coroutines_version = '1.6.3' activity_version = '1.4.0' From 689a750a3ffe2c36fdb364ca68f874540c9a4c1d Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 30 Jun 2022 14:44:33 +0200 Subject: [PATCH 032/154] New Crowdin updates (#1854) * New translations strings.xml (Hebrew) * New translations strings.xml (Turkish) * New translations strings.xml (Dutch) * New translations strings.xml (Italian) * New translations strings.xml (Turkish) * New translations strings.xml (Slovak) * New translations strings.xml (Russian) * New translations strings.xml (Norwegian) * New translations strings.xml (Dutch) * New translations strings.xml (Italian) * New translations strings.xml (French) * New translations strings.xml (Hebrew) * New translations strings.xml (Czech) * New translations strings.xml (Spanish) * Update source file strings.xml * New translations strings.xml (Czech) * New translations strings.xml (Slovak) * New translations strings.xml (Slovak) * New translations strings.xml (Norwegian) * New translations strings.xml (Norwegian) * New translations strings.xml (Dutch) * New translations strings.xml (Norwegian) * New translations strings.xml (Norwegian) * New translations strings.xml (Norwegian) * New translations strings.xml (Norwegian) * New translations strings.xml (Norwegian) * New translations strings.xml (Turkish) * New translations objectives.xml (Turkish) * New translations strings.xml (Turkish) * New translations strings.xml (Spanish) * New translations strings.xml (Spanish) * New translations strings.xml (Norwegian) * New translations strings.xml (Norwegian) * New translations strings.xml (Norwegian) * New translations strings.xml (Norwegian) * New translations strings.xml (Norwegian) --- app/src/main/res/values-it-rIT/strings.xml | 1 + app/src/main/res/values-iw-rIL/strings.xml | 1 + app/src/main/res/values-nl-rNL/strings.xml | 1 + app/src/main/res/values-no-rNO/strings.xml | 251 +++++++++--------- app/src/main/res/values-sk-rSK/strings.xml | 1 + app/src/main/res/values-tr-rTR/objectives.xml | 2 +- app/src/main/res/values-tr-rTR/strings.xml | 3 +- core/src/main/res/values-es-rES/strings.xml | 2 + .../src/main/res/values-no-rNO/strings.xml | 64 ++--- .../src/main/res/values-no-rNO/strings.xml | 12 +- wear/src/main/res/values-cs-rCZ/strings.xml | 4 +- wear/src/main/res/values-es-rES/strings.xml | 4 +- wear/src/main/res/values-fr-rFR/strings.xml | 2 +- wear/src/main/res/values-it-rIT/strings.xml | 2 +- wear/src/main/res/values-iw-rIL/strings.xml | 2 +- wear/src/main/res/values-nl-rNL/strings.xml | 4 +- wear/src/main/res/values-no-rNO/strings.xml | 30 ++- wear/src/main/res/values-ru-rRU/strings.xml | 2 +- wear/src/main/res/values-sk-rSK/strings.xml | 4 +- wear/src/main/res/values-tr-rTR/strings.xml | 4 +- 20 files changed, 209 insertions(+), 187 deletions(-) diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 4bcbd2d112..3ef0aad794 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -970,6 +970,7 @@ Max-BG fuori range! Temptarget:\nMin: %1$s\nMax: %2$s\nDurata: %3$s Temptarget:\nTarget: %1$s\nDurata: %2$s + Temptarget:\nMotivo: %1$s\nTarget: %2$s\nDurata: %3$s QuickWizard: %1$s\nInsulina: %2$.2fU\nCHO: %3$dg Calc. Wizard:\nInsulina: %1$.2fU\nCHO: %2$dg Mostra voce sul dispositivo: diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/app/src/main/res/values-iw-rIL/strings.xml index 498f502fc0..0be19f2f23 100644 --- a/app/src/main/res/values-iw-rIL/strings.xml +++ b/app/src/main/res/values-iw-rIL/strings.xml @@ -966,6 +966,7 @@ ערך הסוכר המקסימלי מחוץ לטווח! ע\' מטרה זמני:\nמינ\': %1$s\nמקס\': %2$s\nמשך: %3$s ע\' מטרה זמני:\nמטרה: %1$s\n משך: %2$s + ע\' מטרה זמני:\nסיבה: %1$s\nמטרה: %2$s\nמשך: %3$s אשף מהיר: %1$s\n אינס\': %2$.2f יח\'\nפחמ\': %3$d גר\' מחשבון: %1$s\n אינס\': %2$.2f יח\'\nפחמ\': %3$d גר\' הצג רשומה על המכשיר: diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index 059181d347..b1beae35b7 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -970,6 +970,7 @@ Max BG buiten bereik! Tijdelijk streefdoel:\nMin: %1$s\nMax: %2$s\nDuur: %3$s Tijdelijk streefdoel:\nDoel: %1$s\nDuur: %2$s + Tijdelijk streefdoel:\nReden: %1$s\nDoel: %2$s\nDuur: %3$s QuickWizard: %1$s\nInsuline: %2$.2fE\nKoolhy.: %3$dg Reken. Wizard:\nInsuline: %1$.2fE\nKoolhy.: %2$dg Toon invoer op apparaat: diff --git a/app/src/main/res/values-no-rNO/strings.xml b/app/src/main/res/values-no-rNO/strings.xml index c81f69586e..5967430250 100644 --- a/app/src/main/res/values-no-rNO/strings.xml +++ b/app/src/main/res/values-no-rNO/strings.xml @@ -6,8 +6,8 @@ Sikkerhet ved behandlinger Maks tillat bolus [U] Maks tillat karbo [g] - BS er under terskelverdi slik at all insulintilførsel stoppes - %1$s innstillinger + Insulintilførsel stoppes når BS er under denne terskelverdien + %1$s Innstillinger Innstillinger Oppdater behandlinger fra NS Nullstill databasene @@ -15,12 +15,12 @@ Avslutt Det ser ikke ut som mobilen støtter registrering av apper som unntas fra batterioptimalisering - du kan oppleve ytelsesproblemer. Knapper for rask tilgang til ofte brukte funksjoner - Brukt for innstilling av aktive plugin + Brukes for innstilling av aktive plugins Opplæringsprogram - Viser forhåndsinnstillinger for mat som er definert i Nightscout - Innstillinger for Humalog og NovoRapid / NovoLog insulin + Viser forhåndsinnstillinger for mat fra Nightscout + Innstillinger for Humalog og NovoRapid / NovoLog Innstillinger for Fiasp - Insulin innstillinger for Lyumjev + Innstillinger for Lyumjev Lar deg stille inn tidspunktet for toppen av insulinvirkningen. Bør bare benyttes av erfarne brukere Aktiver eller deaktiver hendelsen som trigger loop. Synkroniserer dine data med Nightscout @@ -32,17 +32,17 @@ Definer en profil som er tilgjengelig offline. Integrasjon mot pumper som ikke støttes av AndroidAPS (åpen loop) Sensitiviteten beregnes på samme måte som i Oref0, men du kan angi hvor mye av historikken som skal tas med i beregningen. Minimum opptak av karbohydrater beregnes ut fra maks karbohydratopptak angitt i dine innstillinger. - Sensitivitet beregnes fra 8t og 24t historiske dat (velger alltid det resultatet som gir høyest insulinsensitivitet. Karbohydrater som ikke er absorbert blir avsluttet etter tiden som er angitt i innstillinger. Plugin beregner også UAM. + Sensitivitet beregnes fra 8t og 24t historiske data (velger alltid det resultatet som gir høyest insulinsensitivitet). Karbohydrater (som ikke er absorbert) blir avsluttet etter tiden som er angitt i innstillinger. Plugin beregner også UAM. Sensitivitet beregnes som en vektet gjennomsnittsverdi av avvikene. Ferske avvik har høyere vekting. Minimum opptak av karbohydrater beregnes ut fra maks opptakstid for karbohydrater angitt i dine innstillinger. Denne algoritmen er den raskeste for å justere endringer i sensitivitet. - Motta BS verdier fra den modifiserte Eversense appen. - Motta BS verdier fra Glimp. - Motta BS verdier fra 600SeriesAndroidUploader. - Last ned BS verdier fra Nightscout - Motta BS verdier fra xDrip+. + Motta BS-verdier fra den modifiserte Eversense-appen. + Motta BS-verdier fra Glimp. + Motta BS-verdier fra 600SeriesAndroidUploader. + Last ned BS-verdier fra Nightscout + Motta BS-verdier fra xDrip+. Lagre data om alle behandlinger som er utført - Monitorer og kontroller AndroidAPS med din WearOS klokke. + Overvåke og styre AndroidAPS med din WearOS-klokke. Vis informasjon om loop på din xDrip+ urskive. - Fjernstyr AndroidAPS med SMS kommandoer. + Fjernstyre AndroidAPS med SMS-kommandoer. Insulin: Karbo: IOB: @@ -70,7 +70,7 @@ Måltidsdata Resultat Resultat: %1$s %2$s - Ingen BS data tilgjengelig + Ingen BS-data tilgjengelig Forespørsel Delta Delta: @@ -83,7 +83,7 @@ Profil Hvilken profil bør AndroidAPS bruke? APS - Hvilken APS algoritme skal brukes for administrasjon av behandlinger? + Hvilken algoritme skal APS benytte for behandlinger? Generelt Det er noen generelle plugins som kan være nyttige. Hvilke begrensninger brukes? @@ -92,12 +92,12 @@ Bruk dette for å aktivere AndroidAPS loop integrasjon. APS Etter behandling av begrensninger - Temp Basal satt av pumpen + Temp basal satt av pumpen INGEN APS ER VALGT ELLER HAR LEVERT RESULTAT Sikkerhet Plugin er deaktivert Brudd på begrensninger - Er registrert en feil med bolus leveransen. Sjekk manuelt om den er levert og hvor mye! + Det er registrert en feil med bolus-leveransen. Sjekk manuelt om den er levert og hvor mye Aksepter ny temp basal: Behandling Kalkulator @@ -105,24 +105,24 @@ Bolus: Basal: Endre dine inndata! - BS kilde + BS-kilde Hvor skal AndroidAPS hente sine data fra? xDrip+ APS modus - Lukket loop - Åpen loop - Stopp hvis lavt BS + Lukket Loop + Åpen Loop + Stopp ved lavt BS Loop er deaktivert Ny anbefaling tilgjengelig Karbo forslag Versjonen av Nightscout støttes ikke Basal IOB - Bolus begrensning utført - Karbohydrat begrensning utført + Bolus-begrensning utført + Karbohydrat-begrensning utført Annet Meter Sensor - Karbo tid + Karbo-tid Varighet Profil Glukosetype @@ -130,7 +130,7 @@ Forlenget bolus Nightscout versjon: Mangler %1$d g - Innstillinger lagret + Innstillinger er eksportert Brukeroppføringer er eksportert Eksporter innstillinger til Importer innstillinger fra @@ -163,27 +163,27 @@ JEG FORSTÅR OG GODTAR Lagre Les inn profil på nytt - SMS tjeneste + SMS-tjeneste Godkjente mobilnumre +XXXXXXXXXX;+YYYYYYYYYY For å levere bolus på %1$.2fE, svar med kode %2$s For å levere måltidsbolus på %1$.2fE, svar med kode %2$s For å sette Temp Target på %1$s, svar med kode %2$s For å avbryte Temp Target, svar med kode %1$s - For å deaktivere fjernstyring via SMS meldinger, svar med kode %1$s.\n\nHusk at du vil kunne reaktivere den igjen kun fra AAPS master telefon. - Fjernstyring via SMS meldinger er stanset. For å reaktivere, bruk AAPS på master telefonen. + For å deaktivere fjernstyring via SMS-meldinger, svar med kode %1$s.\n\nHusk at du vil kunne reaktivere den igjen kun fra AAPS hovedtelefon. + Fjernstyring via SMS-meldinger er stanset. For å reaktivere, bruk AAPS på hovedtelefonen. For å sende kalibrering %1$.2f, svar med kode %2$s Bolus mislyktes Minimum antall minutter som må forløpe mellom en fjernstyrt bolus og den neste Minimum antall minutter mellom en fjernstyrt bolus og neste - For din egen sikkerhet, for å endre denne innstillingen må du legge til minst 2 telefonnumre. + For din egen sikkerhet, må du legge til minst 2 telefonnumre for å endre denne innstillingen. Skal levere %1$.2f E - Bolus %1$.2f E levert vellykket - Måltidsbolus %1$.2f E levert vellykket - Temp target på %1$s er satt for %2$d minutter - Temp target på %1$s for %2$d minutter ble vellykket definert - Temp Target ble vellykket avbrutt - Tillat fjernstyring via SMS meldinger + Bolus på %1$.2f E er levert + Måltidsbolus på %1$.2f E er levert + Temp target på %1$s er satt i %2$d minutter + Temp target på %1$s i %2$d minutter ble lagret + Temp Target ble fjernet + Tillat fjernstyring via SMS-meldinger Loop har blitt deaktivert Loop har blitt aktivert Loop er aktivert @@ -193,7 +193,7 @@ Pumpe frakoblet Pumpen tilkoblet igjen Fjernstyringskommando er ikke tillatt - Fjernstyrings bolus er ikke tilgjengelig. Prøv igjen senere. + Fjernstyringsbolus er ikke tilgjengelig. Prøv igjen senere. For å starte basal %1$.2f E/t i %2$d minutter, svar med kode %3$s For å bytte profil til %1$s %2$d%%, svar med kode %3$s For å starte forlenget bolus %1$.2f E i %2$d minutter, svar med kode %3$s @@ -227,9 +227,9 @@ Måltid Korreksjon Handlinger - (FARLIG Å DEAKTIVERE) Kun NS opplast + (FARLIG Å DEAKTIVERE) Kun NS opplasting Kun NS opplasting (deaktivert sync). Ikke effektiv på SGV med mindre en lokal kilde som xDrip+ er valgt. Ikke effektiv på Profiler mens NS-Profiler brukes.\n!!! ADVARSEL !!! Deaktivering av dette alternativet kan føre til funksjonsfeil og overdosering av insulin hvis noen av dine komponenter (AAPS, NS, xDrip+) er feil konfigurert. Observer at data som vises i AAPS samsvarer med pumpestatus! - Pumpen ikke initialisert! + Pumpen er ikke startet! Prime/fylling Kontroller at mengden samsvarer med spesifikasjonen for slangesettet ditt! Standardverdier for påfyll/prime @@ -246,8 +246,8 @@ Klokke Send alle data på nytt Åpne Innstillinger på klokken - Basal rate - Basal verdi under minimum. Profilen settes ikke! + Basalrate + Basalverdi under minimum. Profilen settes ikke! BS: Siste BS: MM640G @@ -257,11 +257,11 @@ Profil OpenAPS AMA Liste med %1$d elementer.\nFaktisk verdi: - Autosens data + Autosens-data Script feilsøking Bruk Autosens funksjon Gjenoppfrisk fra NS - Slett behandlinger i fremtiden + Slett fremtidige behandlinger ACT KONF LOOP @@ -282,12 +282,12 @@ Standardverdi: 4 Dette er en viktig OpenAPS sikkerhetsbegrensning. Dette begrenser dine temp basal til max 4 ganger din nåværende basal dose, uansett hva som er maks basal i pumpen. Dette er for å unngå at man setter farlige høye maks basal doser uten at man har forstått algoritmene. Når du taket i denne begrensningen bør du i stedet fokusere på å endre andre innstillinger. Standardverdi: 1.2\nDetta er en multiplikatorbegrensning for autosens (og snart autotune) som begrenser at autosens ikke kan øke med mer enn 20%%, som dermed begrenser hvor mye autosens kan justere opp dine basaler, hvor mye ISK kan reduseres og hvor lavt BS målverdi kan settes. Standardverdi: 0.7\nDette er en multiplikatorbegrensning for autosens sikkerhet. Den begrenser autosens til å redusere basalverdier, og øke isulinssensitivitet (ISF) og BS mål med ikke mer enn enn 30%. - Autosens justerer også BS målverdier - Standard verdi: sann\nGir autosens tillatelse til å justere BS mål, i tillegg til ISF og basaler. - Standard verdi: 2\nBolus snooze er aktivt etter at du har gitt en måltidsbolus slik at loop ikke skal forsøke å sette lav-temp når du nettopp har spist. I dette eksempelet brukesg standardverdi på 2, så med en 3 timers DIA vil bolus snooze begrensning gradvis forsvinne etter 1.5 timer (3DIA / 2). Bolus snooze brukes ikke hvis SMB er aktivert. - Standardverdi er: 3.0 (AMA) eller 8.0 (SMB). Dette er grunninnstillingen for KH opptak per 5 minutt. Den påvirker hvor raskt COB skal reduseres, og benyttes i beregning av fremtidig BS kurve når BS enten synker eller øker mer enn forventet. Standardverdi er 3mg/dl/5 min. + Autosens justerer også BS-målverdier + Standard verdi: sann\nGir autosens tillatelse til å justere BS-mål, i tillegg til ISF og basaler. + Standard verdi: 2\nBolus-snooze er aktivt etter at du har gitt en måltidsbolus slik at loop ikke skal forsøke å sette lav-temp når du nettopp har spist. I dette eksempelet brukes standardverdi på 2, så med en 3 timers DIA vil bolus-snoozebegrensning gradvis forsvinne etter 1.5 timer (3DIA / 2). Bolus-snooze brukes ikke hvis SMB er aktivert. + Standardverdi er: 3.0 (AMA) eller 8.0 (SMB). Dette er grunninnstillingen for KH-opptak per 5 minutt. Den påvirker hvor raskt COB skal reduseres, og benyttes i beregning av fremtidig BS-kurve når BS enten synker eller øker mer enn forventet. Standardverdi er 3mg/dl/5 min. Advarsel!\nNormalt vil du ikke trenge å endre verdiene under. Vennligst TRYKK HER og LES teksten for å være sikker på at du FORSTÅR konsekvensene før du gjør endringer. - Ugyldig SMS mobilnummer + Ugyldig mobilnummer for SMS Kalibrering xDrip+ ikke installert Kalibrering er sendt til xDrip+ @@ -295,7 +295,7 @@ xDrip+ tar ikke imot kalibreringer Pumpen er pauset Utfører - Virtuelle pumpe innstillinger + Innstillinger for virtuell pumpe Last opp status til Nightscout NSClient NSCI @@ -305,40 +305,40 @@ NSClient Nightscout URL Oppgi din Nightscout URL - Nightscout API secret - Nightscout API secret - Oppgi NS API secret (min 12 tegn) + Nightscout API-nøkkel + Nightscout API-nøkkel + Oppgi NS API-nøkkel (min 12 tegn) Lever nå Tøm kø Vis kø Kø: Status: Tøm logg - NSCLIENT har ingen skriverettighet. Feil API secret? - Klokke innstillinger + NSCLIENT har ingen skriverettighet. Feil API-nøkkel? + Klokkeinnstillinger Vis detaljert IOB - Vis IOB med bolus och basal IOB på klokke - mislykket - sjekk telefonen + Splitt IOB til bolus- og basal-IOB på klokken + feilet - sjekk telefonen n/a - Pasient type + Pasienttype Barn Tenåring Voksen - Insulin resistent voksen + Insulinresistent voksen Graviditet - Velg pasientens type for oppsett av sikkerhetsgrenser - Pasientens navn + Velg pasienttype for oppsett av sikkerhetsgrenser + Pasientnavn Angi pasientnavn eller kallenavn for å kunne skille mellom flere oppsett Bruker Glimp - %1$s behøver å omgå batterispare funksjonene for å fungere tilfredsstillende + %1$s behøver å omgå batterisparefunksjonene for å fungere tilfredsstillende Loop pauset Pauset (%1$d m) Pause loop i 1t Pause loop i 2t Pause loop i 3t Pause loop i 10t - Frakoble pumpe + Koble fra pumpen Koble fra pumpen i 15 min Koble fra pumpen i 30 min Koble fra pumpen i 1t @@ -351,36 +351,36 @@ 3 timer 10 timer Gjenoppta - Tilkoble pumpen + Koble til pumpen Feil varighet Loop er pauset Loop gjenopptatt 15 min trend COB Superbolus - Logg app start til NS - Avslutter appen for at innstillinger skal tas i bruk. + Logg app-start til NS + Avslutter appen for å aktivere innstillinger. Hvilken type insulin bruker du? Novorapid, Novolog, Humalog Fiasp INS Aktiver superbolus i veiviser - Aktiver superbolus funksjonen i wizard. Ikke aktiver denne før du vet hvordan den fungerer. DEN KAN LEDE TIL EN OVERDOSERING AV INSULIN HVIS DEN BRUKES BLINDT! - Vis statusindikatorer på hjem skjermen - OBS: alder slangesett [h] - Advarsel: alder slangesett [h] - OBS: alder insulin [h] - Advarsel: alder insulin [h] - OBS: alder CGM [h] - Advarsel: alder CGM [h] - Nivå for når batterivarsel skal gis [%] - Nivå for når kritisk batteriadvarsel skal gis [%] - Nivå for når batterivarsel for pumpe skal gis [h] - Nivå for når kritisk batteriadvarsel for pumpe skal gis [h] - OBS: nivå insulinreservoar [U] - Advarsel: nivå insulinreservoar [U] - Nivå for når batterivarsel for pumpe skal gis [%] - Nivå for når kritisk batteriadvarsel for pumpe skal gis [%] + Aktiver superbolus-funksjonen i veiviseren. Ikke aktiver denne før du vet hvordan den fungerer. DEN KAN LEDE TIL EN OVERDOSERING AV INSULIN HVIS DEN BRUKES BLINDT! + Vis statusindikatorer på hjem-skjermen + Terskel for advarsel, alder på slangesett [h] + Terskel for kritisk alder på slangesett [h] + Terskel for advarsel, alder på insulin [h] + Terskel for kritisk alder på insulin [h] + Terskel for advarsel, alder på CGM [h] + Terskel for kritisk alder på CGM [h] + Terskel for advarsel, batterinivå for sensor [%] + Terskel for kritisk batterinivå for sensor [%] + Terskel for advarsel, batterialder for pumpe [h] + Terskel for kritisk batterialder for pumpe [h] + Terskel for advarsel, insulinreservoar [U] + Terskel for kritisk insulinreservoar [U] + Terskel for advarsel, batterinivå for pumpe [%] + Terskel for kritisk batterinivå for pumpe [%] PROGN BAS DEV @@ -389,8 +389,8 @@ ABS DEVSLOPE Om - Mangler SMS tillatelse - Mangler app tillatelse til telefon + Mangler SMS-tillatelse + Appen mangler tilgang til telefonstatus xDrip+ Status (klokke) xDrip+ Statuslinje (klokke) xds @@ -400,45 +400,47 @@ Gjør profilbytte Sensor Insulin - Pumpe batteri + Pumpebatteri alder: nivå: - Alarm valg - Opprett varsler fra NS alarmer - Opprett varsler fra NS meldinger - Ingen data advarsel [min] - Kritisk mangel på data advarsel [min] + Alarmvalg + Opprett varsler fra NS-alarmer + Opprett varsler fra NS-meldinger + Advarsel ved manglende data [min] + Advarsel ved kritisk mangel på data [min] Intervall for autosens [h] Antall timer med historiske data for beregning av sensitivitet (absorpsjonstid for KH er ekskludert) OpenAPS Opplaster - Sensitivitets deteksjon + Sensitivitetsdeteksjon Hvilken sensitivitetsalgoritme skal benyttes? SENS Sensitivitet Oref1 Sensitivitet AAPS - Absorpsjon innstillinger + Absorpsjonsinnstillinger Maks absorpsjonstid for måltid [h] Tid i timer hvor det forventes at alle karbohydrater fra måltid vil være absorbert OAPS UPLD BAS Hold skjermen påslått - Forhindre Android å slå av skjermen. Mobil vil bruke mye batteri hvis den ikke plugges til strømledning. - Hvis du slår på Autosense funksjonen må du huske å angi alle spiste karbohydrater. Ellers vil KH avvik gi feil i sensitivitetsberegningen !! + Forhindre Android fra å slå av skjermen. Mobilen vil bruke mye batteri hvis den ikke plugges til strømledning. + Hvis du slår på Autosense-funksjonen må du huske å angi alle spiste karbohydrater. Ellers vil KH-avvik gi feil i sensitivitetsberegningen !! Sensitivitet vektet middelverdi Ikke alle profiler ble lastet! Verdier ikke lagret! - Aktiver kringkasting til andre apper (som xDrip+). Ikke aktiver dette hvis du har mer enn en AAPS eller NSClient installert! - Aktiver lokale sendinger. + Aktiver kringkasting til andre apper (som xDrip+). Ikke aktiver dette hvis du har mer enn én AAPS eller NSClient installert! + Aktiver deling av data mellom apper på telefonen. OpenAPS SMB Dynamisk ISF + DynamiskISF justeringsfaktor % + Justeringsfaktor for dynamisk ISF. Verdier over 100% vil gi mer aggressive korreksjonsdoser, mens verdier under 100% vil gi mildere korreksjonsdoser. Aktiver UAM Aktiver SMB - Bruk Super Mikro Solen i stedet for temp basal for raskere resultat - Oppdaget uannonsert måltid (UAM) - IOB kurvens topp tid - Topp tid [min] + Bruk Super Mikro Bolus i stedet for temp basal for raskere resultat + Oppdag uannonsert måltid (UAM) + IOB-kurvens topptid + Topptid [min] Topp Free-Peak Oref Rapid-Acting Oref @@ -450,10 +452,10 @@ Prosent Tidsforskyving Standard temp mål - spise snart varighet - spise snart målverdi - aktivitet varighet - aktivitet målverdi + spise snart-varighet + spise snart-målverdi + varighet for aktivitet + målverdi ved aktivitet hypo varighet hypo målverdi Gjenbruk %1$d%% %2$dt @@ -467,52 +469,52 @@ Pr Fett Kommandoen utføres akkurat nå - Mangler BS målinger + Mangler BS-målinger Bruk systemvarslinger for alarmer og varslinger Øk volumet gradvis for alarmer og varsler Lokale varsler - Varsel hvis ingen BS data mottas + Varsel hvis ingen BS-data mottas Varsel hvis pumpen er utilgjengelig Pumpen er ikke tilgjengelig etter [min] Varsel hvis karbohydrater må tilføres Kritisk alarm INFO Eversense App (patched) - Last opp BS data til NS - BS opplast innstillinger + Last opp BS-data til NS + Innstillinger for opplasting av BS Vis detaljer om delta Vis delta med én ekstra desimal Minste antall minutter mellom hver SMB Maks antall minutter med basal som kan bli SMB UAM SMB maks minutter Maks antall minutter basal som kan bli SMB ved UAM - Minimumsgrense for KH forslag + Minimumsgrense for KH-forslag Minimum mengde karbohydrater i gram for å vise advarsel. Behov under denne grenseverdien vil ikke vises som et varsel. - Send BS data til xDrip+ - I xDrip+ velg 640G/Eversens som datakilde + Send BS-data til xDrip+ + I xDrip+, velg 640G/Eversens som datakilde NSClient BS NS BS - BS beregning - Bolus IOB beregning - Basal IOB beregning - Trend beregning - Superbolus beregning + BS-beregning + Bolus IOB-beregning + Basal IOB-beregning + Trendberegning + Superbolus-beregning Bare positive Bare negative - COB beregning - Temp target beregning - Prosent beregning + COB-beregning + Beregning av temp target + Prosentvis beregning Loop er aktivert APS valgt - NSClient har skrive rettigheter + NSClient har skriverettigheter Lukket loop aktivert Maks IOB er angitt riktig BS tilgjengelig fra valgt kilde Forlenget bolus feilet - Aktiverer alltid SMB + Aktiver alltid SMB Aktiver alltid SMB uavhengig av boluser. Bare mulig med en bra filtrert BS kilde som f.eks. Dexcom G5/G6 Aktiver SMB etter karbohydrater - Aktiver SMB i 6t etter karbohydrat inntak, selv med 0 IOB. Bare mulig med en bra filtrert BS kilde som f. eks. Dexcom G5/G6 + Aktiver SMB i 6t etter karbohydratinntak, selv med 0 IOB. Bare mulig med en bra filtrert BS kilde som f. eks. Dexcom G5/G6 Aktiver SMB med COB Aktiver SMB når COB er aktiv. Aktiver SMB med temp målverdi @@ -522,7 +524,7 @@ Insulin Knapper Sender en kalibrering til xDrip+ eller åpne kalibreringsdialogen i BYODA - Åpner xDrip+ eller BYODA, tilbake knappen får deg tilbake til AAPS + Åpner xDrip+ eller BYODA, tilbake-knappen får deg tilbake til AAPS Antall karbohydrater som skal legges til når knappen trykkes Mengde insulin som skal legges til når knappen trykkes inn Kunne ikke starte CGM-programmet. Kontroller at det er installert. @@ -564,7 +566,7 @@ Start Hypo TT Du kjører dev-versjonen. Lukket loop ikke aktivert. Engineering Mode aktivert - Profil bytte mangler. Utfør et profil bytte og trykk på \"Aktiver profil\" i din lokale profil. + Profilbytte mangler. Utfør et profilbytte og trykk på \"Aktiver profil\" i din lokale profil. Pumpen støtter ikke temp basaler Lukket Loop deaktivert i innstillinger Autosens deaktivert i innstillinger @@ -968,6 +970,7 @@ Maks-BS utenfor område! Temp target:\nMin: %1$s\nMaks: %2$s\nVarighet: %3$s TempTarget:\nMål: %1$s\nVarighet: %2$s + TempTarget:\nÅrsak: %1$s\nMål: %2$s\nVarighet: %3$s QuickWizard: %1$s\ninsulin: %2$.2fE\nKarbo: %3$dg Kalk. Wizard:\nInsulin: %1$.2fE\nKarbo: %2$dg Vis oppføring på enhet: @@ -997,7 +1000,7 @@ Oppdater fra Nightscout Fjern valgte elementer Velg hva som skal fjernes - Profil endringer + Profilendringer Temp Target Karbohydrater og bolus Er du sikker på at du vil fjerne %1$d elementer diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index d0a550b70c..5b7a784c4d 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -970,6 +970,7 @@ Maximálna glykémia mimo rozsah! Doč. cieľ:\nMin: %1$s\nMax: %2$s\nTrvanie: %3$s Doč. cieľ:\nCieľ: %1$s\nTrvanie: %2$s + Doč. cieľ:\nDôvod: %1$s\nCieľ: %2$s\nTrvanie: %3$s Rýchly bolus: %1$s\nInzulín: %2$.2fJI\nSacharidy: %3$dg Kalkulačka: \nInzulín: %1$.2fJI\nSacharidy: %2$dg Zobraziť záznam na zariadení: diff --git a/app/src/main/res/values-tr-rTR/objectives.xml b/app/src/main/res/values-tr-rTR/objectives.xml index f34abb589c..4f5d4a7a1b 100644 --- a/app/src/main/res/values-tr-rTR/objectives.xml +++ b/app/src/main/res/values-tr-rTR/objectives.xml @@ -11,7 +11,7 @@ Birkaç gün boyunca Açık Döngü modunda çalıştırın ve birçok geçici bazalı el yordamı ile girin. Geçici ve varsayılan geçici hedefleri düzenleyin ve kullanın (örn. egzersiz ve hipo-tedaviyi desteklemek için) Geçici bazal tavsiyeleri de dahil olmak üzere Açık Döngüyü anlamak Bu deneyime dayanarak, max bazalın ne olması gerektiğine karar vermeli ve bunu pompa ve tercihlere koymalısınız - Kapalı Döngü, (LGS) Düşük Glikoz Süspansiyonu modunda başlatılıyor + Kapalı Döngü, (LGS) Düşük Glikoz Duraklatma modunda başlatılıyor Kapalı Döngüyü, maks IOB = 0 olacak şekilde çok sayıda LGS (düşük KŞ) olmadan birkaç gün boyunca deneyin Kapalı Döngü\'de ince ayarlar, maks (IOB) Aktif İnsülini 0\'ın üzerine yükseltme ve yavaş yavaş KŞ hedeflerini aşağıya çekme KŞ hedefini azaltmadan önce birkaç gün ve en az bir gece düşük KŞ (Hipo) alarmı olmadan deneyin diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index 7737bbb046..7e728fcaef 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -110,7 +110,7 @@ APS modu Kapalı Döngü Açık Döngü - Düşük Glikoz Süspansiyonu + Düşük Glikoz Duraklatma (LGS) Döngü devre dışı Yeni öneri mevcut Karbonhidrat Önerisi @@ -970,6 +970,7 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d Maks-KŞ aralık dışında! Geçici Hedef:\nMin: %1$s\nMaks: %2$s\nSüre: %3$s Geçici Hedef:\nHedef: %1$s\nSüre: %2$s + Geçicihedef:\nNeden: %1$s\nHedef: %2$s\nSüre: %3$s Hızlı Asistan: %1$s\nİnsülin: %2$.2fU\nKarb: %3$dg Hesap Mak.:\nİnsulin: %1$.2fÜ\nKarb: %2$dg Girişi cihazda göster: diff --git a/core/src/main/res/values-es-rES/strings.xml b/core/src/main/res/values-es-rES/strings.xml index 19f888b736..6c427b6661 100644 --- a/core/src/main/res/values-es-rES/strings.xml +++ b/core/src/main/res/values-es-rES/strings.xml @@ -464,6 +464,8 @@ Última ejecución : Advertencia : Selecciona el perfil para a ajustar + Autotune sólo funciona con un único valor de IC. Tu perfil tiene %1$d valores. El valor promedio es %2$.2fg/U + Autotune sólo funciona con un único valor de ISF. Tu perfil tiene %1$d valores. El valor promedio es %2$.1f%3$s/U Error en los datos de entrada, intenta ejecutar de nuevo autotune o reducir el número de días Cálculo de autototune iniciado, por favor ten paciencia ¡Comprueba los resultados cuidadosamente antes de usarlos! diff --git a/omnipod-common/src/main/res/values-no-rNO/strings.xml b/omnipod-common/src/main/res/values-no-rNO/strings.xml index 258e97569e..48aaea828d 100644 --- a/omnipod-common/src/main/res/values-no-rNO/strings.xml +++ b/omnipod-common/src/main/res/values-no-rNO/strings.xml @@ -9,29 +9,29 @@ Deaktiver Pod Forkast Pod Dersom du forkaster Pod, vil du ikke kunne kommunisere med den lenger. Du skal bare gjøre dette når all kommunikasjon med Pod vedvarende mislykkes. Hvis du fortsatt kan kommunisere med Pod, bruk alternativet Deaktiver Pod.\n\nHvis du ønsker å fortsette, må du huske på å fjerne Pod fra kroppen din! - Avspill testlyd - Avspiller testlyd… - Pod historikk + Spill av testlyd + Spiller av testlyd… + Pod-historikk Ingen aktiv Pod - Feilet i å lagre basalprofilen. + Kunne ikke lagre basalprofilen. Bolus var mislykket. - Feilet i å lagre basal profil: mottok en tom profil. Kontroller at du har aktivert profilen. - Ingen basal profil er aktiv. Sørg for å aktivere din basal profil. + Kunne ikke lagre basalprofil: mottok en tom profil. Kontroller at du har aktivert profilen. + Ingen basalprofil er aktiv. Sørg for å aktivere din basalprofil. Ukjent kommando: %1$s Feilet i å oppdatere status - Feilet i å oppdatere status ved oppstart - Feilet i å bekrefte varsler - Feilet i å stoppe insulinleveranser - Feilet i å angi tid - Feilet i å gjenoppta leveransen + Kunne ikke oppdatere status ved oppstart + Kunne ikke bekrefte varsler + Kunne ikke stoppe insulinleveranser + Kunne ikke angi tid + Kunne ikke gjenoppta leveransen Feilet i å initialisere Pod Feilet ved innsetting av kanyle Pod\'ens aktiveringstid er overskredet. Denne Pod kan ikke lenger aktiveres. Klarte ikke å verifisere fremdrift i aktiveringen. Prøv på nytt. Pod er pauset - Feilet i avspilling av test lyd - Tid på Pod er ikke synkronisert. Vennligst oppdater tiden i Omnipod fanen. + Kunne ikke spille av testlyd + Tid på Pod er ikke synkronisert. Vennligst oppdater tiden i Omnipod-fanen. En uventet feil oppstod. Vennligst rapporter! (%1$s: %2$s). Bekreftelse @@ -45,21 +45,21 @@ Angi tid Pauset Gjenoppta levering - Pod administrasjon + Pod-administrasjon Demp varsler Pod status Totalt levert %1$.2f E Unik ID LOT nummer - Sekvens nummer + Sekvensnummer Pod utløper Siste tilkobling Siste bolus - Temp basal rate - Profilens basal dose + Midlertidig basaldose + Profilens basaldose Reservoar - Aktive Pod varsler + Aktive Pod-varsler Firmware versjon Tid på Pod %1$.2fE/t @%2$s (%3$d/%4$d minutter) @@ -82,7 +82,7 @@ Klargjør infusjonsstedet. Fjern Pod\'ens kanylebeskyttelse og papirfolien, og fest Pod til infusjonsstedet.\n\nHvis du oppdager feil med kanylen, trykk Avbryt og forkast Pod.\n\nTrykk Neste for å sette inn kanyle og starte påfyllingsbolus. Når du trykker OKvil kanylen settes inn. Pass på at du har festet Pod\'en på infusjonsstedet. Sett inn kanyle - Prøver å angi initialt basal program og sett inn kanylen.\n\nNår kanylen er vellykket på plass kan du trykke på Neste. + Prøver å angi basalprogram og sette inn kanylen.\n\nNår kanylen er vellykket på plass kan du trykke på Neste. Pod aktivert Den nye Pod\'en er nå aktiv.\n\nDin basalprofil har blitt lagret og kanylen er inne.\n\nVennligst kontroller at kanylen ble satt riktig inn og skift Pod hvis du tror det har oppstått feil med innsettingen. @@ -97,20 +97,20 @@ Dersom du forkaster Pod vil du ikke være i stand til å kommunisere med den lenger. Du skal bare gjøre dette når all kommunikasjon med Pod konsekvent feiler. Er du sikker på at du vil forkaste Pod? Forkast Pod - Bolus lyd aktivert - Basal lyd aktivert + Bolus-lyd aktivert + Basal-lyd aktivert SMB lyd aktivert - TBR lyd aktivert + TBR-lyd aktivert Vis Pause insulintilførsel knapp i Omnipod meny - DST/Tidssone deteksjon aktivert + DST/Tidssone-deteksjon aktivert Utløpspåminnelse aktivert Timer før nedstenging Varsel om lavt reservoar aktivert Antall enheter - Automatisk demp Pod varsler + Automatisk demp Pod-varsler Annet Varsler - Bekreftelse lyd + Bekreftelseslyd Varsler Lydvarsel for ubekreftet temp basal dosering (TBR) er aktivert Lydvarsel for ubekreftet SMB er aktivert @@ -121,7 +121,7 @@ Oppsett pågår (venter på innsetting av kanyle) Kjører Pauset - Pod feil + Pod-feil Aktiveringstiden er overskredet Inaktiv Pod feil: %1$03d %2$s @@ -130,12 +130,12 @@ Forkast Pod Angi Bolus Avbryt bolus - Angi Temp Basal - Avbryt temp basal (internt av driver) - Avbryt temp basal + Angi Midlertidig Basal + Avbryt midlertidig basal (internt av driver) + Avbryt midlertidig basal Angi basal program - Les Pod status - Les Pod info + Hent Pod-status + Hent Pod-info Angi tid Konfigurer varsler Demp varsler @@ -149,7 +149,7 @@ Avbryt vilkårlig midlertidig basal som er opprettet fordi Pod var pauset Del midlertidig basal fordi en uavklart feil ble oppdaget ved kanselleringen Oppsett lyd - Avspill testlyd + Spill av testlyd Fullfør parringspåminnelse Påminnelse om å fullføre oppsett diff --git a/omnipod-dash/src/main/res/values-no-rNO/strings.xml b/omnipod-dash/src/main/res/values-no-rNO/strings.xml index 9eb18fa172..d80f5ba0ae 100644 --- a/omnipod-dash/src/main/res/values-no-rNO/strings.xml +++ b/omnipod-dash/src/main/res/values-no-rNO/strings.xml @@ -4,7 +4,7 @@ Pumpeintegrering for Omnipod Dash (den nye, Bluetooth-aktiverte modellen med en blå kanylehette). - Pod historikk + Pod-historikk Beskrivelse Kilde Dato @@ -13,13 +13,13 @@ %1$.2f E, KH=%2$.1f g Dosering: %1$.2f E, varighet: %2$d min - Bluetooth status - Bluetooth adresse + Bluetooth-status + Bluetooth-adresse Firmware %1$s / Bluetooth %2$s - Tilkoblingskvalitet Bluetooth + Bluetooth tilkoblingskvalitet Leveringsstatus - Fyll en ny Pod med nok insulin for 3 dager.\n\nLytt etter to lydsignaler fra Pod under fyllingen. De indikerer at minimums volum på 80E er fylt opp. Vær nøye med å tømme fyllingssprøyten helt, selv etter at du har hørt de to lydsignalene.\n\nEtter fylling av Pod, vennligst trykk Neste.\n\nMerk: vent med å fjerne kanylebeskyttelsen til Pod. + Fyll en ny Pod med nok insulin for 3 dager.\n\nLytt etter to lydsignaler fra Pod under fyllingen. De indikerer at minimumsvolum på 80E er fylt opp. Vær nøye med å tømme fyllingssprøyten helt, selv etter at du har hørt de to lydsignalene.\n\nEtter fylling av Pod, vennligst trykk Neste.\n\nMerk: vent med å fjerne kanylebeskyttelsen til Pod. Prøver å parre med den nye Pod og prime den.\n\nNår oppstartsprosessen er ferdig, kan du trykke Neste. Lydvarsel aktivert hvis insulinlevering blir stanset @@ -27,7 +27,7 @@ Fant for mange podder for aktivering Fant ingen pod tilgjengelig for aktivering Generell feil: %1$s - Feilet i å sende kommandoen + Kunne ikke sende kommandoen Kommando ikke sendt Kommandoen ikke mottatt av podden Ukjent tilstand for kommandoen diff --git a/wear/src/main/res/values-cs-rCZ/strings.xml b/wear/src/main/res/values-cs-rCZ/strings.xml index 84ebb1a0ae..5c8f9a308d 100644 --- a/wear/src/main/res/values-cs-rCZ/strings.xml +++ b/wear/src/main/res/values-cs-rCZ/strings.xml @@ -182,6 +182,8 @@ --- mg/dl Žádný stav smyčky 000g - 00,0 + 00,0 0,00U + AAPS Potvrzení výstrahy + Odesílání potvrzení do AAPS diff --git a/wear/src/main/res/values-es-rES/strings.xml b/wear/src/main/res/values-es-rES/strings.xml index 680c610a92..bf386fac5c 100644 --- a/wear/src/main/res/values-es-rES/strings.xml +++ b/wear/src/main/res/values-es-rES/strings.xml @@ -182,6 +182,8 @@ --- mg/dl Sin estado del lazo 000g - 00,0 + 00,0 0,00U + Posponer Alertas de AAPS + Enviando aplazamientos a AAPS diff --git a/wear/src/main/res/values-fr-rFR/strings.xml b/wear/src/main/res/values-fr-rFR/strings.xml index 645f5d699b..e4bd273b2d 100644 --- a/wear/src/main/res/values-fr-rFR/strings.xml +++ b/wear/src/main/res/values-fr-rFR/strings.xml @@ -182,6 +182,6 @@ --- mg/dl Aucun statut de la boucle 000 g - 00,0 + 00,0 0,00 U diff --git a/wear/src/main/res/values-it-rIT/strings.xml b/wear/src/main/res/values-it-rIT/strings.xml index b6a8e15f35..ccf8bfec97 100644 --- a/wear/src/main/res/values-it-rIT/strings.xml +++ b/wear/src/main/res/values-it-rIT/strings.xml @@ -182,6 +182,6 @@ --- mg/dl Nessun stato di loop 000g - 00,0 + 00,0 0,00U diff --git a/wear/src/main/res/values-iw-rIL/strings.xml b/wear/src/main/res/values-iw-rIL/strings.xml index d2a3183b5d..05ff9fe014 100644 --- a/wear/src/main/res/values-iw-rIL/strings.xml +++ b/wear/src/main/res/values-iw-rIL/strings.xml @@ -182,6 +182,6 @@ --- mg/dl חסר סטטוס לולאה 000 גר\' - 00,0 + 00,0 0,00 יח\' diff --git a/wear/src/main/res/values-nl-rNL/strings.xml b/wear/src/main/res/values-nl-rNL/strings.xml index 47492205a0..7dd82b44a5 100644 --- a/wear/src/main/res/values-nl-rNL/strings.xml +++ b/wear/src/main/res/values-nl-rNL/strings.xml @@ -182,6 +182,8 @@ --- mg/dl Geen Loop Status 000g - 00,0 + 00,0 0,00E + AAPS Sluimer Alarm + Snooze versturen naar AAPS diff --git a/wear/src/main/res/values-no-rNO/strings.xml b/wear/src/main/res/values-no-rNO/strings.xml index 94fe4309d0..ea4deaf2ee 100644 --- a/wear/src/main/res/values-no-rNO/strings.xml +++ b/wear/src/main/res/values-no-rNO/strings.xml @@ -61,11 +61,11 @@ Prime i menyen Enkel måleverdi Kalkulator prosent - Komplikasjon trykk handling - Unicode ikomplikasjoner + Handling ved trykk på komplikasjon + Unicode i komplikasjoner Versjon: - Fler urskive innstillinger - Vennligst sjekk urskive innstillinger. + Flere innstillinger for urskive + Vennligst sjekk urskiveinnstillinger. TempT Kalkulator Kalk @@ -128,7 +128,7 @@ blågrønn grønn lysegrønn - gulgrønn + limegrønn gul rødbrun oransje @@ -139,20 +139,20 @@ hvit svart flerfarget - Forenklet brukergrensesnittet + Forenklet brukergrensesnitt Vis kun tid og BS Vibrer hver time Vis ukenummer Din stil: ingen stil - minimal palette - definert palette - full palette - Dine farger: + minimalistisk stil + form-stil + full stil + Din farge: Din fargemetning: - Din farge gjennomsiktighet: - AAPS bolus framdrift - AAPS stille bolus framdrift + Din gjennomsiktighet: + AAPS bolus-framdrift + AAPS stille bolus-framdrift Bolus framdrift og avbryt Bolus framdrift og avbryt med mindre vibrasjoner Av @@ -182,6 +182,8 @@ --- mg/dl Ingen loop status 000g - 00,0 + 00,0 0,00E + AAPS slumre-varsel + Sender slumring til AAPS diff --git a/wear/src/main/res/values-ru-rRU/strings.xml b/wear/src/main/res/values-ru-rRU/strings.xml index 4f320cac43..034531f610 100644 --- a/wear/src/main/res/values-ru-rRU/strings.xml +++ b/wear/src/main/res/values-ru-rRU/strings.xml @@ -182,6 +182,6 @@ --- мг/дл Нет статуса 000г - 00,0 + 00,0 0,00 ед diff --git a/wear/src/main/res/values-sk-rSK/strings.xml b/wear/src/main/res/values-sk-rSK/strings.xml index 49db0a922f..8f2e92e153 100644 --- a/wear/src/main/res/values-sk-rSK/strings.xml +++ b/wear/src/main/res/values-sk-rSK/strings.xml @@ -182,6 +182,8 @@ --- mg/dl Žiadny stav uzavretého okruhu 000g - 00,0 + 00,0 0,00JI + AAPS Potvrdenie výstrahy + Odosielanie potvrdení do AAPS diff --git a/wear/src/main/res/values-tr-rTR/strings.xml b/wear/src/main/res/values-tr-rTR/strings.xml index 5754310521..f9db54975d 100644 --- a/wear/src/main/res/values-tr-rTR/strings.xml +++ b/wear/src/main/res/values-tr-rTR/strings.xml @@ -182,6 +182,8 @@ --- mg/dl Döngü Durumu Yok 000g - 00,0 + 00,0 0,00Ü + AAPS Uyarı Erteleme + AAPS\'ye Erteleme Gönderme From e83d10d856aeccdeeeb62db707aeaad45d3a67f1 Mon Sep 17 00:00:00 2001 From: Andries Smit Date: Thu, 30 Jun 2022 20:29:04 +0200 Subject: [PATCH 033/154] chore: wear plus min center label min button --- .../main/res/layout/action_editplusmin_quicklefty_multi.xml | 6 ++---- .../res/layout/action_editplusmin_quickrighty_multi.xml | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/wear/src/main/res/layout/action_editplusmin_quicklefty_multi.xml b/wear/src/main/res/layout/action_editplusmin_quicklefty_multi.xml index d5acf0460d..044232b032 100644 --- a/wear/src/main/res/layout/action_editplusmin_quicklefty_multi.xml +++ b/wear/src/main/res/layout/action_editplusmin_quicklefty_multi.xml @@ -100,10 +100,8 @@ android:layout_width="108dp" android:layout_height="108dp" app:layout_constraintBottom_toTopOf="@+id/min_button" - app:layout_constraintCircle="@+id/center" - app:layout_constraintCircleAngle="55" - app:layout_constraintCircleRadius="40dp" - app:layout_constraintLeft_toRightOf="@id/plus_button3" /> + app:layout_constraintLeft_toLeftOf="@+id/min_button" + app:layout_constraintRight_toRightOf="@+id/min_button"/> + app:layout_constraintRight_toRightOf="@id/min_button" + app:layout_constraintLeft_toLeftOf="@id/min_button"/> Date: Thu, 30 Jun 2022 23:44:32 +0200 Subject: [PATCH 034/154] MDT: fix initialization --- .../pump/medtronic/MedtronicFragment.kt | 42 +++++++++---------- .../pump/medtronic/MedtronicPumpPlugin.kt | 29 ++++--------- .../service/RileyLinkBroadcastReceiver.kt | 5 +-- .../hw/rileylink/service/RileyLinkService.kt | 2 +- .../service/RileyLinkServiceData.java | 6 +-- 5 files changed, 34 insertions(+), 50 deletions(-) diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt index e3e0642a70..d65509810f 100644 --- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt +++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt @@ -2,7 +2,6 @@ package info.nightscout.androidaps.plugins.pump.medtronic import android.annotation.SuppressLint import android.content.Intent -import android.graphics.Color import android.os.Bundle import android.os.Handler import android.os.HandlerThread @@ -16,13 +15,11 @@ import info.nightscout.androidaps.events.EventTempBasalChange import info.nightscout.androidaps.interfaces.ActivePlugin import info.nightscout.androidaps.interfaces.CommandQueue import info.nightscout.androidaps.interfaces.PumpSync -import info.nightscout.shared.logging.AAPSLogger -import info.nightscout.shared.logging.LTag +import info.nightscout.androidaps.interfaces.ResourceHelper import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.plugins.pump.common.defs.PumpDeviceState import info.nightscout.androidaps.plugins.pump.common.events.EventRefreshButtonState import info.nightscout.androidaps.plugins.pump.common.events.EventRileyLinkDeviceStatusChange -import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.dialog.RileyLinkStatusActivity @@ -42,8 +39,9 @@ import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.T import info.nightscout.androidaps.utils.WarnColors import info.nightscout.androidaps.utils.alertDialogs.OKDialog -import info.nightscout.androidaps.interfaces.ResourceHelper import info.nightscout.androidaps.utils.rx.AapsSchedulers +import info.nightscout.shared.logging.AAPSLogger +import info.nightscout.shared.logging.LTag import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign import javax.inject.Inject @@ -59,7 +57,6 @@ class MedtronicFragment : DaggerFragment() { @Inject lateinit var activePlugin: ActivePlugin @Inject lateinit var medtronicPumpPlugin: MedtronicPumpPlugin @Inject lateinit var warnColors: WarnColors - @Inject lateinit var rileyLinkUtil: RileyLinkUtil @Inject lateinit var medtronicUtil: MedtronicUtil @Inject lateinit var medtronicPumpStatus: MedtronicPumpStatus @Inject lateinit var rileyLinkServiceData: RileyLinkServiceData @@ -92,7 +89,7 @@ class MedtronicFragment : DaggerFragment() { binding.rlStatus.text = rh.gs(RileyLinkServiceState.NotStarted.resourceId) - binding.pumpStatusIcon.setTextColor(rh.gac(context,R.attr.defaultTextColor)) + binding.pumpStatusIcon.setTextColor(rh.gac(context, R.attr.defaultTextColor)) @SuppressLint("SetTextI18n") binding.pumpStatusIcon.text = "{fa-bed}" @@ -139,9 +136,9 @@ class MedtronicFragment : DaggerFragment() { .toObservable(EventRileyLinkDeviceStatusChange::class.java) .observeOn(aapsSchedulers.main) .subscribe({ - aapsLogger.debug(LTag.PUMP, "onStatusEvent(EventRileyLinkDeviceStatusChange): $it") - setDeviceStatus() - }, fabricPrivacy::logException) + aapsLogger.debug(LTag.PUMP, "onStatusEvent(EventRileyLinkDeviceStatusChange): $it") + setDeviceStatus() + }, fabricPrivacy::logException) disposable += rxBus .toObservable(EventMedtronicPumpValuesChanged::class.java) .observeOn(aapsSchedulers.main) @@ -158,10 +155,10 @@ class MedtronicFragment : DaggerFragment() { .toObservable(EventMedtronicPumpConfigurationChanged::class.java) .observeOn(aapsSchedulers.main) .subscribe({ - aapsLogger.debug(LTag.PUMP, "EventMedtronicPumpConfigurationChanged triggered") - medtronicPumpPlugin.rileyLinkService?.verifyConfiguration() - updateGUI() - }, fabricPrivacy::logException) + aapsLogger.debug(LTag.PUMP, "EventMedtronicPumpConfigurationChanged triggered") + medtronicPumpPlugin.rileyLinkService?.verifyConfiguration() + updateGUI() + }, fabricPrivacy::logException) disposable += rxBus .toObservable(EventPumpStatusChanged::class.java) .observeOn(aapsSchedulers.main) @@ -200,7 +197,7 @@ class MedtronicFragment : DaggerFragment() { rileyLinkServiceData.rileyLinkServiceState.isError && rileyLinkError != null -> "{fa-bluetooth-b} " + rh.gs(rileyLinkError.getResourceId(RileyLinkTargetDevice.MedtronicPump)) else -> "{fa-bluetooth-b} " + rh.gs(resourceId) } - binding.rlStatus.setTextColor(rh.gac( context, if (rileyLinkError != null) R.attr.warningColor else R.attr.defaultTextColor)) + binding.rlStatus.setTextColor(rh.gac(context, if (rileyLinkError != null) R.attr.warningColor else R.attr.defaultTextColor)) binding.errors.text = rileyLinkServiceData.rileyLinkError?.let { @@ -253,8 +250,10 @@ class MedtronicFragment : DaggerFragment() { private fun displayNotConfiguredDialog() { context?.let { - OKDialog.show(it, rh.gs(R.string.medtronic_warning), - rh.gs(R.string.medtronic_error_operation_not_possible_no_configuration), null) + OKDialog.show( + it, rh.gs(R.string.medtronic_warning), + rh.gs(R.string.medtronic_error_operation_not_possible_no_configuration), null + ) } } @@ -272,7 +271,7 @@ class MedtronicFragment : DaggerFragment() { val min = (System.currentTimeMillis() - medtronicPumpStatus.lastConnection) / 1000 / 60 if (medtronicPumpStatus.lastConnection + 60 * 1000 > System.currentTimeMillis()) { binding.lastConnection.setText(R.string.medtronic_pump_connected_now) - binding.lastConnection.setTextColor(rh.gac(context,R.attr.defaultTextColor)) + binding.lastConnection.setTextColor(rh.gac(context, R.attr.defaultTextColor)) } else if (medtronicPumpStatus.lastConnection + 30 * 60 * 1000 < System.currentTimeMillis()) { if (min < 60) { @@ -288,10 +287,10 @@ class MedtronicFragment : DaggerFragment() { binding.lastConnection.text = (rh.gq(R.plurals.duration_days, d, d) + " " + rh.gs(R.string.ago)) } - binding.lastConnection.setTextColor(rh.gac(context,R.attr.warningColor)) + binding.lastConnection.setTextColor(rh.gac(context, R.attr.warningColor)) } else { binding.lastConnection.text = minAgo - binding.lastConnection.setTextColor(rh.gac(context,R.attr.defaultTextColor)) + binding.lastConnection.setTextColor(rh.gac(context, R.attr.defaultTextColor)) } } @@ -329,7 +328,8 @@ class MedtronicFragment : DaggerFragment() { if (medtronicPumpStatus.batteryType == BatteryType.None || medtronicPumpStatus.batteryVoltage == null) { binding.pumpStateBattery.text = "{fa-battery-" + medtronicPumpStatus.batteryRemaining / 25 + "} " } else { - binding.pumpStateBattery.text = "{fa-battery-" + medtronicPumpStatus.batteryRemaining / 25 + "} " + medtronicPumpStatus.batteryRemaining + "%" + String.format(" (%.2f V)", medtronicPumpStatus.batteryVoltage) + binding.pumpStateBattery.text = + "{fa-battery-" + medtronicPumpStatus.batteryRemaining / 25 + "} " + medtronicPumpStatus.batteryRemaining + "%" + String.format(" (%.2f V)", medtronicPumpStatus.batteryVoltage) } warnColors.setColorInverse(binding.pumpStateBattery, medtronicPumpStatus.batteryRemaining.toDouble(), 25.0, 10.0) diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt index 2fbebf5bf7..01ff035702 100644 --- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt +++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt @@ -55,6 +55,7 @@ import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.TimeChangeType import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.androidaps.plugins.pump.common.data.PumpStatus import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.shared.logging.AAPSLogger import info.nightscout.shared.logging.LTag @@ -215,27 +216,13 @@ class MedtronicPumpPlugin @Inject constructor( }.start() } - override val serviceClass: Class<*> - get() = RileyLinkMedtronicService::class.java - - override val pumpStatusData: info.nightscout.androidaps.plugins.pump.common.data.PumpStatus - get() = medtronicPumpStatus - - override fun deviceID(): String { - return "Medtronic" - } - - override val isFakingTempsByExtendedBoluses: Boolean - get() = false - - override fun canHandleDST(): Boolean { - return false - } - - // Pump Plugin + override val serviceClass: Class<*> = RileyLinkMedtronicService::class.java + override val pumpStatusData: PumpStatus get() = medtronicPumpStatus + override fun deviceID(): String = "Medtronic" + override val isFakingTempsByExtendedBoluses: Boolean = false + override fun canHandleDST(): Boolean = false private var isServiceSet: Boolean = false - - override val rileyLinkService: RileyLinkMedtronicService? = rileyLinkMedtronicService + override val rileyLinkService: RileyLinkMedtronicService? get() = rileyLinkMedtronicService override val pumpInfo: RileyLinkPumpInfo get() = RileyLinkPumpInfo( @@ -244,7 +231,7 @@ class MedtronicPumpPlugin @Inject constructor( medtronicPumpStatus.serialNumber ) - override val lastConnectionTimeMillis: Long = medtronicPumpStatus.lastConnection + override val lastConnectionTimeMillis: Long get() = medtronicPumpStatus.lastConnection override fun setLastCommunicationToNow() { medtronicPumpStatus.setLastCommunicationToNow() diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkBroadcastReceiver.kt b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkBroadcastReceiver.kt index bfbaf4b184..1fb2ca414c 100644 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkBroadcastReceiver.kt +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkBroadcastReceiver.kt @@ -120,9 +120,8 @@ class RileyLinkBroadcastReceiver : DaggerBroadcastReceiver() { RileyLinkConst.Intents.RileyLinkNewAddressSet -> { val rileylinkBLEAddress = sp.getString(RileyLinkConst.Prefs.RileyLinkAddress, "") - if (rileylinkBLEAddress == "") { - aapsLogger.error("No Rileylink BLE Address saved in app") - } else rileyLinkService?.reconfigureRileyLink(rileylinkBLEAddress) + if (rileylinkBLEAddress == "") aapsLogger.error("No Rileylink BLE Address saved in app") + else rileyLinkService?.reconfigureRileyLink(rileylinkBLEAddress) true } diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkService.kt b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkService.kt index 47449c5c3f..d7503bf2a6 100644 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkService.kt +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkService.kt @@ -44,7 +44,7 @@ abstract class RileyLinkService : DaggerService() { @Inject lateinit var rfSpy: RFSpy // interface for RL xxx Mhz radio. private val bluetoothAdapter: BluetoothAdapter? get() = (context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager?)?.adapter - protected var broadcastReceiver: RileyLinkBroadcastReceiver? = null + private var broadcastReceiver: RileyLinkBroadcastReceiver? = null private var bluetoothStateReceiver: RileyLinkBluetoothStateReceiver? = null override fun onCreate() { diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java index 64cca36a50..e6f3f30889 100644 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java @@ -6,9 +6,6 @@ import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; -import info.nightscout.androidaps.interfaces.ActivePlugin; -import info.nightscout.shared.logging.AAPSLogger; -import info.nightscout.shared.logging.LTag; import info.nightscout.androidaps.plugins.bus.RxBus; import info.nightscout.androidaps.plugins.pump.common.events.EventRileyLinkDeviceStatusChange; import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil; @@ -18,6 +15,8 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.data.RLHistor import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkError; import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState; import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice; +import info.nightscout.shared.logging.AAPSLogger; +import info.nightscout.shared.logging.LTag; /** * Created by andy on 16/05/2018. @@ -30,7 +29,6 @@ public class RileyLinkServiceData { @Inject AAPSLogger aapsLogger; @Inject RileyLinkUtil rileyLinkUtil; @Inject RxBus rxBus; - @Inject ActivePlugin activePlugin; boolean tuneUpDone = false; public RileyLinkError rileyLinkError; From 23bdb57ed318699769b7fe5dd8ce9ea613661181 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 1 Jul 2022 00:07:38 +0200 Subject: [PATCH 035/154] RileyLinkServiceData resolve nullability --- .../pump/medtronic/MedtronicFragment.kt | 12 ++++-------- .../service/RileyLinkBroadcastReceiver.kt | 2 +- .../service/RileyLinkServiceData.java | 18 +++++++++--------- .../service/tasks/InitializePumpManagerTask.kt | 3 +-- 4 files changed, 15 insertions(+), 20 deletions(-) diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt index d65509810f..86666790a5 100644 --- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt +++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt @@ -340,19 +340,15 @@ class MedtronicFragment : DaggerFragment() { medtronicPumpPlugin.rileyLinkService?.verifyConfiguration() binding.errors.text = medtronicPumpStatus.errorInfo - val showRileyLinkBatteryLevel: Boolean = rileyLinkServiceData.showBatteryLevel - - if (showRileyLinkBatteryLevel) { + if (rileyLinkServiceData.showBatteryLevel) { binding.rlBatteryView.visibility = View.VISIBLE binding.rlBatteryLabel.visibility = View.VISIBLE binding.rlBatteryState.visibility = View.VISIBLE binding.rlBatteryLayout.visibility = View.VISIBLE binding.rlBatterySemicolon.visibility = View.VISIBLE - if (rileyLinkServiceData.batteryLevel == null) { - binding.rlBatteryState.text = " ?" - } else { - binding.rlBatteryState.text = "{fa-battery-" + rileyLinkServiceData.batteryLevel / 25 + "} " + rileyLinkServiceData.batteryLevel + "%" - } + binding.rlBatteryState.text = + if (rileyLinkServiceData.batteryLevel == null) " ?" + else "{fa-battery-${rileyLinkServiceData.batteryLevel!! / 25}} ${rileyLinkServiceData.batteryLevel}%" } else { binding.rlBatteryView.visibility = View.GONE binding.rlBatteryLabel.visibility = View.GONE diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkBroadcastReceiver.kt b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkBroadcastReceiver.kt index 1fb2ca414c..1177388890 100644 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkBroadcastReceiver.kt +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkBroadcastReceiver.kt @@ -110,7 +110,7 @@ class RileyLinkBroadcastReceiver : DaggerBroadcastReceiver() { aapsLogger.debug(LTag.PUMPBTCOMM, "RfSpy version (BLE113): $bleVersion") rileyLinkService?.rileyLinkServiceData?.versionBLE113 = bleVersion - aapsLogger.debug(LTag.PUMPBTCOMM, "RfSpy Radio version (CC110): " + rlVersion.name) + aapsLogger.debug(LTag.PUMPBTCOMM, "RfSpy Radio version (CC110): ${rlVersion?.name}") rileyLinkServiceData.firmwareVersion = rlVersion val task: ServiceTask = InitializePumpManagerTask(injector, context) serviceTaskExecutor.startTask(task) diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java index e6f3f30889..7876fb1f1f 100644 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java @@ -31,27 +31,27 @@ public class RileyLinkServiceData { @Inject RxBus rxBus; boolean tuneUpDone = false; - public RileyLinkError rileyLinkError; + @Nullable public RileyLinkError rileyLinkError; public RileyLinkServiceState rileyLinkServiceState = RileyLinkServiceState.NotStarted; private long lastServiceStateChange = 0L; - public RileyLinkFirmwareVersion firmwareVersion; // here we have "compatibility level" version + @Nullable public RileyLinkFirmwareVersion firmwareVersion; // here we have "compatibility level" version @Nullable public RileyLinkTargetFrequency rileyLinkTargetFrequency; @Nullable public String rileyLinkAddress; @Nullable public String rileyLinkName; - public Integer batteryLevel; + @Nullable public Integer batteryLevel; public boolean showBatteryLevel = false; long lastTuneUpTime = 0L; - public Double lastGoodFrequency; + @Nullable public Double lastGoodFrequency; // bt version - public String versionBLE113; + @Nullable public String versionBLE113; // radio version - public String versionCC110; + @Nullable public String versionCC110; // orangeLink - public boolean isOrange; - public String versionOrangeFirmware; - public String versionOrangeHardware; + public boolean isOrange = false; + @Nullable public String versionOrangeFirmware; + @Nullable public String versionOrangeHardware; public RileyLinkTargetDevice targetDevice; diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/tasks/InitializePumpManagerTask.kt b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/tasks/InitializePumpManagerTask.kt index 2b43ea0ea3..903200d3d4 100644 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/tasks/InitializePumpManagerTask.kt +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/tasks/InitializePumpManagerTask.kt @@ -34,8 +34,7 @@ class InitializePumpManagerTask(injector: HasAndroidInjector, private val contex lastGoodFrequency = sp.getDouble(RileyLinkConst.Prefs.LastGoodDeviceFrequency, 0.0) lastGoodFrequency = (lastGoodFrequency * 1000.0).roundToLong() / 1000.0 rileyLinkServiceData.lastGoodFrequency = lastGoodFrequency - - } else lastGoodFrequency = rileyLinkServiceData.lastGoodFrequency + } else lastGoodFrequency = rileyLinkServiceData.lastGoodFrequency ?: 0.0 val rileyLinkCommunicationManager = pumpDevice?.rileyLinkService?.deviceCommunicationManager if (activePlugin.activePump.manufacturer() === ManufacturerType.Medtronic) { From 9e29cbc2febf7a5359c7f0e07ccc644f9d2fddb5 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 1 Jul 2022 00:33:19 +0200 Subject: [PATCH 036/154] RileyLinkServiceData -> kt --- .../pump/medtronic/MedtronicFragment.kt | 2 +- .../omnipod/eros/OmnipodErosPumpPlugin.java | 4 +- .../service/RileyLinkOmnipodService.java | 4 +- .../dialog/RileyLinkStatusGeneralFragment.kt | 2 +- .../service/RileyLinkBroadcastReceiver.kt | 2 +- .../hw/rileylink/service/RileyLinkService.kt | 25 ++--- .../service/RileyLinkServiceData.java | 103 ------------------ .../rileylink/service/RileyLinkServiceData.kt | 73 +++++++++++++ .../tasks/InitializePumpManagerTask.kt | 8 +- 9 files changed, 91 insertions(+), 132 deletions(-) delete mode 100644 rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java create mode 100644 rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.kt diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt index 86666790a5..84ac9a6138 100644 --- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt +++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt @@ -188,7 +188,7 @@ class MedtronicFragment : DaggerFragment() { @Synchronized private fun setDeviceStatus() { val resourceId = rileyLinkServiceData.rileyLinkServiceState.resourceId - val rileyLinkError = medtronicPumpPlugin.rileyLinkService?.error + val rileyLinkError =rileyLinkServiceData.rileyLinkError binding.rlStatus.text = when { rileyLinkServiceData.rileyLinkServiceState == RileyLinkServiceState.NotStarted -> rh.gs(resourceId) diff --git a/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/OmnipodErosPumpPlugin.java b/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/OmnipodErosPumpPlugin.java index 402d836bb3..f4c1bb19c7 100644 --- a/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/OmnipodErosPumpPlugin.java +++ b/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/OmnipodErosPumpPlugin.java @@ -375,7 +375,7 @@ public class OmnipodErosPumpPlugin extends PumpPluginBase implements Pump, Riley } public boolean isRileyLinkReady() { - return rileyLinkServiceData.rileyLinkServiceState.isReady(); + return rileyLinkServiceData.getRileyLinkServiceState().isReady(); } private void handleCancelledTbr() { @@ -1014,7 +1014,7 @@ public class OmnipodErosPumpPlugin extends PumpPluginBase implements Pump, Riley // - RileyLink has been connecting for over RILEY_LINK_CONNECT_TIMEOUT return (podStateManager.getLastFailedCommunication() != null && podStateManager.getLastSuccessfulCommunication().isBefore(podStateManager.getLastFailedCommunication())) || podStateManager.isSuspended() || - rileyLinkServiceData.rileyLinkServiceState.isError() || + rileyLinkServiceData.getRileyLinkServiceState().isError() || // The below clause is a hack for working around the RL service state forever staying in connecting state on startup if the RL is switched off / unreachable (rileyLinkServiceData.getRileyLinkServiceState().isConnecting() && rileyLinkServiceData.getLastServiceStateChange() + RILEY_LINK_CONNECT_TIMEOUT_MILLIS < currentTimeMillis); } diff --git a/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/rileylink/service/RileyLinkOmnipodService.java b/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/rileylink/service/RileyLinkOmnipodService.java index 8520db88d3..c6a7d37063 100644 --- a/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/rileylink/service/RileyLinkOmnipodService.java +++ b/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/rileylink/service/RileyLinkOmnipodService.java @@ -97,10 +97,8 @@ public class RileyLinkOmnipodService extends RileyLinkService { /* private functions */ - // PumpInterface - REMOVE - public boolean isInitialized() { - return rileyLinkServiceData.rileyLinkServiceState.isReady(); + return rileyLinkServiceData.getRileyLinkServiceState().isReady(); } @Override diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/dialog/RileyLinkStatusGeneralFragment.kt b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/dialog/RileyLinkStatusGeneralFragment.kt index 115849b46d..d9b6ee141c 100644 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/dialog/RileyLinkStatusGeneralFragment.kt +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/dialog/RileyLinkStatusGeneralFragment.kt @@ -72,7 +72,7 @@ class RileyLinkStatusGeneralFragment : DaggerFragment() { } val rileyLinkPumpDevice = activePlugin.activePump as RileyLinkPumpDevice val rileyLinkPumpInfo = rileyLinkPumpDevice.pumpInfo - binding.deviceType.setText(targetDevice.resourceId) + targetDevice?.resourceId?.let { binding.deviceType.setText(it) } if (targetDevice == RileyLinkTargetDevice.MedtronicPump) { binding.connectedDeviceDetails.visibility = View.VISIBLE binding.configuredDeviceModel.text = activePlugin.activePump.pumpDescription.pumpType.description diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkBroadcastReceiver.kt b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkBroadcastReceiver.kt index 1177388890..ff9fca17f3 100644 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkBroadcastReceiver.kt +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkBroadcastReceiver.kt @@ -153,7 +153,7 @@ class RileyLinkBroadcastReceiver : DaggerBroadcastReceiver() { private fun processTuneUpBroadcasts(action: String): Boolean = if (broadcastIdentifiers["TuneUp"]?.contains(action) == true) { - if (rileyLinkService?.rileyLinkTargetDevice?.isTuneUpEnabled == true) serviceTaskExecutor.startTask(WakeAndTuneTask(injector)) + if (rileyLinkServiceData.targetDevice?.isTuneUpEnabled == true) serviceTaskExecutor.startTask(WakeAndTuneTask(injector)) true } else false } \ No newline at end of file diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkService.kt b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkService.kt index d7503bf2a6..d7efd6ca73 100644 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkService.kt +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkService.kt @@ -94,7 +94,7 @@ abstract class RileyLinkService : DaggerService() { fun bluetoothInit(): Boolean { aapsLogger.debug(LTag.PUMPBTCOMM, "bluetoothInit: attempting to get an adapter") - rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.BluetoothInitializing) + rileyLinkServiceData.rileyLinkServiceState = RileyLinkServiceState.BluetoothInitializing if (bluetoothAdapter == null) { aapsLogger.error("Unable to obtain a BluetoothAdapter.") rileyLinkServiceData.setServiceState(RileyLinkServiceState.BluetoothError, RileyLinkError.NoBluetoothAdapter) @@ -103,7 +103,7 @@ abstract class RileyLinkService : DaggerService() { aapsLogger.error("Bluetooth is not enabled.") rileyLinkServiceData.setServiceState(RileyLinkServiceState.BluetoothError, RileyLinkError.BluetoothDisabled) } else { - rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.BluetoothReady) + rileyLinkServiceData.rileyLinkServiceState = RileyLinkServiceState.BluetoothReady return true } } @@ -112,7 +112,7 @@ abstract class RileyLinkService : DaggerService() { // returns true if our Rileylink configuration changed fun reconfigureRileyLink(deviceAddress: String): Boolean { - rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.RileyLinkInitializing) + rileyLinkServiceData.rileyLinkServiceState = RileyLinkServiceState.RileyLinkInitializing return if (rileyLinkBLE.isConnected) { if (deviceAddress == rileyLinkServiceData.rileyLinkAddress) { aapsLogger.info(LTag.PUMPBTCOMM, "No change to RL address. Not reconnecting.") @@ -128,9 +128,9 @@ abstract class RileyLinkService : DaggerService() { } } else { aapsLogger.debug(LTag.PUMPBTCOMM, "Using RL $deviceAddress") - if (rileyLinkServiceData.getRileyLinkServiceState() == RileyLinkServiceState.NotStarted) { + if (rileyLinkServiceData.rileyLinkServiceState == RileyLinkServiceState.NotStarted) { if (!bluetoothInit()) { - aapsLogger.error("RileyLink can't get activated, Bluetooth is not functioning correctly. ${error?.name ?: "Unknown error (null)"}") + aapsLogger.error("RileyLink can't get activated, Bluetooth is not functioning correctly. ${rileyLinkServiceData.rileyLinkError?.name ?: "Unknown error (null)"}") return false } } @@ -141,7 +141,7 @@ abstract class RileyLinkService : DaggerService() { // FIXME: This needs to be run in a session so that is incorruptible, has a separate thread, etc. fun doTuneUpDevice() { - rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.TuneUpDevice) + rileyLinkServiceData.rileyLinkServiceState = RileyLinkServiceState.TuneUpDevice setPumpDeviceState(PumpDeviceState.Sleeping) val lastGoodFrequency = rileyLinkServiceData.lastGoodFrequency ?: sp.getDouble(RileyLinkConst.Prefs.LastGoodDeviceFrequency, 0.0) val newFrequency = deviceCommunicationManager.tuneForDevice() @@ -157,7 +157,7 @@ abstract class RileyLinkService : DaggerService() { rileyLinkServiceData.setServiceState(RileyLinkServiceState.PumpConnectorError, RileyLinkError.TuneUpOfDeviceFailed) } else { deviceCommunicationManager.clearNotConnectedCount() - rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.PumpConnectorReady) + rileyLinkServiceData.rileyLinkServiceState = RileyLinkServiceState.PumpConnectorReady } } @@ -168,22 +168,13 @@ abstract class RileyLinkService : DaggerService() { rileyLinkServiceData.rileyLinkAddress = null rileyLinkServiceData.rileyLinkName = null } - rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.BluetoothReady) + rileyLinkServiceData.rileyLinkServiceState = RileyLinkServiceState.BluetoothReady } - /** - * Get Target Device for Service - */ - val rileyLinkTargetDevice: RileyLinkTargetDevice - get() = rileyLinkServiceData.targetDevice - fun changeRileyLinkEncoding(encodingType: RileyLinkEncodingType?) { rfSpy.setRileyLinkEncoding(encodingType) } - val error: RileyLinkError? - get() = rileyLinkServiceData.rileyLinkError - fun verifyConfiguration(): Boolean { return verifyConfiguration(false) } diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java deleted file mode 100644 index 7876fb1f1f..0000000000 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.java +++ /dev/null @@ -1,103 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service; - -import java.util.Locale; - -import javax.annotation.Nullable; -import javax.inject.Inject; -import javax.inject.Singleton; - -import info.nightscout.androidaps.plugins.bus.RxBus; -import info.nightscout.androidaps.plugins.pump.common.events.EventRileyLinkDeviceStatusChange; -import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil; -import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkFirmwareVersion; -import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkTargetFrequency; -import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.data.RLHistoryItem; -import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkError; -import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState; -import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice; -import info.nightscout.shared.logging.AAPSLogger; -import info.nightscout.shared.logging.LTag; - -/** - * Created by andy on 16/05/2018. - */ - -// FIXME encapsulation -@Singleton -public class RileyLinkServiceData { - - @Inject AAPSLogger aapsLogger; - @Inject RileyLinkUtil rileyLinkUtil; - @Inject RxBus rxBus; - - boolean tuneUpDone = false; - @Nullable public RileyLinkError rileyLinkError; - public RileyLinkServiceState rileyLinkServiceState = RileyLinkServiceState.NotStarted; - private long lastServiceStateChange = 0L; - @Nullable public RileyLinkFirmwareVersion firmwareVersion; // here we have "compatibility level" version - @Nullable public RileyLinkTargetFrequency rileyLinkTargetFrequency; - @Nullable public String rileyLinkAddress; - @Nullable public String rileyLinkName; - @Nullable public Integer batteryLevel; - public boolean showBatteryLevel = false; - long lastTuneUpTime = 0L; - @Nullable public Double lastGoodFrequency; - - // bt version - @Nullable public String versionBLE113; - // radio version - @Nullable public String versionCC110; - - // orangeLink - public boolean isOrange = false; - @Nullable public String versionOrangeFirmware; - @Nullable public String versionOrangeHardware; - - public RileyLinkTargetDevice targetDevice; - - // Medtronic Pump - public String pumpID; - public byte[] pumpIDBytes; - - @Inject - public RileyLinkServiceData() { - } - - public void setPumpID(String pumpId, byte[] pumpIdBytes) { - this.pumpID = pumpId; - this.pumpIDBytes = pumpIdBytes; - } - - public void setRileyLinkServiceState(RileyLinkServiceState newState) { - setServiceState(newState, null); - } - - public RileyLinkServiceState getRileyLinkServiceState() { - return workWithServiceState(null, null, false); - } - - public void setServiceState(RileyLinkServiceState newState, RileyLinkError errorCode) { - workWithServiceState(newState, errorCode, true); - } - - public long getLastServiceStateChange() { - return lastServiceStateChange; - } - - private synchronized RileyLinkServiceState workWithServiceState(RileyLinkServiceState newState, RileyLinkError errorCode, boolean set) { - if (set) { - rileyLinkServiceState = newState; - lastServiceStateChange = System.currentTimeMillis(); - this.rileyLinkError = errorCode; - - aapsLogger.info(LTag.PUMP, String.format(Locale.ENGLISH, "RileyLink State Changed: %s %s", newState, errorCode == null ? "" : " - Error State: " + errorCode.name())); - - rileyLinkUtil.getRileyLinkHistory().add(new RLHistoryItem(rileyLinkServiceState, errorCode, targetDevice)); - rxBus.send(new EventRileyLinkDeviceStatusChange(targetDevice, newState, errorCode)); - return null; - } else { - return rileyLinkServiceState; - } - } - -} diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.kt b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.kt new file mode 100644 index 0000000000..047467fd7f --- /dev/null +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkServiceData.kt @@ -0,0 +1,73 @@ +package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service + +import info.nightscout.androidaps.plugins.bus.RxBus +import info.nightscout.androidaps.plugins.pump.common.events.EventRileyLinkDeviceStatusChange +import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkUtil +import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkFirmwareVersion +import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkTargetFrequency +import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.data.RLHistoryItem +import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkError +import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState +import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice +import info.nightscout.shared.logging.AAPSLogger +import info.nightscout.shared.logging.LTag +import java.util.* +import javax.inject.Inject +import javax.inject.Singleton + +/** + * Created by andy on 16/05/2018. + */ +@Singleton +class RileyLinkServiceData @Inject constructor() { + + @Inject lateinit var aapsLogger: AAPSLogger + @Inject lateinit var rileyLinkUtil: RileyLinkUtil + @Inject lateinit var rxBus: RxBus + var tuneUpDone = false + var rileyLinkError: RileyLinkError? = null + var rileyLinkServiceState: RileyLinkServiceState = RileyLinkServiceState.NotStarted + var lastServiceStateChange = 0L + private set + + // here we have "compatibility level" version + @JvmField var firmwareVersion: RileyLinkFirmwareVersion? = null + @JvmField var rileyLinkTargetFrequency: RileyLinkTargetFrequency? = null + @JvmField var rileyLinkAddress: String? = null + @JvmField var rileyLinkName: String? = null + @JvmField var batteryLevel: Int? = null + var showBatteryLevel = false + var lastTuneUpTime = 0L + var lastGoodFrequency: Double? = null + + // bt version + var versionBLE113: String? = null + + // radio version + @JvmField var versionCC110: String? = null + + // orangeLink + var isOrange = false + var versionOrangeFirmware: String? = null + var versionOrangeHardware: String? = null + @JvmField var targetDevice: RileyLinkTargetDevice? = null + + // Medtronic Pump + var pumpID: String? = null + var pumpIDBytes: ByteArray = byteArrayOf(0, 0, 0) + + fun setPumpID(pumpId: String?, pumpIdBytes: ByteArray) { + pumpID = pumpId + pumpIDBytes = pumpIdBytes + } + + @Synchronized + fun setServiceState(newState: RileyLinkServiceState, errorCode: RileyLinkError) { + rileyLinkServiceState = newState + lastServiceStateChange = System.currentTimeMillis() + rileyLinkError = errorCode + aapsLogger.info(LTag.PUMP, String.format(Locale.ENGLISH, "RileyLink State Changed: $newState - Error State: ${errorCode.name}")) + rileyLinkUtil.rileyLinkHistory.add(RLHistoryItem(rileyLinkServiceState, errorCode, targetDevice)) + rxBus.send(EventRileyLinkDeviceStatusChange(targetDevice!!, newState, errorCode)) + } +} \ No newline at end of file diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/tasks/InitializePumpManagerTask.kt b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/tasks/InitializePumpManagerTask.kt index 903200d3d4..935aff66bc 100644 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/tasks/InitializePumpManagerTask.kt +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/tasks/InitializePumpManagerTask.kt @@ -39,10 +39,10 @@ class InitializePumpManagerTask(injector: HasAndroidInjector, private val contex val rileyLinkCommunicationManager = pumpDevice?.rileyLinkService?.deviceCommunicationManager if (activePlugin.activePump.manufacturer() === ManufacturerType.Medtronic) { if (lastGoodFrequency > 0.0 && rileyLinkCommunicationManager?.isValidFrequency(lastGoodFrequency) == true) { - rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.RileyLinkReady) + rileyLinkServiceData.rileyLinkServiceState = RileyLinkServiceState.RileyLinkReady aapsLogger.info(LTag.PUMPBTCOMM, "Setting radio frequency to $lastGoodFrequency MHz") rileyLinkCommunicationManager.setRadioFrequencyForPump(lastGoodFrequency) - if (rileyLinkCommunicationManager.tryToConnectToDevice()) rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.PumpConnectorReady) + if (rileyLinkCommunicationManager.tryToConnectToDevice()) rileyLinkServiceData.rileyLinkServiceState = RileyLinkServiceState.PumpConnectorReady else { rileyLinkServiceData.setServiceState(RileyLinkServiceState.PumpConnectorError, RileyLinkError.NoContactWithDevice) rileyLinkUtil.sendBroadcastMessage(RileyLinkConst.IPC.MSG_PUMP_tunePump, context) @@ -54,11 +54,11 @@ class InitializePumpManagerTask(injector: HasAndroidInjector, private val contex lastGoodFrequency = (lastGoodFrequency * 1000.0).roundToLong() / 1000.0 rileyLinkServiceData.lastGoodFrequency = lastGoodFrequency } - rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.RileyLinkReady) + rileyLinkServiceData.rileyLinkServiceState = RileyLinkServiceState.RileyLinkReady rileyLinkServiceData.rileyLinkTargetFrequency = RileyLinkTargetFrequency.Omnipod // TODO shouldn't be needed aapsLogger.info(LTag.PUMPBTCOMM, "Setting radio frequency to $lastGoodFrequency MHz") rileyLinkCommunicationManager?.setRadioFrequencyForPump(lastGoodFrequency) - rileyLinkServiceData.setRileyLinkServiceState(RileyLinkServiceState.PumpConnectorReady) + rileyLinkServiceData.rileyLinkServiceState = RileyLinkServiceState.PumpConnectorReady } } } \ No newline at end of file From c9a039a8a690629babf5a43e2bbf07b1dd04936f Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 1 Jul 2022 00:51:05 +0200 Subject: [PATCH 037/154] RL: enum -> kt --- .../service/RileyLinkMedtronicService.kt | 2 +- .../pump/common/hw/rileylink/ble/RFSpy.java | 6 ++--- .../hw/rileylink/ble/defs/RLMessageType.java | 10 -------- .../hw/rileylink/ble/defs/RLMessageType.kt | 10 ++++++++ .../hw/rileylink/ble/defs/RXFilterMode.java | 19 -------------- .../hw/rileylink/ble/defs/RXFilterMode.kt | 10 ++++++++ .../ble/defs/RileyLinkTargetFrequency.java | 25 ------------------- .../ble/defs/RileyLinkTargetFrequency.kt | 11 ++++++++ 8 files changed, 35 insertions(+), 58 deletions(-) delete mode 100644 rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RLMessageType.java create mode 100644 rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RLMessageType.kt delete mode 100644 rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RXFilterMode.java create mode 100644 rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RXFilterMode.kt delete mode 100644 rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RileyLinkTargetFrequency.java create mode 100644 rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RileyLinkTargetFrequency.kt diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/service/RileyLinkMedtronicService.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/service/RileyLinkMedtronicService.kt index e5157aadec..4154965d3b 100644 --- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/service/RileyLinkMedtronicService.kt +++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/service/RileyLinkMedtronicService.kt @@ -177,7 +177,7 @@ class RileyLinkMedtronicService : RileyLinkService() { medtronicPumpStatus.pumpFrequency = pumpFrequency val isFrequencyUS = pumpFrequency == frequencies[0] val newTargetFrequency = if (isFrequencyUS) // - RileyLinkTargetFrequency.Medtronic_US else RileyLinkTargetFrequency.Medtronic_WorldWide + RileyLinkTargetFrequency.MedtronicUS else RileyLinkTargetFrequency.MedtronicWorldWide if (rileyLinkServiceData.rileyLinkTargetFrequency != newTargetFrequency) { rileyLinkServiceData.rileyLinkTargetFrequency = newTargetFrequency } diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/RFSpy.java b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/RFSpy.java index abd0bd5d83..356628cce8 100644 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/RFSpy.java +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/RFSpy.java @@ -309,7 +309,7 @@ public class RFSpy { aapsLogger.error(LTag.PUMPBTCOMM, "RileyLinkTargetFrequency: " + frequency); switch (frequency) { - case Medtronic_WorldWide: + case MedtronicWorldWide: setRXFilterMode(RXFilterMode.Wide); updateRegister(CC111XRegister.mdmcfg1, 0x62); updateRegister(CC111XRegister.mdmcfg0, 0x1A); @@ -317,7 +317,7 @@ public class RFSpy { setMedtronicEncoding(); break; - case Medtronic_US: + case MedtronicUS: setRXFilterMode(RXFilterMode.Narrow); updateRegister(CC111XRegister.mdmcfg1, 0x61); updateRegister(CC111XRegister.mdmcfg0, 0x7E); @@ -400,7 +400,7 @@ public class RFSpy { private void setRXFilterMode(RXFilterMode mode) { byte drate_e = (byte) 0x9; // exponent of symbol rate (16kbps) - byte chanbw = mode.value; + byte chanbw = mode.getValue(); updateRegister(CC111XRegister.mdmcfg4, (byte) (chanbw | drate_e)); } diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RLMessageType.java b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RLMessageType.java deleted file mode 100644 index 7cc11da498..0000000000 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RLMessageType.java +++ /dev/null @@ -1,10 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs; - -/** - * Created by andy on 5/6/18. - */ - -public enum RLMessageType { - PowerOn, // for powering on the pump (wakeup) - ReadSimpleData, // for checking if pump is readable (for Medtronic we can use GetModel) -} diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RLMessageType.kt b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RLMessageType.kt new file mode 100644 index 0000000000..f64cd6666f --- /dev/null +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RLMessageType.kt @@ -0,0 +1,10 @@ +package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs + +/** + * Created by andy on 5/6/18. + */ +enum class RLMessageType { + + PowerOn, // for powering on the pump (wakeup) + ReadSimpleData // for checking if pump is readable (for Medtronic we can use GetModel) +} \ No newline at end of file diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RXFilterMode.java b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RXFilterMode.java deleted file mode 100644 index e50929ebfe..0000000000 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RXFilterMode.java +++ /dev/null @@ -1,19 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs; - -/** - * Created by andy on 21/05/2018. - */ - -public enum RXFilterMode { - - Wide(0x50), // - Narrow(0x90) // - ; - - public byte value; - - - RXFilterMode(int value) { - this.value = (byte)value; - } -} diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RXFilterMode.kt b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RXFilterMode.kt new file mode 100644 index 0000000000..9150be1789 --- /dev/null +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RXFilterMode.kt @@ -0,0 +1,10 @@ +package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs + +/** + * Created by andy on 21/05/2018. + */ +enum class RXFilterMode(val value: Byte) { + + Wide(0x50), + Narrow(0x90.toByte()); +} \ No newline at end of file diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RileyLinkTargetFrequency.java b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RileyLinkTargetFrequency.java deleted file mode 100644 index 0d7f341584..0000000000 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RileyLinkTargetFrequency.java +++ /dev/null @@ -1,25 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs; - -/** - * Created by andy on 6/7/18. - */ - -public enum RileyLinkTargetFrequency { - - Medtronic_WorldWide(868.25, 868.3, 868.35, 868.4, 868.45, 868.5, 868.55, 868.6, 868.65), // - Medtronic_US(916.45, 916.5, 916.55, 916.6, 916.65, 916.7, 916.75, 916.8), // - Omnipod(433.91), // - ; - - double[] frequencies; - - - RileyLinkTargetFrequency(double... frequencies) { - this.frequencies = frequencies; - } - - - public double[] getScanFrequencies() { - return frequencies; - } -} diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RileyLinkTargetFrequency.kt b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RileyLinkTargetFrequency.kt new file mode 100644 index 0000000000..8a50374cde --- /dev/null +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/defs/RileyLinkTargetFrequency.kt @@ -0,0 +1,11 @@ +package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs + +/** + * Created by andy on 6/7/18. + */ +enum class RileyLinkTargetFrequency(vararg var scanFrequencies: Double) { + + MedtronicWorldWide(868.25, 868.3, 868.35, 868.4, 868.45, 868.5, 868.55, 868.6, 868.65), + MedtronicUS(916.45, 916.5, 916.55, 916.6, 916.65, 916.7, 916.75, 916.8), + Omnipod(433.91); +} \ No newline at end of file From 7b8a3d8988b4ed19d5bd898bb2ba5bdde0abecf4 Mon Sep 17 00:00:00 2001 From: Philoul Date: Fri, 1 Jul 2022 01:26:19 +0200 Subject: [PATCH 038/154] wear vector icons replace png by xml --- icons/action_add.svg | 10 +++ icons/action_minus.svg | 7 +++ icons/cancel.svg | 13 ++++ icons/confirm.svg | 8 +++ icons/icon_snooze.svg | 59 ++++++++++++++++++ icons/loop.svg | 10 +++ icons/setting_off.svg | 8 +++ icons/setting_on.svg | 8 +++ wear/src/main/res/drawable-hdpi/ic_cancel.png | Bin 991 -> 0 bytes .../src/main/res/drawable-hdpi/ic_confirm.png | Bin 291 -> 0 bytes .../main/res/drawable-hdpi/settings_off.png | Bin 851 -> 0 bytes .../main/res/drawable-hdpi/settings_on.png | Bin 601 -> 0 bytes wear/src/main/res/drawable-mdpi/ic_cancel.png | Bin 601 -> 0 bytes .../src/main/res/drawable-mdpi/ic_confirm.png | Bin 196 -> 0 bytes .../main/res/drawable-mdpi/settings_off.png | Bin 551 -> 0 bytes .../main/res/drawable-mdpi/settings_on.png | Bin 408 -> 0 bytes .../src/main/res/drawable-xhdpi/ic_cancel.png | Bin 1234 -> 0 bytes .../main/res/drawable-xhdpi/ic_confirm.png | Bin 289 -> 0 bytes .../main/res/drawable-xhdpi/settings_off.png | Bin 1091 -> 0 bytes .../main/res/drawable-xhdpi/settings_on.png | Bin 779 -> 0 bytes .../main/res/drawable-xxhdpi/ic_cancel.png | Bin 2121 -> 0 bytes .../main/res/drawable-xxhdpi/ic_confirm.png | Bin 462 -> 0 bytes .../main/res/drawable-xxhdpi/settings_off.png | Bin 1848 -> 0 bytes .../main/res/drawable-xxhdpi/settings_on.png | Bin 1285 -> 0 bytes wear/src/main/res/drawable/ic_action_add.png | Bin 139 -> 0 bytes wear/src/main/res/drawable/ic_action_add.xml | 9 +++ .../src/main/res/drawable/ic_action_minus.png | Bin 131 -> 0 bytes .../src/main/res/drawable/ic_action_minus.xml | 8 +++ wear/src/main/res/drawable/ic_cancel.xml | 16 +++++ wear/src/main/res/drawable/ic_confirm.xml | 8 +++ wear/src/main/res/drawable/ic_icon.png | Bin 3218 -> 0 bytes wear/src/main/res/drawable/ic_icon.xml | 16 +++++ wear/src/main/res/drawable/ic_icon_snooze.png | Bin 24861 -> 0 bytes wear/src/main/res/drawable/ic_icon_snooze.xml | 18 ++++++ wear/src/main/res/drawable/loop_green_25.png | Bin 21623 -> 0 bytes wear/src/main/res/drawable/loop_green_25.xml | 9 +++ wear/src/main/res/drawable/loop_grey_25.png | Bin 22321 -> 0 bytes wear/src/main/res/drawable/loop_grey_25.xml | 9 +++ wear/src/main/res/drawable/loop_red_25.png | Bin 21623 -> 0 bytes wear/src/main/res/drawable/loop_red_25.xml | 9 +++ wear/src/main/res/drawable/settings_off.xml | 10 +++ wear/src/main/res/drawable/settings_on.xml | 10 +++ 42 files changed, 245 insertions(+) create mode 100644 icons/action_add.svg create mode 100644 icons/action_minus.svg create mode 100644 icons/cancel.svg create mode 100644 icons/confirm.svg create mode 100644 icons/icon_snooze.svg create mode 100644 icons/loop.svg create mode 100644 icons/setting_off.svg create mode 100644 icons/setting_on.svg delete mode 100644 wear/src/main/res/drawable-hdpi/ic_cancel.png delete mode 100644 wear/src/main/res/drawable-hdpi/ic_confirm.png delete mode 100644 wear/src/main/res/drawable-hdpi/settings_off.png delete mode 100644 wear/src/main/res/drawable-hdpi/settings_on.png delete mode 100644 wear/src/main/res/drawable-mdpi/ic_cancel.png delete mode 100644 wear/src/main/res/drawable-mdpi/ic_confirm.png delete mode 100644 wear/src/main/res/drawable-mdpi/settings_off.png delete mode 100644 wear/src/main/res/drawable-mdpi/settings_on.png delete mode 100644 wear/src/main/res/drawable-xhdpi/ic_cancel.png delete mode 100644 wear/src/main/res/drawable-xhdpi/ic_confirm.png delete mode 100644 wear/src/main/res/drawable-xhdpi/settings_off.png delete mode 100644 wear/src/main/res/drawable-xhdpi/settings_on.png delete mode 100644 wear/src/main/res/drawable-xxhdpi/ic_cancel.png delete mode 100644 wear/src/main/res/drawable-xxhdpi/ic_confirm.png delete mode 100644 wear/src/main/res/drawable-xxhdpi/settings_off.png delete mode 100644 wear/src/main/res/drawable-xxhdpi/settings_on.png delete mode 100644 wear/src/main/res/drawable/ic_action_add.png create mode 100644 wear/src/main/res/drawable/ic_action_add.xml delete mode 100644 wear/src/main/res/drawable/ic_action_minus.png create mode 100644 wear/src/main/res/drawable/ic_action_minus.xml create mode 100644 wear/src/main/res/drawable/ic_cancel.xml create mode 100644 wear/src/main/res/drawable/ic_confirm.xml delete mode 100644 wear/src/main/res/drawable/ic_icon.png create mode 100644 wear/src/main/res/drawable/ic_icon.xml delete mode 100644 wear/src/main/res/drawable/ic_icon_snooze.png create mode 100644 wear/src/main/res/drawable/ic_icon_snooze.xml delete mode 100644 wear/src/main/res/drawable/loop_green_25.png create mode 100644 wear/src/main/res/drawable/loop_green_25.xml delete mode 100644 wear/src/main/res/drawable/loop_grey_25.png create mode 100644 wear/src/main/res/drawable/loop_grey_25.xml delete mode 100644 wear/src/main/res/drawable/loop_red_25.png create mode 100644 wear/src/main/res/drawable/loop_red_25.xml create mode 100644 wear/src/main/res/drawable/settings_off.xml create mode 100644 wear/src/main/res/drawable/settings_on.xml diff --git a/icons/action_add.svg b/icons/action_add.svg new file mode 100644 index 0000000000..929dd4f7d9 --- /dev/null +++ b/icons/action_add.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/icons/action_minus.svg b/icons/action_minus.svg new file mode 100644 index 0000000000..c7ef549809 --- /dev/null +++ b/icons/action_minus.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/icons/cancel.svg b/icons/cancel.svg new file mode 100644 index 0000000000..070444ebd3 --- /dev/null +++ b/icons/cancel.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/icons/confirm.svg b/icons/confirm.svg new file mode 100644 index 0000000000..0e93b2634e --- /dev/null +++ b/icons/confirm.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/icons/icon_snooze.svg b/icons/icon_snooze.svg new file mode 100644 index 0000000000..c2190ac542 --- /dev/null +++ b/icons/icon_snooze.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + diff --git a/icons/loop.svg b/icons/loop.svg new file mode 100644 index 0000000000..b9e96b325d --- /dev/null +++ b/icons/loop.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/icons/setting_off.svg b/icons/setting_off.svg new file mode 100644 index 0000000000..ae79852ac7 --- /dev/null +++ b/icons/setting_off.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/icons/setting_on.svg b/icons/setting_on.svg new file mode 100644 index 0000000000..72d9d52c8b --- /dev/null +++ b/icons/setting_on.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/wear/src/main/res/drawable-hdpi/ic_cancel.png b/wear/src/main/res/drawable-hdpi/ic_cancel.png deleted file mode 100644 index f3f1437a8855f7c2a6ac613ec1c895a305f3b36b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 991 zcmV<510ei~P)VW$!s4=cnOez&4;IF`$9*KMNQGBmgl)0zaDrQ~|#wI&J`)fRJh9qkwmk zhkgM(7kf1I31_}ZbRGa6n|$+}@mGK)L6aTm9ssOJ?$UvglK>^J80F&4r3{{MM#5y9 zohqJUVqWlh(kDv($lQrsCsg@^DE#V&@x+M}hMk5?gpP>$XI-G_409(obd`((nncNh zi%d{Mf6(Ro6(-pY>p1X|C^&Xv8^IQUB49#6cOJ0gR0|@{rgDMLZ2}?-4{By^%b{d;4I82_LFCUI+f$^k1_^_xW)9)PNjYqYt{6GN3&-M7 zu#Eu+a*`&-a-vvM4unXzr5i#V+eq2Tj}Qt1J`tgm#+&EZhGi#@m-tXcXrBm8dkmW< zelBCDtb*QIB3Dsy-~|yXc?g?-*hVGUNpx3;%%X||<3#9Eu#-b6QC49a2|E>CN{I&9 zpHc0BzZ1cN%l@iLk|HNjcItU?P@rGTq3}8p{_IjthtZ(CVxB0u7$3oDhuwxX9sYg7 z#O%D=Fjr^r>+<~)b6-YuyRz3ri70KKcA=$AVf$)-_Ldh#Nx)C0GmHCZe3I$J>Ykq| zE-y1y`QV2WXnc)4OFVnBQ^jwXlHk~6IEiToj%?_2woND(jPRaOF7Cv9hoi*^{@`)N z=ojP6u&Fl`lQ?llu?1PObEtY}@FZ^~#z#%ZXavJaHeSC(exF7r8N_TF#lO>N^ezqx zI2|nb~txul&>G#zmlnL)p!soCVP$y4phz+qJ zHt!1`#P={gIBYchLl+#^l-LX#dH6mG@1hb0Vz&tkh_Cvp(-JMjZWEPozm$+`C-GFp zZlfh`nG$B<{-fAd^^y7(C!M^l@+0*Lr>d}7iIasm+Z1rZIolL)f;!vea2jBKgCsa% p9El4h@WLl0FvC+6MN!n2dI29vujRZ{tZ4uM002ovPDHLkV1jK1eA55` diff --git a/wear/src/main/res/drawable-hdpi/settings_off.png b/wear/src/main/res/drawable-hdpi/settings_off.png deleted file mode 100644 index ab7e4249a7461ff1076114567767c118dec989ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 851 zcmV-Z1FZasP)i}y zB1WsC*4vY<7;WnR6u$#!w2)(#V-akLhuQ2MqE#Wg|+O!DIt~|X`vXvvEZLmwJN>=yc0r) zMBRwEKM7*B=s>p+S)|1*>bCGbtG+8}aSK2*Xan28UXTW7!DTQCJ_v#1O8Y0Go}SHt zD2d;q&AOjAAO=axTT1ZiH2QGn|-~o66zJghs zKIyrH+v!vf&KZl3IyhF*{B+jmQKLWlJwRHjF`DN2=$%o0u(F2uUo===bQk+Wrobek5rhjgH10FD%_AZI@$)P1<7H{fY<6d0Uemz5;72u(cYzG;BQw z%lr;%&Aj`_j=#ys>%d04vZdZ7+d<|%LxzBE7wz{LZ3ng35yUqid01(2nRd%VPv?9j zZy6yVUqSoVqW#JFaNv%XIvdY4QB=378y4+v2Q5Cvq2Cg4L`e#FgEu_VNi%xmx<|DC z>}6nd;=p<_hw1McQMZ!cj+qkVKlC;oNTE7DHxTg dMCCs$e*v^!I(?3=8TSAH002ovPDHLkV1g3Rj8Xsq diff --git a/wear/src/main/res/drawable-hdpi/settings_on.png b/wear/src/main/res/drawable-hdpi/settings_on.png deleted file mode 100644 index d22797b946fce90ded6946503af8e5652c8daaa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 601 zcmV-f0;c_mP)YBmy)jC_ryBArgRgI1Ldtb>TE;;Xb85qhCuQ8yKftZeg169PgfG-^b?6)Qr46Nyh*I2c? z_zIBBVc;2*+1bEk4)Ge}b`|di*9Ht+0+$^P^cxVb;g>D05O_fY=wvk=1i>6w23z1R z4+FPglkS}bqcmm*&EYj8G)PU@J~#yrAeDzWUZiO56R<~`0!B>uvMfYaa|p_fK8a!w zwUPJ@)?ekDPDLODJ}nf^=3Zo4%)G$to%pao{5u%oRfT%Mi$w8Hpj$+fb}vCZE3wU@ z)`J=6I$uMw~kuEGHYE6t)M+>4>l4GL9mr$<8d7kZHtUho>ClMZz2HNP+ n7Yq7x7L@)d=!6qa{KNPGd0x-I@hGY|00000NkvXXu0mjf#H$DU diff --git a/wear/src/main/res/drawable-mdpi/ic_cancel.png b/wear/src/main/res/drawable-mdpi/ic_cancel.png deleted file mode 100644 index a564bff32224956f3dd3ab236636b0e96c1e6a5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 601 zcmV-f0;c_mP)JeF6n9M1>SXG!l#3BHeDw(hmQ{HT<}u z980o0k~#tRL~UKNUIDBD9m$%7YnO_KcKr5r0+ys+A-0yl0M3(iSa2tEYn}<*9nKbA z=$g+_IaS!)0Jc;F3od>w1$R#TM`Q*$VsNL)5*J|%F4++onL(8pTpOB|iZBL8PMg@5 zO#&JQXBK-mY-EkeI4zR^wwysVOL}g8~euV)nMPrJ!ie#-p{0?*i(j>*N;sBA@BsBbl;wZLB<}OU{ zgBPN97{JSDO#D5&A)K?x=GI5>F7dN+J)(hOi47z}Svd>?$%ycUuYyt9>NoXk+MS&>rM^{Ls@@A94BIp=p~U9Q5gFw*IC2`F|_zz`U4Qoso~aw>T% z_$8X15U{}ntlOQu8hkJT@4#!PfEh}B39jjR%C6)^;Es|8z!*K>0L2agy_E13RDeqG zMsqzf6DhRTD(C?H^u`HF7G$<-G?$=?3<5v!ff`elfsqG_Wp?~(1SOaTY{ z!l9{Xp18WVU3j*SArdeaO)5lGLu-*FIzZB+Fqqj$W2C1MyZY4%h_5O!RPo6Bf&1*q)jeF+t;635bn>*cFJwfOr`m2P}oE zafRwpf||iZjD_4l+z!Mmfp`}XpTc7isrVGsOpw`aK+J{95i&r$j*1qe<267mMJOcr zfp|6zET0L)e8k2-8xXfr(efrx#YJi&WCY?YDp;NYGK-Sj;19$n$gmis$Cp}J(w+P;-RH>YRhG^ihU>gv-fZBvmHa0b? z)NnvJmh6>>T%Lp2KwN+&yM|K30qsZz&H&YLc+`SwzgbA?Td3gxQ1EUCVs~OnG-wG5 zYOe1D;?0y=E)K*+psJb-y*xl%48$U%UAR$z4*&pl=9zS~F>y}-00005M9?OqWFypLRL`p;z3l9Ez4FxKij%(sdE%Nn%BZ*1gBgr8^10Yvm^BJHKFbqfl{z%wA0Mxlnz6Ee$F|qG}F+jP7p9;XZ z#OL(`(CjAp8^L6*k$ApAp9O#k3BS!wlW(wi@*e>;4*IVJe6n~G>YQ?3g87(o&MLW} z3vXa9rdv@=D0Cv#trHF(Sb3X;ARHA`mod}MUI`R;oqUD})Vz94zWV2clNk@xB6EUb zsmO$b1;W9m8{fQSOrQeetgi72BK5G8Q|+O0yq1{fmDU0ZBRfyoQN@a}!-nrLAf#~p z1Tohso%Q?)$KW^FA_vK{D(*L+Q^9vP;1>OdB=0F8D#l}5{RB2)LeUXL@~QizL`Wl_ z9?WD#7$@f3YDa)~97DG<-xPwTW2vrkC227H-Q#MQZ9U@BM zGSye<&~7HcW`Do#cJd=nQ3TZ`ZAt_c^7*(S%bRb|Za#fWC_1cQ zqe-@z!D*`0D_l=K{b`+wsuBZGrqN6Ge;#U!*APc@u9c%d$M_PVY{DZOBSGAi=FM@= zgo837qBBf-Kmcm*;!GxE$vTM$&hzzWk^G=wJ<(^gw>0l>aB+zWj-K>z>%07*qoM6N<$f(sKm_y7O^ diff --git a/wear/src/main/res/drawable-xhdpi/ic_confirm.png b/wear/src/main/res/drawable-xhdpi/ic_confirm.png deleted file mode 100644 index 4609b2d62023429dfea90d7a3be31d5dbd14ef7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=FFaiwLn>~)ow1Skkb!`!vemSO z3A|Dg>{en6T$7|-rdOzcp17csGn0$sT&CU6I5#Ub zNzfq{Qf3xXp_V~HVh15236&)p*<~MuiY&6CqU@v(9cG8x zWrx+9|C7zYys!-O?7sRwulumO1HUi3&(5{8GxN-|ad80!6i`3`xkHnalUaaFKRe(E zpvkYs&jJhsh5(6vbij7N1fjx@4!Cb|z%9QSUuZEtjC?;ipj&W2r(cZE1dIy~_yI`s zg9Dlbhq2Mi4(Mmbz6E?_*ZRC_{1V}9H&Humz4i}~ z=S2r}Fhj?wBH)JT54(5VYsRMnzB41wTJB$B_r3v=z2txfA^cZb?w1Jn>%CO^UNYkz z2r6FjE+7}f80$7*C!i6~1~`YM4DcB64)B{9H3FC| z@SFqq%+`iz{d2%gKo2HJz(GI_pd3&PSg18;0J8%6Zd(Co09P<<0fRy^n<`ptbz*m7k%B(VFZ?IbE<0oj)Q5gka zRhdIsC8lkV@&K=Oj=HhDDkjHfj?AcgQw~0+!LL~0S8Vd$f46YjlN1F%JVO7)c-EQh zfD267ehobDFrMd4b^tF`%^G;NFrIHrH9lMTUP~Psn{H~TGNw3E%QDdcRl+zcS<%by zWwjm4TCH?0NF#N=>DgkU15WamSXfg;vqIG#9>;Dggy){Ib;nF}03U0&Tkd60s7EsH z3XwC@EYF`}YX(d+K1DEYD}{TVqDyqb2u+mY*$-9WY0o^998fA4P)^fXm4Wz+Ts55s zjM}WbOQUyweXU6jXcl&9A)64#fkvw3`E(kngly(}eAju{BnR|I7}odj%)y3Fp+nSI zaorT-lc?pjQ+AY2kK!ZXmp~=aDQ}D!@jDG2kJ)8(%;4$M;ER=`%b{`jW3Fs!K68J_f6)C0aSSr<)kz_2CUyX^XUO@q;HOGOxR+xW$#2!?3U z49YE`Gk}Shp9453Qcj_n;DYQ#IvpyD3n-v~0tzUgfC8EZ{Rh32<6h%O>oouX002ov JPDHLkV1m<6^w0nR diff --git a/wear/src/main/res/drawable-xhdpi/settings_on.png b/wear/src/main/res/drawable-xhdpi/settings_on.png deleted file mode 100644 index db90aa602c5066ed4071315e5ad271dec6e0187b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 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 diff --git a/wear/src/main/res/drawable/ic_action_add.png b/wear/src/main/res/drawable/ic_action_add.png deleted file mode 100644 index ca13239a7d6102d789ddef86e219ccb44ae56950..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtAWs*^kcwMxZ*1gcP~dQN{1*Q! zJNXeqltbT>uQ86!sw>Zl0#yOQ0ha^w=0KPX47-@$wbrp42tDXvgbLY|Ls;{+F)({= UU3IEMqYNbD>FVdQ&MBb@0GInDp#T5? diff --git a/wear/src/main/res/drawable/ic_action_add.xml b/wear/src/main/res/drawable/ic_action_add.xml new file mode 100644 index 0000000000..a910bfb5bc --- /dev/null +++ b/wear/src/main/res/drawable/ic_action_add.xml @@ -0,0 +1,9 @@ + + + + diff --git a/wear/src/main/res/drawable/ic_action_minus.png b/wear/src/main/res/drawable/ic_action_minus.png deleted file mode 100644 index e68aed5a2f8985f44411ecbdc5a2fa7074c86f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCFHaZ8kcwMxFCXM&P!M1~_~m}d z77jswwGFIilrv|aWCbcg1`l!%#O1SoP(9Geh%C&&(6^1@ytJ!kYjBknNW#{;R diff --git a/wear/src/main/res/drawable/ic_action_minus.xml b/wear/src/main/res/drawable/ic_action_minus.xml new file mode 100644 index 0000000000..40b17dc531 --- /dev/null +++ b/wear/src/main/res/drawable/ic_action_minus.xml @@ -0,0 +1,8 @@ + + + diff --git a/wear/src/main/res/drawable/ic_cancel.xml b/wear/src/main/res/drawable/ic_cancel.xml new file mode 100644 index 0000000000..a922f972ec --- /dev/null +++ b/wear/src/main/res/drawable/ic_cancel.xml @@ -0,0 +1,16 @@ + + + + + diff --git a/wear/src/main/res/drawable/ic_confirm.xml b/wear/src/main/res/drawable/ic_confirm.xml new file mode 100644 index 0000000000..de281376b2 --- /dev/null +++ b/wear/src/main/res/drawable/ic_confirm.xml @@ -0,0 +1,8 @@ + + + diff --git a/wear/src/main/res/drawable/ic_icon.png b/wear/src/main/res/drawable/ic_icon.png deleted file mode 100644 index 584d65de70f6d1a23a376ded4666a876c469834c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3218 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 Ef-@R4=Kufz diff --git a/wear/src/main/res/drawable/ic_icon.xml b/wear/src/main/res/drawable/ic_icon.xml new file mode 100644 index 0000000000..ae7fa78499 --- /dev/null +++ b/wear/src/main/res/drawable/ic_icon.xml @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/wear/src/main/res/drawable/ic_icon_snooze.png b/wear/src/main/res/drawable/ic_icon_snooze.png deleted file mode 100644 index 31b80685be1ddc6ae6e41d146641773bb06a122c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24861 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
  • WCP>YCs0-i346K*v=7@B;)D`5Cu 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 diff --git a/wear/src/main/res/drawable/ic_icon_snooze.xml b/wear/src/main/res/drawable/ic_icon_snooze.xml new file mode 100644 index 0000000000..15e6a5c105 --- /dev/null +++ b/wear/src/main/res/drawable/ic_icon_snooze.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/wear/src/main/res/drawable/loop_green_25.png b/wear/src/main/res/drawable/loop_green_25.png deleted file mode 100644 index 37076d5577c90d853bd24ec600a7f91fb10cef00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21623 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 NPIj|xvuylU{~Nk!O#T1> diff --git a/wear/src/main/res/drawable/loop_green_25.xml b/wear/src/main/res/drawable/loop_green_25.xml new file mode 100644 index 0000000000..8ee928194d --- /dev/null +++ b/wear/src/main/res/drawable/loop_green_25.xml @@ -0,0 +1,9 @@ + + + + diff --git a/wear/src/main/res/drawable/loop_grey_25.png b/wear/src/main/res/drawable/loop_grey_25.png deleted file mode 100644 index 781f68d17d7710e202d4ea655f4d8869a262a70d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22321 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 D%90hr diff --git a/wear/src/main/res/drawable/loop_grey_25.xml b/wear/src/main/res/drawable/loop_grey_25.xml new file mode 100644 index 0000000000..34a7a80b72 --- /dev/null +++ b/wear/src/main/res/drawable/loop_grey_25.xml @@ -0,0 +1,9 @@ + + + + diff --git a/wear/src/main/res/drawable/loop_red_25.png b/wear/src/main/res/drawable/loop_red_25.png deleted file mode 100644 index e9dcdb0da310eb40299d50126dda5a528c8fdef2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21623 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 I%5Uv|05$MU?*IS* diff --git a/wear/src/main/res/drawable/loop_red_25.xml b/wear/src/main/res/drawable/loop_red_25.xml new file mode 100644 index 0000000000..688ff02e24 --- /dev/null +++ b/wear/src/main/res/drawable/loop_red_25.xml @@ -0,0 +1,9 @@ + + + + diff --git a/wear/src/main/res/drawable/settings_off.xml b/wear/src/main/res/drawable/settings_off.xml new file mode 100644 index 0000000000..bbe06c1740 --- /dev/null +++ b/wear/src/main/res/drawable/settings_off.xml @@ -0,0 +1,10 @@ + + + diff --git a/wear/src/main/res/drawable/settings_on.xml b/wear/src/main/res/drawable/settings_on.xml new file mode 100644 index 0000000000..b63a5fba59 --- /dev/null +++ b/wear/src/main/res/drawable/settings_on.xml @@ -0,0 +1,10 @@ + + + From 88072ea752348022ef137ed616d90d86a6b9cc4b Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 1 Jul 2022 11:36:28 +0200 Subject: [PATCH 039/154] RFSpyReader -> kt --- .../pump/medtronic/MedtronicPumpPlugin.kt | 17 +-- .../common/hw/rileylink/ble/RFSpyReader.java | 127 ------------------ .../common/hw/rileylink/ble/RFSpyReader.kt | 98 ++++++++++++++ 3 files changed, 102 insertions(+), 140 deletions(-) delete mode 100644 rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/RFSpyReader.java create mode 100644 rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/RFSpyReader.kt diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt index 01ff035702..ba19c40278 100644 --- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt +++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt @@ -20,6 +20,7 @@ import info.nightscout.androidaps.plugins.general.actions.defs.CustomActionType import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification import info.nightscout.androidaps.plugins.general.overview.notifications.Notification import info.nightscout.androidaps.plugins.pump.common.PumpPluginAbstract +import info.nightscout.androidaps.plugins.pump.common.data.PumpStatus import info.nightscout.androidaps.plugins.pump.common.defs.PumpDriverState import info.nightscout.androidaps.plugins.pump.common.defs.PumpType import info.nightscout.androidaps.plugins.pump.common.events.EventRefreshButtonState @@ -54,8 +55,6 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil.Comp import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.TimeChangeType -import info.nightscout.androidaps.interfaces.ResourceHelper -import info.nightscout.androidaps.plugins.pump.common.data.PumpStatus import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.shared.logging.AAPSLogger import info.nightscout.shared.logging.LTag @@ -306,12 +305,8 @@ class MedtronicPumpPlugin @Inject constructor( private val isPumpNotReachable: Boolean get() { val rileyLinkServiceState = rileyLinkServiceData.rileyLinkServiceState - if (rileyLinkServiceState == null) { - aapsLogger.debug(LTag.PUMP, "RileyLink unreachable. RileyLinkServiceState is null.") - return false - } - if (rileyLinkServiceState != RileyLinkServiceState.PumpConnectorReady // - && rileyLinkServiceState != RileyLinkServiceState.RileyLinkReady // + if (rileyLinkServiceState != RileyLinkServiceState.PumpConnectorReady + && rileyLinkServiceState != RileyLinkServiceState.RileyLinkReady && rileyLinkServiceState != RileyLinkServiceState.TuneUpDevice ) { aapsLogger.debug(LTag.PUMP, "RileyLink unreachable.") @@ -998,11 +993,7 @@ class MedtronicPumpPlugin @Inject constructor( } @Synchronized - private fun workWithStatusRefresh( - action: StatusRefreshAction, // - statusRefreshType: MedtronicStatusRefreshType?, // - time: Long? - ): Map? { + private fun workWithStatusRefresh(action: StatusRefreshAction, statusRefreshType: MedtronicStatusRefreshType?, time: Long?): Map? { return when (action) { StatusRefreshAction.Add -> { statusRefreshMap[statusRefreshType!!] = time!! diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/RFSpyReader.java b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/RFSpyReader.java deleted file mode 100644 index 9e3a094a9c..0000000000 --- a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/RFSpyReader.java +++ /dev/null @@ -1,127 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble; - -import android.os.SystemClock; - -import java.util.UUID; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - -import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.GattAttributes; -import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkEncodingType; -import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.operations.BLECommOperationResult; -import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil; -import info.nightscout.androidaps.plugins.pump.common.utils.ThreadUtil; -import info.nightscout.shared.logging.AAPSLogger; -import info.nightscout.shared.logging.LTag; - -/** - * Created by geoff on 5/26/16. - */ -public class RFSpyReader { - - private final AAPSLogger aapsLogger; - ExecutorService executor = Executors.newSingleThreadExecutor(); - private final RileyLinkBLE rileyLinkBle; - private final Semaphore waitForRadioData = new Semaphore(0, true); - private final LinkedBlockingQueue mDataQueue = new LinkedBlockingQueue<>(); - private int acquireCount = 0; - private int releaseCount = 0; - private boolean stopAtNull = true; - - - RFSpyReader(AAPSLogger aapsLogger, RileyLinkBLE rileyLinkBle) { - this.aapsLogger = aapsLogger; - this.rileyLinkBle = rileyLinkBle; - } - - - void setRileyLinkEncodingType(RileyLinkEncodingType encodingType) { - aapsLogger.debug("setRileyLinkEncodingType: " + encodingType); - stopAtNull = !(encodingType == RileyLinkEncodingType.Manchester || // - encodingType == RileyLinkEncodingType.FourByteSixByteRileyLink); - } - - - // This timeout must be coordinated with the length of the RFSpy radio operation or Bad Things Happen. - byte[] poll(int timeout_ms) { - aapsLogger.debug(LTag.PUMPBTCOMM, ThreadUtil.sig() + "Entering poll at t==" + SystemClock.uptimeMillis() + ", timeout is " + timeout_ms - + " mDataQueue size is " + mDataQueue.size()); - - if (mDataQueue.isEmpty()) { - try { - // block until timeout or data available. - // returns null if timeout. - byte[] dataFromQueue = mDataQueue.poll(timeout_ms, TimeUnit.MILLISECONDS); - if (dataFromQueue != null) { - aapsLogger.debug(LTag.PUMPBTCOMM, "Got data [" + ByteUtil.shortHexString(dataFromQueue) + "] at t==" - + SystemClock.uptimeMillis()); - } else { - aapsLogger.debug(LTag.PUMPBTCOMM, "Got data [null] at t==" + SystemClock.uptimeMillis()); - } - return dataFromQueue; - } catch (InterruptedException e) { - aapsLogger.error(LTag.PUMPBTCOMM, "poll: Interrupted waiting for data"); - } - } - - return null; - } - - - // Call this from the "response count" notification handler. - void newDataIsAvailable() { - releaseCount++; - - aapsLogger.debug(LTag.PUMPBTCOMM, ThreadUtil.sig() + "waitForRadioData released(count=" + releaseCount + ") at t=" - + SystemClock.uptimeMillis()); - waitForRadioData.release(); - } - - - public void start() { - executor.execute(() -> { - UUID serviceUUID = UUID.fromString(GattAttributes.SERVICE_RADIO); - UUID radioDataUUID = UUID.fromString(GattAttributes.CHARA_RADIO_DATA); - BLECommOperationResult result; - //noinspection InfiniteLoopStatement - while (true) { - try { - acquireCount++; - waitForRadioData.acquire(); - aapsLogger.debug(LTag.PUMPBTCOMM, ThreadUtil.sig() + "waitForRadioData acquired (count=" + acquireCount + ") at t=" - + SystemClock.uptimeMillis()); - SystemClock.sleep(100); - SystemClock.sleep(1); - result = rileyLinkBle.readCharacteristicBlocking(serviceUUID, radioDataUUID); - SystemClock.sleep(100); - - if (result.resultCode == BLECommOperationResult.RESULT_SUCCESS) { - if (stopAtNull) { - // only data up to the first null is valid - for (int i = 0; i < result.value.length; i++) { - if (result.value[i] == 0) { - result.value = ByteUtil.substring(result.value, 0, i); - break; - } - } - } - mDataQueue.add(result.value); - } else if (result.resultCode == BLECommOperationResult.RESULT_INTERRUPTED) { - aapsLogger.error(LTag.PUMPBTCOMM, "Read operation was interrupted"); - } else if (result.resultCode == BLECommOperationResult.RESULT_TIMEOUT) { - aapsLogger.error(LTag.PUMPBTCOMM, "Read operation on Radio Data timed out"); - } else if (result.resultCode == BLECommOperationResult.RESULT_BUSY) { - aapsLogger.error(LTag.PUMPBTCOMM, "FAIL: RileyLinkBLE reports operation already in progress"); - } else if (result.resultCode == BLECommOperationResult.RESULT_NONE) { - aapsLogger.error(LTag.PUMPBTCOMM, "FAIL: got invalid result code: " + result.resultCode); - } - } catch (InterruptedException e) { - aapsLogger.error(LTag.PUMPBTCOMM, "Interrupted while waiting for data"); - } - } - }); - } -} diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/RFSpyReader.kt b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/RFSpyReader.kt new file mode 100644 index 0000000000..62abb3fd8e --- /dev/null +++ b/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/ble/RFSpyReader.kt @@ -0,0 +1,98 @@ +package info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble + +import android.os.SystemClock +import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.GattAttributes +import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.defs.RileyLinkEncodingType +import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.operations.BLECommOperationResult +import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil +import info.nightscout.androidaps.plugins.pump.common.utils.ThreadUtil +import info.nightscout.shared.logging.AAPSLogger +import info.nightscout.shared.logging.LTag +import java.util.* +import java.util.concurrent.Executors +import java.util.concurrent.LinkedBlockingQueue +import java.util.concurrent.Semaphore +import java.util.concurrent.TimeUnit + +/** + * Created by geoff on 5/26/16. + */ +class RFSpyReader internal constructor(private val aapsLogger: AAPSLogger, private val rileyLinkBle: RileyLinkBLE) { + + private var executor = Executors.newSingleThreadExecutor() + private val waitForRadioData = Semaphore(0, true) + private val mDataQueue = LinkedBlockingQueue() + private var acquireCount = 0 + private var releaseCount = 0 + private var stopAtNull = true + fun setRileyLinkEncodingType(encodingType: RileyLinkEncodingType) { + aapsLogger.debug("setRileyLinkEncodingType: $encodingType") + stopAtNull = !(encodingType == RileyLinkEncodingType.Manchester || encodingType == RileyLinkEncodingType.FourByteSixByteRileyLink) + } + + // This timeout must be coordinated with the length of the RFSpy radio operation or Bad Things Happen. + fun poll(timeout_ms: Int): ByteArray? { + aapsLogger.debug(LTag.PUMPBTCOMM, "${ThreadUtil.sig()}Entering poll at t==${SystemClock.uptimeMillis()}, timeout is $timeout_ms mDataQueue size is ${mDataQueue.size}") + if (mDataQueue.isEmpty()) { + try { + // block until timeout or data available. + // returns null if timeout. + val dataFromQueue = mDataQueue.poll(timeout_ms.toLong(), TimeUnit.MILLISECONDS) + if (dataFromQueue != null) + aapsLogger.debug(LTag.PUMPBTCOMM, "Got data [${ByteUtil.shortHexString(dataFromQueue)}] at t==${SystemClock.uptimeMillis()}") + else + aapsLogger.debug(LTag.PUMPBTCOMM, "Got data [null] at t==" + SystemClock.uptimeMillis()) + return dataFromQueue + } catch (e: InterruptedException) { + aapsLogger.error(LTag.PUMPBTCOMM, "poll: Interrupted waiting for data") + } + } + return null + } + + // Call this from the "response count" notification handler. + fun newDataIsAvailable() { + releaseCount++ + aapsLogger.debug(LTag.PUMPBTCOMM, "${ThreadUtil.sig()}waitForRadioData released(count=$releaseCount) at t=${SystemClock.uptimeMillis()}") + waitForRadioData.release() + } + + fun start() { + executor.execute { + val serviceUUID = UUID.fromString(GattAttributes.SERVICE_RADIO) + val radioDataUUID = UUID.fromString(GattAttributes.CHARA_RADIO_DATA) + var result: BLECommOperationResult + while (true) { + try { + acquireCount++ + waitForRadioData.acquire() + aapsLogger.debug(LTag.PUMPBTCOMM, "${ThreadUtil.sig()}waitForRadioData acquired (count=$acquireCount) at t=${SystemClock.uptimeMillis()}") + SystemClock.sleep(100) + result = rileyLinkBle.readCharacteristicBlocking(serviceUUID, radioDataUUID) + SystemClock.sleep(100) + if (result.resultCode == BLECommOperationResult.RESULT_SUCCESS) { + if (stopAtNull) { + // only data up to the first null is valid + for (i in result.value.indices) { + if (result.value[i].toInt() == 0) { + result.value = ByteUtil.substring(result.value, 0, i) + break + } + } + } + mDataQueue.add(result.value) + } else if (result.resultCode == BLECommOperationResult.RESULT_INTERRUPTED) + aapsLogger.error(LTag.PUMPBTCOMM, "Read operation was interrupted") + else if (result.resultCode == BLECommOperationResult.RESULT_TIMEOUT) + aapsLogger.error(LTag.PUMPBTCOMM, "Read operation on Radio Data timed out") + else if (result.resultCode == BLECommOperationResult.RESULT_BUSY) + aapsLogger.error(LTag.PUMPBTCOMM, "FAIL: RileyLinkBLE reports operation already in progress") + else if (result.resultCode == BLECommOperationResult.RESULT_NONE) + aapsLogger.error(LTag.PUMPBTCOMM, "FAIL: got invalid result code: ${result.resultCode}") + } catch (e: InterruptedException) { + aapsLogger.error(LTag.PUMPBTCOMM, "Interrupted while waiting for data") + } + } + } + } +} \ No newline at end of file From ad89d54319208ca58cf382021b5d2bdcf59b09e5 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 1 Jul 2022 12:38:05 +0200 Subject: [PATCH 040/154] MedtronicPumpPlugin -> kt --- .../pump/medtronic/MedtronicPumpPlugin.kt | 54 +++---------------- 1 file changed, 8 insertions(+), 46 deletions(-) diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt index ba19c40278..a3849304e5 100644 --- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt +++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt @@ -201,9 +201,7 @@ class MedtronicPumpPlugin @Inject constructor( do { SystemClock.sleep(60000) if (this.isInitialized) { - val statusRefresh = workWithStatusRefresh( - StatusRefreshAction.GetData, null, null - )!! + val statusRefresh = synchronized(statusRefreshMap) { HashMap(statusRefreshMap) } if (doWeHaveAnyStatusNeededRefreshing(statusRefresh)) { if (!commandQueue.statusInQueue()) { commandQueue.readStatus(rh.gs(R.string.scheduled_status_refresh), null) @@ -316,10 +314,7 @@ class MedtronicPumpPlugin @Inject constructor( } private fun refreshAnyStatusThatNeedsToBeRefreshed() { - val statusRefresh = workWithStatusRefresh( - StatusRefreshAction.GetData, null, - null - )!! + val statusRefresh = synchronized(statusRefreshMap) { HashMap(statusRefreshMap) } if (!doWeHaveAnyStatusNeededRefreshing(statusRefresh)) { return } @@ -659,19 +654,9 @@ class MedtronicPumpPlugin @Inject constructor( @Suppress("SameParameterValue") private fun setNotReachable(isBolus: Boolean, success: Boolean): PumpEnactResult { setRefreshButtonEnabled(true) - if (isBolus) { - bolusDeliveryType = BolusDeliveryType.Idle - } - return if (success) { - PumpEnactResult(injector) // - .success(true) // - .enacted(false) - } else { - PumpEnactResult(injector) // - .success(false) // - .enacted(false) // - .comment(R.string.medtronic_pump_status_pump_unreachable) - } + if (isBolus) bolusDeliveryType = BolusDeliveryType.Idle + return if (success) PumpEnactResult(injector).success(true).enacted(false) + else PumpEnactResult(injector).success(false).enacted(false).comment(R.string.medtronic_pump_status_pump_unreachable) } override fun stopBolusDelivering() { @@ -688,7 +673,7 @@ class MedtronicPumpPlugin @Inject constructor( } // if enforceNew===true current temp basal is canceled and new TBR set (duration is prolonged), - // if false and the same rate is requested enacted=false and success=true is returned and TBR is not changed +// if false and the same rate is requested enacted=false and success=true is returned and TBR is not changed @Synchronized override fun setTempBasalAbsolute(absoluteRate: Double, durationInMinutes: Int, profile: Profile, enforceNew: Boolean, tbrType: TemporaryBasalType): PumpEnactResult { setRefreshButtonEnabled(false) @@ -975,38 +960,15 @@ class MedtronicPumpPlugin @Inject constructor( MedtronicStatusRefreshType.RemainingInsulin -> { val remaining = medtronicPumpStatus.reservoirRemainingUnits val min: Int = if (remaining > 50) 4 * 60 else if (remaining > 20) 60 else 15 - workWithStatusRefresh(StatusRefreshAction.Add, refreshType, getTimeInFutureFromMinutes(min)) + synchronized(statusRefreshMap) { statusRefreshMap[refreshType] = getTimeInFutureFromMinutes(min) } } MedtronicStatusRefreshType.PumpTime, MedtronicStatusRefreshType.Configuration, MedtronicStatusRefreshType.BatteryStatus, MedtronicStatusRefreshType.PumpHistory -> { - workWithStatusRefresh( - StatusRefreshAction.Add, refreshType, - getTimeInFutureFromMinutes(refreshType.refreshTime + additionalTimeInMinutes) - ) + synchronized(statusRefreshMap) { statusRefreshMap[refreshType] = getTimeInFutureFromMinutes(refreshType.refreshTime + additionalTimeInMinutes) } } } } - private enum class StatusRefreshAction { - Add, // - GetData - } - - @Synchronized - private fun workWithStatusRefresh(action: StatusRefreshAction, statusRefreshType: MedtronicStatusRefreshType?, time: Long?): Map? { - return when (action) { - StatusRefreshAction.Add -> { - statusRefreshMap[statusRefreshType!!] = time!! - null - } - - StatusRefreshAction.GetData -> { - HashMap(statusRefreshMap) - } - - } - } - private fun getTimeInFutureFromMinutes(minutes: Int): Long { return System.currentTimeMillis() + getTimeInMs(minutes) } From 53c041f5cfa465db8ce8da7711bf89468088612f Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Sun, 3 Jul 2022 15:34:33 +0100 Subject: [PATCH 041/154] - extended pump-common package a little, so that in the future we can abstract some of stuff that is used by all (most) of drivers: History Dialog, BLE_Discovery, events and some other stuff (I used this with my new Ypso driver and I want to use the same with Tslim) --- .../pump/medtronic/MedtronicPumpPlugin.kt | 10 +- .../medtronic/driver/MedtronicPumpStatus.kt | 2 +- pump-common/src/main/AndroidManifest.xml | 14 +- .../plugins/pump/common/PumpPluginAbstract.kt | 43 ++- .../pump/common/ble/BondStateReceiver.kt | 77 ++++ .../plugins/pump/common/data/PumpStatus.kt | 7 +- .../pump/common/data/PumpTimeDifferenceDto.kt | 25 ++ .../pump/common/defs/BasalProfileStatus.java | 14 + .../pump/common/defs/PumpDriverState.kt | 28 +- .../pump/common/defs/PumpHistoryEntryGroup.kt | 39 +- .../pump/common/defs/PumpRunningState.kt | 9 + .../pump/common/defs/PumpTypeGroupConfig.kt | 8 + .../common/defs/PumpUpdateFragmentType.kt | 49 +++ .../common/driver/PumpDriverConfiguration.kt | 11 + .../driver/PumpDriverConfigurationCapable.kt | 7 + .../pump/common/driver/ble/PumpBLESelector.kt | 105 ++++++ .../driver/ble/PumpBLESelectorAbstract.kt | 108 ++++++ .../driver/history/PumpDataConverter.kt | 4 + .../driver/history/PumpHistoryDataProvider.kt | 75 ++++ .../PumpHistoryDataProviderAbstract.kt | 46 +++ .../common/driver/history/PumpHistoryEntry.kt | 18 + .../pump/common/events/EventBondChanged.kt | 8 + .../pump/common/events/EventPumpChanged.kt | 8 + .../EventPumpConnectionParametersChanged.kt | 6 + .../events/EventPumpFragmentValuesChanged.kt | 14 + .../common/events/EventRefreshButtonState.kt | 0 .../pump/common/ui/PumpBLEConfigActivity.kt | 338 ++++++++++++++++++ .../pump/common/ui/PumpHistoryActivity.kt | 217 +++++++++++ .../res/layout/pump_ble_config_activity.xml | 82 +++++ .../res/layout/pump_ble_config_scan_item.xml | 24 ++ .../main/res/layout/pump_history_activity.xml | 67 ++++ .../src/main/res/layout/pump_history_item.xml | 32 ++ pump-common/src/main/res/values/strings.xml | 74 +++- pump-common/src/main/res/values/styles.xml | 18 + 34 files changed, 1549 insertions(+), 38 deletions(-) create mode 100644 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/ble/BondStateReceiver.kt create mode 100755 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/data/PumpTimeDifferenceDto.kt create mode 100755 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/BasalProfileStatus.java create mode 100755 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpRunningState.kt create mode 100644 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpTypeGroupConfig.kt create mode 100755 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpUpdateFragmentType.kt create mode 100644 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/PumpDriverConfiguration.kt create mode 100644 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/PumpDriverConfigurationCapable.kt create mode 100644 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/ble/PumpBLESelector.kt create mode 100644 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/ble/PumpBLESelectorAbstract.kt create mode 100644 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpDataConverter.kt create mode 100644 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpHistoryDataProvider.kt create mode 100644 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpHistoryDataProviderAbstract.kt create mode 100644 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpHistoryEntry.kt create mode 100644 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventBondChanged.kt create mode 100755 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventPumpChanged.kt create mode 100644 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventPumpConnectionParametersChanged.kt create mode 100755 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventPumpFragmentValuesChanged.kt rename {rileylink => pump-common}/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventRefreshButtonState.kt (100%) mode change 100644 => 100755 create mode 100755 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/ui/PumpBLEConfigActivity.kt create mode 100755 pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/ui/PumpHistoryActivity.kt create mode 100755 pump-common/src/main/res/layout/pump_ble_config_activity.xml create mode 100755 pump-common/src/main/res/layout/pump_ble_config_scan_item.xml create mode 100755 pump-common/src/main/res/layout/pump_history_activity.xml create mode 100755 pump-common/src/main/res/layout/pump_history_item.xml create mode 100644 pump-common/src/main/res/values/styles.xml diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt index a3849304e5..a0fb470863 100644 --- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt +++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.kt @@ -194,7 +194,11 @@ class MedtronicPumpPlugin @Inject constructor( } } - override fun onStartCustomActions() { + override fun hasService(): Boolean { + return true + } + + override fun onStartScheduledPumpActions() { // check status every minute (if any status needs refresh we send readStatus command) Thread { @@ -673,7 +677,7 @@ class MedtronicPumpPlugin @Inject constructor( } // if enforceNew===true current temp basal is canceled and new TBR set (duration is prolonged), -// if false and the same rate is requested enacted=false and success=true is returned and TBR is not changed + // if false and the same rate is requested enacted=false and success=true is returned and TBR is not changed @Synchronized override fun setTempBasalAbsolute(absoluteRate: Double, durationInMinutes: Int, profile: Profile, enforceNew: Boolean, tbrType: TemporaryBasalType): PumpEnactResult { setRefreshButtonEnabled(false) @@ -743,7 +747,7 @@ class MedtronicPumpPlugin @Inject constructor( PumpEnactResult(injector).success(false).enacted(false) // .comment(R.string.medtronic_cmd_tbr_could_not_be_delivered) } else { - medtronicPumpStatus.tempBasalStart = Date() + medtronicPumpStatus.tempBasalStart = System.currentTimeMillis() medtronicPumpStatus.tempBasalAmount = absoluteRate medtronicPumpStatus.tempBasalLength = durationInMinutes diff --git a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/driver/MedtronicPumpStatus.kt b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/driver/MedtronicPumpStatus.kt index 504994800f..82238a9e3f 100644 --- a/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/driver/MedtronicPumpStatus.kt +++ b/medtronic/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/driver/MedtronicPumpStatus.kt @@ -122,7 +122,7 @@ class MedtronicPumpStatus @Inject constructor(private val rh: ResourceHelper, get() { if (tempBasalStart == null) return null if (tempBasalEnd == null) { - val startTime = tempBasalStart!!.time + val startTime = tempBasalStart!! tempBasalEnd = startTime + tempBasalLength!! * 60 * 1000 } if (System.currentTimeMillis() > tempBasalEnd!!) { diff --git a/pump-common/src/main/AndroidManifest.xml b/pump-common/src/main/AndroidManifest.xml index b935efb489..84d3bd3279 100644 --- a/pump-common/src/main/AndroidManifest.xml +++ b/pump-common/src/main/AndroidManifest.xml @@ -1,6 +1,18 @@ - + + + + + + + + + diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.kt index 00ee367a8c..b955024616 100644 --- a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.kt +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.Intent import android.content.ServiceConnection import android.text.format.DateFormat +import com.google.gson.GsonBuilder import dagger.android.HasAndroidInjector import info.nightscout.androidaps.data.DetailedBolusInfo import info.nightscout.androidaps.data.PumpEnactResult @@ -25,7 +26,6 @@ import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DecimalFormatter.to0Decimal import info.nightscout.androidaps.utils.DecimalFormatter.to2Decimal import info.nightscout.androidaps.utils.FabricPrivacy -import info.nightscout.androidaps.interfaces.ResourceHelper import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.shared.logging.AAPSLogger import info.nightscout.shared.logging.LTag @@ -56,7 +56,7 @@ abstract class PumpPluginAbstract protected constructor( var pumpSyncStorage: info.nightscout.androidaps.plugins.pump.common.sync.PumpSyncStorage ) : PumpPluginBase(pluginDescription!!, injector!!, aapsLogger, rh, commandQueue), Pump, Constraints, info.nightscout.androidaps.plugins.pump.common.sync.PumpSyncEntriesCreator { - private val disposable = CompositeDisposable() + val disposable = CompositeDisposable() // Pump capabilities final override var pumpDescription = PumpDescription() @@ -68,30 +68,41 @@ abstract class PumpPluginAbstract protected constructor( protected var displayConnectionMessages = false var pumpType: PumpType = PumpType.GENERIC_AAPS + get() = field set(value) { field = value pumpDescription.fillFor(value) } + protected var gson = GsonBuilder().excludeFieldsWithoutExposeAnnotation().create() + abstract fun initPumpStatusData() + open fun hasService(): Boolean { + return true + } + override fun onStart() { super.onStart() initPumpStatusData() - val intent = Intent(context, serviceClass) - context.bindService(intent, serviceConnection!!, Context.BIND_AUTO_CREATE) + if (hasService()) { + val intent = Intent(context, serviceClass) + context.bindService(intent, serviceConnection!!, Context.BIND_AUTO_CREATE) + disposable.add(rxBus + .toObservable(EventAppExit::class.java) + .observeOn(aapsSchedulers.io) + .subscribe({ _ -> context.unbindService(serviceConnection!!) }) { throwable: Throwable? -> fabricPrivacy.logException(throwable!!) } + ) + } serviceRunning = true - disposable.add(rxBus - .toObservable(EventAppExit::class.java) - .observeOn(aapsSchedulers.io) - .subscribe({ _ -> context.unbindService(serviceConnection!!) }) { throwable: Throwable? -> fabricPrivacy.logException(throwable!!) } - ) - onStartCustomActions() + onStartScheduledPumpActions() } override fun onStop() { - aapsLogger.debug(LTag.PUMP, deviceID() + " onStop()") - context.unbindService(serviceConnection!!) + aapsLogger.debug(LTag.PUMP, model().model + " onStop()") + if (hasService()) { + context.unbindService(serviceConnection!!) + } serviceRunning = false disposable.clear() super.onStop() @@ -100,7 +111,7 @@ abstract class PumpPluginAbstract protected constructor( /** * If we need to run any custom actions in onStart (triggering events, etc) */ - abstract fun onStartCustomActions() + abstract fun onStartScheduledPumpActions() /** * Service class (same one you did serviceConnection for) @@ -231,7 +242,8 @@ abstract class PumpPluginAbstract protected constructor( val extended = JSONObject() try { battery.put("percent", pumpStatusData.batteryRemaining) - status.put("status", pumpStatusData.pumpStatusType.status) +// TODO check this status.put("status", pumpStatusData.pumpStatusType.status) + status.put("status", pumpStatusData.pumpRunningState.status) extended.put("Version", version) try { extended.put("ActiveProfile", profileName) @@ -324,6 +336,7 @@ abstract class PumpPluginAbstract protected constructor( // bolus needed, ask pump to deliver it deliverBolus(detailedBolusInfo) } else { + detailedBolusInfo.timestamp = System.currentTimeMillis() // no bolus required, carb only treatment pumpSyncStorage.addCarbs(PumpDbEntryCarbs(detailedBolusInfo, this)) @@ -360,4 +373,4 @@ abstract class PumpPluginAbstract protected constructor( pumpDescription.fillFor(pumpType) this.pumpType = pumpType } -} \ No newline at end of file +} diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/ble/BondStateReceiver.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/ble/BondStateReceiver.kt new file mode 100644 index 0000000000..37df0f9e0c --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/ble/BondStateReceiver.kt @@ -0,0 +1,77 @@ +package info.nightscout.androidaps.plugins.pump.common.ble + +import android.bluetooth.BluetoothDevice +import android.content.Context +import android.content.Intent +import androidx.annotation.StringRes +import com.google.gson.Gson +import dagger.android.DaggerBroadcastReceiver +import info.nightscout.androidaps.plugins.bus.RxBus +import info.nightscout.androidaps.plugins.pump.common.events.EventPumpConnectionParametersChanged +import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.shared.logging.AAPSLogger +import info.nightscout.shared.logging.LTag +import info.nightscout.shared.sharedPreferences.SP +import javax.inject.Inject + +class BondStateReceiver( + @StringRes var deviceAddress: Int, + @StringRes var bondedFlag: Int, + var targetDevice: String, + var targetState: Int +) : DaggerBroadcastReceiver() { + + @Inject lateinit var sp: SP + @Inject lateinit var context: Context + @Inject lateinit var rh: ResourceHelper + @Inject lateinit var aapsLogger: AAPSLogger + @Inject lateinit var rxBus: RxBus + + var TAG = LTag.PUMPBTCOMM + var gson = Gson() + var applicationContext: Context? = null + + override fun onReceive(context: Context, intent: Intent) { + super.onReceive(context, intent) + val action = intent.action + val device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) + aapsLogger.info(TAG, "in onReceive: INTENT" + gson.toJson(intent)) + if (device == null) { + aapsLogger.error(TAG, "onReceive. Device is null. Exiting.") + return + } else { + if (device.address != targetDevice) { + aapsLogger.error(TAG, "onReceive. Device is not the same as targetDevice. Exiting.") + return + } + } + + // Check if action is valid + if (action == null) return + + // Take action depending on new bond state + if (action == BluetoothDevice.ACTION_BOND_STATE_CHANGED) { + val bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR) + val previousBondState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, -1) + aapsLogger.info(TAG, "in onReceive: bondState=$bondState, previousBondState=$previousBondState") + if (bondState == targetState) { + aapsLogger.info(TAG, "onReceive: found targeted state: $targetState") + val currentDeviceSettings = sp.getString(deviceAddress, "") + if (currentDeviceSettings.equals(targetDevice)) { + if (targetState == 12) { + sp.putBoolean(bondedFlag, true) + rxBus.send(EventPumpConnectionParametersChanged()) + } else if (targetState == 10) { + sp.putBoolean(bondedFlag, false) + rxBus.send(EventPumpConnectionParametersChanged()) + } + context.unregisterReceiver(this) + } else { + aapsLogger.error(TAG, "onReceive: Device stored in SP is not the same as target device, process interrupted") + } + } else { + aapsLogger.info(TAG, "onReceive: currentBondState=$bondState, targetBondState=$targetState") + } + } + } +} \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/data/PumpStatus.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/data/PumpStatus.kt index 9ecd30bca7..9c4ea272d9 100644 --- a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/data/PumpStatus.kt +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/data/PumpStatus.kt @@ -1,6 +1,6 @@ package info.nightscout.androidaps.plugins.pump.common.data -import info.nightscout.androidaps.plugins.pump.common.defs.PumpStatusType +import info.nightscout.androidaps.plugins.pump.common.defs.PumpRunningState import info.nightscout.androidaps.plugins.pump.common.defs.PumpType import java.util.* @@ -33,12 +33,13 @@ abstract class PumpStatus(var pumpType: PumpType) { var dailyTotalUnits: Double? = null var maxDailyTotalUnits: String? = null var units: String? = null // Constants.MGDL or Constants.MMOL - var pumpStatusType = PumpStatusType.Running + var pumpRunningState = PumpRunningState.Running var basalsByHour: DoubleArray? = null - var tempBasalStart: Date? = null + var tempBasalStart: Long? = null var tempBasalAmount: Double? = 0.0 var tempBasalLength: Int? = 0 var tempBasalEnd: Long? = null + var pumpTime: PumpTimeDifferenceDto? = null abstract fun initSettings() diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/data/PumpTimeDifferenceDto.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/data/PumpTimeDifferenceDto.kt new file mode 100755 index 0000000000..561967c714 --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/data/PumpTimeDifferenceDto.kt @@ -0,0 +1,25 @@ +package info.nightscout.androidaps.plugins.pump.common.data + +import org.joda.time.DateTime +import org.joda.time.Seconds + +/** + * Created by andy on 28/05/2021. + */ +class PumpTimeDifferenceDto constructor(var localDeviceTime: DateTime, + var pumpTime: DateTime) { + + var timeDifference = 0 + + fun calculateDifference() { + val secondsBetween = Seconds.secondsBetween(localDeviceTime, pumpTime) + timeDifference = secondsBetween.seconds + + // val diff = localDeviceTime - pumpTime + // timeDifference = (diff / 1000.0).toInt() + } + + init { + calculateDifference() + } +} \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/BasalProfileStatus.java b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/BasalProfileStatus.java new file mode 100755 index 0000000000..0d56ee4ef8 --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/BasalProfileStatus.java @@ -0,0 +1,14 @@ +package info.nightscout.androidaps.plugins.pump.common.defs; + +/** + * Created by andy on 1/20/19. + */ + +public enum BasalProfileStatus { + + NotInitialized, // + ProfileOK, // + ProfileChanged, // + ; + +} diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpDriverState.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpDriverState.kt index f72163ce92..6f6124005d 100644 --- a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpDriverState.kt +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpDriverState.kt @@ -1,14 +1,26 @@ package info.nightscout.androidaps.plugins.pump.common.defs -enum class PumpDriverState { +import info.nightscout.androidaps.plugins.pump.common.R - NotInitialized, - Connecting, - Connected, - Initialized, - Ready, Busy, - Suspended; +// TODO there are 3 classes now, that do similar things, sort of, need to define exact rules: PumpDeviceState, PumpDriverState, PumpStatusState + +// TODO split this enum into 2 +enum class PumpDriverState(var resourceId: Int) { + + NotInitialized(R.string.pump_status_not_initialized), // this state should be set only when driver is created + Connecting(R.string.connecting), // + Connected(R.string.connected), // + Initialized(R.string.pump_status_initialized), // this is weird state that probably won't be used, since its more driver centric that communication centric + EncryptCommunication(R.string.pump_status_encrypt), // + Ready(R.string.pump_status_ready), + Busy(R.string.pump_status_busy), // + Suspended(R.string.pump_status_suspended), // + Sleeping(R.string.pump_status_sleeping), + ExecutingCommand(R.string.pump_status_executing_command), + Disconnecting(R.string.disconnecting), + Disconnected(R.string.disconnected), + ErrorCommunicatingWithPump(R.string.pump_status_error_comm); fun isConnected(): Boolean = this == Connected || this == Initialized || this == Busy || this == Suspended fun isInitialized(): Boolean = this == Initialized || this == Busy || this == Suspended -} \ No newline at end of file +} diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpHistoryEntryGroup.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpHistoryEntryGroup.kt index 4a98471dc4..189353809a 100644 --- a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpHistoryEntryGroup.kt +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpHistoryEntryGroup.kt @@ -2,7 +2,7 @@ package info.nightscout.androidaps.plugins.pump.common.defs import info.nightscout.androidaps.plugins.pump.common.R import info.nightscout.androidaps.interfaces.ResourceHelper -import java.util.* +import kotlin.streams.toList /** * This file was taken from GGC - GNU Gluco Control (ggc.sourceforge.net), application for diabetes @@ -11,9 +11,10 @@ import java.util.* * * Author: Andy {andy.rozman@gmail.com} */ -enum class PumpHistoryEntryGroup(val resourceId: Int) { +enum class PumpHistoryEntryGroup(val resourceId: Int, val pumpTypeGroupConfig: PumpTypeGroupConfig = PumpTypeGroupConfig.All) { All(R.string.history_group_all), + Base(R.string.history_group_base), Bolus(R.string.history_group_bolus), Basal(R.string.history_group_basal), Prime(R.string.history_group_prime), @@ -22,7 +23,14 @@ enum class PumpHistoryEntryGroup(val resourceId: Int) { Glucose(R.string.history_group_glucose), Notification(R.string.history_group_notification), Statistic(R.string.history_group_statistic), - Unknown(R.string.history_group_unknown); + Other(R.string.history_group_other), + Unknown(R.string.history_group_unknown), + + // Ypso + EventsOnly(R.string.history_group_events), + EventsNoStat(R.string.history_group_events_no_stat) + + ; var translated: String? = null private set @@ -33,9 +41,10 @@ enum class PumpHistoryEntryGroup(val resourceId: Int) { companion object { - private var translatedList: MutableList? = null + @JvmStatic private var translatedList: MutableList? = null - private fun doTranslation(rh: ResourceHelper) { + fun doTranslation(rh: ResourceHelper) { + if (translatedList != null) return translatedList = ArrayList() for (pumpHistoryEntryGroup in values()) { pumpHistoryEntryGroup.translated = rh.gs(pumpHistoryEntryGroup.resourceId) @@ -43,9 +52,27 @@ enum class PumpHistoryEntryGroup(val resourceId: Int) { } } + // FIXME this is just for Java compatibility reasons (can be removed when all drivers using it are in Kotlin - OmnipodEros still in java) fun getTranslatedList(rh: ResourceHelper): List { + return getTranslatedList(rh, PumpTypeGroupConfig.All) + } + + fun getTranslatedList(rh: ResourceHelper, pumpTypeGroupConfig: PumpTypeGroupConfig = PumpTypeGroupConfig.All): List { if (translatedList == null) doTranslation(rh) - return translatedList!! + + val outList: List + + if (pumpTypeGroupConfig == PumpTypeGroupConfig.All) { + outList = translatedList!!.stream() + .filter { pre -> pre.pumpTypeGroupConfig == PumpTypeGroupConfig.All } + .toList(); + } else { + outList = translatedList!!.stream() + .filter { pre -> (pre.pumpTypeGroupConfig == PumpTypeGroupConfig.All || pre.pumpTypeGroupConfig == pumpTypeGroupConfig) } + .toList(); + } + + return outList } } diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpRunningState.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpRunningState.kt new file mode 100755 index 0000000000..f9dcabbf98 --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpRunningState.kt @@ -0,0 +1,9 @@ +package info.nightscout.androidaps.plugins.pump.common.defs + +// TODO there are 3 classes now, that do similar things, sort of, need to define exact rules: PumpDeviceState, PumpDriverState, PumpStatusState + +enum class PumpRunningState(val status: String) { + + Running("normal"), + Suspended("suspended"); +} \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpTypeGroupConfig.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpTypeGroupConfig.kt new file mode 100644 index 0000000000..cc553c732f --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpTypeGroupConfig.kt @@ -0,0 +1,8 @@ +package info.nightscout.androidaps.plugins.pump.common.defs + +enum class PumpTypeGroupConfig { + All, + Medtronic, + OmnipodEros, + YpsoPump +} \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpUpdateFragmentType.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpUpdateFragmentType.kt new file mode 100755 index 0000000000..0558597127 --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpUpdateFragmentType.kt @@ -0,0 +1,49 @@ +package info.nightscout.androidaps.plugins.pump.common.defs + +import java.util.* + +enum class PumpUpdateFragmentType { + None, + PumpStatus, + DriverStatus, + Queue, + Bolus, + TBR, + ProfileChange, + TBRCount, + BolusCount, + TreatmentValues(Arrays.asList(Bolus, TBR, TBRCount, BolusCount, ProfileChange)), // Last Bolus, TBR, Profile Change, TBR Count, Bolus Count + Full, + Configuration, // Firmware, Errors + Battery, + Reservoir, + OtherValues(Arrays.asList(Battery, Reservoir)), // Battery, Reservoir + Custom_1, + Custom_2, + Custom_3, + Custom_4, + Custom_5, + Custom_6, + Custom_7, + Custom_8 + ; + + final var children: List? = null + + constructor() { + } + + constructor(children: List) { + this.children = children; + } + + fun isOptionIncluded(type: PumpUpdateFragmentType): Boolean { + if (this == type) + return true + else if (this.children != null && this.children!!.contains(type)) + return true; + + return false; + } + +} \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/PumpDriverConfiguration.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/PumpDriverConfiguration.kt new file mode 100644 index 0000000000..c5f28a4645 --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/PumpDriverConfiguration.kt @@ -0,0 +1,11 @@ +package info.nightscout.androidaps.plugins.pump.common.driver + +import info.nightscout.androidaps.plugins.pump.common.driver.history.PumpHistoryDataProvider + +interface PumpDriverConfiguration { + + fun getPumpBLESelector(): PumpBLESelector + + fun getPumpHistoryDataProvider(): PumpHistoryDataProvider + +} \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/PumpDriverConfigurationCapable.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/PumpDriverConfigurationCapable.kt new file mode 100644 index 0000000000..3c8e66fde3 --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/PumpDriverConfigurationCapable.kt @@ -0,0 +1,7 @@ +package info.nightscout.androidaps.plugins.pump.common.driver + +interface PumpDriverConfigurationCapable { + + fun getPumpDriverConfiguration(): PumpDriverConfiguration + +} \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/ble/PumpBLESelector.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/ble/PumpBLESelector.kt new file mode 100644 index 0000000000..530c127a4e --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/ble/PumpBLESelector.kt @@ -0,0 +1,105 @@ +package info.nightscout.androidaps.plugins.pump.common.driver + +import android.bluetooth.BluetoothDevice +import android.bluetooth.le.ScanFilter +import android.bluetooth.le.ScanSettings +import android.content.Context + +interface PumpBLESelector { + + /** + * Called on resume + */ + fun onResume() + + /** + * Called on destory + */ + fun onDestroy() + + /** + * This method is called when device is being removed (it can be empty if you don't need to do any special action, but if you + * have to unbound (for example), then this is method where to call it. For unbounding removeBond is available + */ + fun removeDevice(device: BluetoothDevice) + + /** + * Cleanup method after device was removed + */ + fun cleanupAfterDeviceRemoved() + + /** + * operations when scan failed + */ + fun onScanFailed(context: Context, errorCode: Int) + + /** + * operations when scan starts + */ + fun onStartLeDeviceScan(context: Context) + + /** + * operations when scan stops + */ + fun onStopLeDeviceScan(context: Context) + + /** + * operations when scan was stopped manualy (press on button) + */ + fun onManualStopLeDeviceScan(context: Context) + + /** + * operations when on non manual stop of scan (on timeout) + */ + fun onNonManualStopLeDeviceScan(context: Context) + + /** + * get Scan Filters + */ + fun getScanFilters(): List? + + /** + * get Scan Settings + */ + fun getScanSettings(): ScanSettings? + + /** + * filter device on search (for cases where we can't do it with Scan Filters + */ + fun filterDevice(device: BluetoothDevice): BluetoothDevice? + + /** + * operations when device selected + */ + fun onDeviceSelected(bluetoothDevice: BluetoothDevice, bleAddress: String, deviceName: String) + + /** + * If pump has no name, this name will be used + */ + fun getUnknownPumpName(): String + + /** + * get Address of Currently selected pump, empty string if none + */ + fun currentlySelectedPumpAddress(): String + + /** + * get Name of Currently selected pump, getUnknownPumpName() string if none + */ + fun currentlySelectedPumpName(): String + + /** + * Get Translation Text + */ + fun getText(key: PumpBLESelectorText): String + +} + +enum class PumpBLESelectorText { + SCAN_TITLE, + SELECTED_PUMP_TITLE, + REMOVE_TITLE, + REMOVE_TEXT, + NO_SELECTED_PUMP, + PUMP_CONFIGURATION +} diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/ble/PumpBLESelectorAbstract.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/ble/PumpBLESelectorAbstract.kt new file mode 100644 index 0000000000..872645fa30 --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/ble/PumpBLESelectorAbstract.kt @@ -0,0 +1,108 @@ +package info.nightscout.androidaps.plugins.pump.common.driver.ble + +import android.bluetooth.BluetoothDevice +import android.bluetooth.le.ScanFilter +import android.bluetooth.le.ScanSettings +import android.content.Context +import android.widget.Toast +import info.nightscout.androidaps.plugins.bus.RxBus +import info.nightscout.androidaps.plugins.pump.common.R +import info.nightscout.androidaps.plugins.pump.common.driver.PumpBLESelector +import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.shared.logging.AAPSLogger +import info.nightscout.shared.logging.LTag +import info.nightscout.shared.sharedPreferences.SP + +abstract class PumpBLESelectorAbstract constructor( + var resourceHelper: ResourceHelper, + var aapsLogger: AAPSLogger, + var sp: SP, + var rxBus: RxBus, + var context: Context +) : PumpBLESelector { + + protected val TAG = LTag.PUMPBTCOMM + + override fun getScanSettings(): ScanSettings? { + return ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build() + } + + override fun getScanFilters(): MutableList? { + return null + } + + override fun filterDevice(device: BluetoothDevice): BluetoothDevice? { + return device + } + + override fun onResume() { + } + + override fun onDestroy() { + } + + override fun removeDevice(device: BluetoothDevice) { + } + + override fun cleanupAfterDeviceRemoved() { + } + + override fun onManualStopLeDeviceScan(context: Context) { + } + + override fun onNonManualStopLeDeviceScan(context: Context) { + } + + //fun onDeviceSelected(bluetoothDevice: BluetoothDevice, bleAddress: String, deviceName: String) + + override fun onScanFailed(context: Context, errorCode: Int) { + Toast.makeText( + context, resourceHelper.gs(R.string.ble_config_scan_error, errorCode), + Toast.LENGTH_LONG + ).show() + } + + override fun onStartLeDeviceScan(context: Context) { + Toast.makeText(context, R.string.ble_config_scan_scanning, Toast.LENGTH_SHORT).show() + } + + override fun onStopLeDeviceScan(context: Context) { + Toast.makeText(context, R.string.ble_config_scan_finished, Toast.LENGTH_SHORT).show() + } + + protected fun removeBond(bluetoothDevice: BluetoothDevice): Boolean { + return try { + val method = bluetoothDevice.javaClass.getMethod("removeBond") + val resultObject = method.invoke(bluetoothDevice) + if (resultObject == null) { + aapsLogger.error(TAG, "ERROR: result object is null") + false + } else { + val result = resultObject as Boolean + if (result) { + aapsLogger.info(TAG, "Successfully removed bond") + } else { + aapsLogger.warn(TAG, "Bond was not removed") + } + result + } + } catch (e: Exception) { + aapsLogger.error(TAG, "ERROR: could not remove bond") + e.printStackTrace() + false + } + } + + protected fun getBondingStatusDescription(state: Int): String { + return if (state == 10) { + "BOND_NONE" + } else if (state == 11) { + "BOND_BONDING" + } else if (state == 12) { + "BOND_BONDED" + } else { + "UNKNOWN BOND STATUS ($state)" + } + } + +} \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpDataConverter.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpDataConverter.kt new file mode 100644 index 0000000000..0c8c8d1b25 --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpDataConverter.kt @@ -0,0 +1,4 @@ +package info.nightscout.androidaps.plugins.pump.common.driver.history + +interface PumpDataConverter { +} \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpHistoryDataProvider.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpHistoryDataProvider.kt new file mode 100644 index 0000000000..6f2389338e --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpHistoryDataProvider.kt @@ -0,0 +1,75 @@ +package info.nightscout.androidaps.plugins.pump.common.driver.history + +import androidx.annotation.StringRes +import info.nightscout.androidaps.plugins.pump.common.R +import info.nightscout.androidaps.plugins.pump.common.defs.PumpHistoryEntryGroup + +interface PumpHistoryDataProvider { + + /** + * Get Data, specified with PumpHistoryPeriod + */ + fun getData(period: PumpHistoryPeriod): List + + /** + * Get Initial Period + */ + fun getInitialPeriod(): PumpHistoryPeriod + + /** + * Get InitialData + */ + fun getInitialData(): List + + /** + * Get Allowed Pump History Groups (for specific pump) + */ + fun getAllowedPumpHistoryGroups(): List + + /** + * Get Spinner Width in pixels (same as specifying 150dp) + */ + fun getSpinnerWidthInPixels(): Int + + /** + * Get Translation Text + */ + fun getText(key: PumpHistoryText): String + + /** + * For filtering of items + */ + fun isItemInSelection(itemGroup: PumpHistoryEntryGroup, targetGroup: PumpHistoryEntryGroup): Boolean + +} + +enum class PumpHistoryPeriod constructor( + @StringRes var stringId: Int, + var isHours: Boolean = false +) { + + TODAY(R.string.time_today), + LAST_HOUR(R.string.time_last_hour, true), + LAST_3_HOURS(R.string.time_last_3_hours, true), + LAST_6_HOURS(R.string.time_last_6_hours, true), + LAST_12_HOURS(R.string.time_last_12_hours, true), + LAST_2_DAYS(R.string.time_last_2_days), + LAST_4_DAYS(R.string.time_last_4_days), + LAST_WEEK(R.string.time_last_week), + LAST_MONTH(R.string.time_last_month), + ALL(R.string.history_group_all) + +} + +enum class PumpHistoryText { + + PUMP_HISTORY, + + // OLD ONES + SCAN_TITLE, + SELECTED_PUMP_TITLE, + REMOVE_TITLE, + REMOVE_TEXT, + NO_SELECTED_PUMP, + PUMP_CONFIGURATION +} diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpHistoryDataProviderAbstract.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpHistoryDataProviderAbstract.kt new file mode 100644 index 0000000000..53dbbc0aba --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpHistoryDataProviderAbstract.kt @@ -0,0 +1,46 @@ +package info.nightscout.androidaps.plugins.pump.common.driver.history + +import info.nightscout.androidaps.plugins.pump.common.defs.PumpHistoryEntryGroup +import java.util.* + +abstract class PumpHistoryDataProviderAbstract : PumpHistoryDataProvider { + + override fun getInitialData(): List { + return getData(getInitialPeriod()); + } + + override fun getSpinnerWidthInPixels(): Int { + return 150 + } + + protected fun getStartingTimeForData(period: PumpHistoryPeriod): Long { + val gregorianCalendar = GregorianCalendar() + + if (!period.isHours) { + gregorianCalendar.set(Calendar.HOUR_OF_DAY, 0) + gregorianCalendar.set(Calendar.MINUTE, 0) + gregorianCalendar.set(Calendar.SECOND, 0) + gregorianCalendar.set(Calendar.MILLISECOND, 0) + } + + when (period) { + PumpHistoryPeriod.TODAY -> return gregorianCalendar.timeInMillis + PumpHistoryPeriod.ALL -> return 0L + PumpHistoryPeriod.LAST_2_DAYS -> gregorianCalendar.add(Calendar.DAY_OF_MONTH, -1) + PumpHistoryPeriod.LAST_4_DAYS -> gregorianCalendar.add(Calendar.DAY_OF_MONTH, -3) + PumpHistoryPeriod.LAST_WEEK -> gregorianCalendar.add(Calendar.WEEK_OF_YEAR, -1) + PumpHistoryPeriod.LAST_MONTH -> gregorianCalendar.add(Calendar.MONTH, -1) + PumpHistoryPeriod.LAST_HOUR -> gregorianCalendar.add(Calendar.HOUR_OF_DAY, -1) + PumpHistoryPeriod.LAST_3_HOURS -> gregorianCalendar.add(Calendar.HOUR_OF_DAY, -3) + PumpHistoryPeriod.LAST_6_HOURS -> gregorianCalendar.add(Calendar.HOUR_OF_DAY, -6) + PumpHistoryPeriod.LAST_12_HOURS -> gregorianCalendar.add(Calendar.HOUR_OF_DAY, -12) + } + + return gregorianCalendar.timeInMillis + } + + override fun isItemInSelection(itemGroup: PumpHistoryEntryGroup, targetGroup: PumpHistoryEntryGroup): Boolean { + return itemGroup === targetGroup + } + +} \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpHistoryEntry.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpHistoryEntry.kt new file mode 100644 index 0000000000..02e4e91b4c --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/driver/history/PumpHistoryEntry.kt @@ -0,0 +1,18 @@ +package info.nightscout.androidaps.plugins.pump.common.driver.history + +import info.nightscout.androidaps.plugins.pump.common.defs.PumpHistoryEntryGroup +import info.nightscout.androidaps.interfaces.ResourceHelper + +interface PumpHistoryEntry { + + fun prepareEntryData(resourceHelper: ResourceHelper, pumpDataConverter: PumpDataConverter) + + fun getEntryDateTime(): String + + fun getEntryType(): String + + fun getEntryValue(): String + + fun getEntryTypeGroup(): PumpHistoryEntryGroup + +} \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventBondChanged.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventBondChanged.kt new file mode 100644 index 0000000000..8e2c8b978c --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventBondChanged.kt @@ -0,0 +1,8 @@ +package info.nightscout.androidaps.plugins.pump.common.events + +import info.nightscout.androidaps.events.Event + +class EventBondChanged( + var connectionAddress: String, + var bondStatus: Boolean +) : Event() diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventPumpChanged.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventPumpChanged.kt new file mode 100755 index 0000000000..36b1107882 --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventPumpChanged.kt @@ -0,0 +1,8 @@ +package info.nightscout.androidaps.plugins.pump.common.events + +import info.nightscout.androidaps.events.Event + +class EventPumpChanged(var serialNumber: String, + var connectionAddress: String, + var parameters: MutableMap? = null) : Event() { +} \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventPumpConnectionParametersChanged.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventPumpConnectionParametersChanged.kt new file mode 100644 index 0000000000..d6c5b1563a --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventPumpConnectionParametersChanged.kt @@ -0,0 +1,6 @@ +package info.nightscout.androidaps.plugins.pump.common.events + +import info.nightscout.androidaps.events.Event + +class EventPumpConnectionParametersChanged : Event() { +} \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventPumpFragmentValuesChanged.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventPumpFragmentValuesChanged.kt new file mode 100755 index 0000000000..fcb55dcd11 --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventPumpFragmentValuesChanged.kt @@ -0,0 +1,14 @@ +package info.nightscout.androidaps.plugins.pump.common.events + +import info.nightscout.androidaps.events.Event +import info.nightscout.androidaps.plugins.pump.common.defs.PumpUpdateFragmentType + +class EventPumpFragmentValuesChanged : Event { + + var updateType: PumpUpdateFragmentType = PumpUpdateFragmentType.None + + constructor(updateType: PumpUpdateFragmentType) { + this.updateType = updateType + } + +} \ No newline at end of file diff --git a/rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventRefreshButtonState.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventRefreshButtonState.kt old mode 100644 new mode 100755 similarity index 100% rename from rileylink/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventRefreshButtonState.kt rename to pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/events/EventRefreshButtonState.kt diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/ui/PumpBLEConfigActivity.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/ui/PumpBLEConfigActivity.kt new file mode 100755 index 0000000000..6333af2cc2 --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/ui/PumpBLEConfigActivity.kt @@ -0,0 +1,338 @@ +package info.nightscout.androidaps.plugins.pump.common.ui + +import android.annotation.SuppressLint +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.bluetooth.BluetoothManager +import android.bluetooth.le.BluetoothLeScanner +import android.bluetooth.le.ScanCallback +import android.bluetooth.le.ScanFilter +import android.bluetooth.le.ScanResult +import android.bluetooth.le.ScanSettings +import android.content.Context +import android.os.Bundle +import android.os.Handler +import android.os.HandlerThread +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.AdapterView.OnItemClickListener +import android.widget.BaseAdapter +import android.widget.TextView +import dagger.android.support.DaggerAppCompatActivity +import info.nightscout.androidaps.interfaces.ActivePlugin +import info.nightscout.androidaps.plugins.bus.RxBus +import info.nightscout.androidaps.plugins.pump.common.R +import info.nightscout.androidaps.plugins.pump.common.ble.BlePreCheck +import info.nightscout.androidaps.plugins.pump.common.databinding.PumpBleConfigActivityBinding +import info.nightscout.androidaps.plugins.pump.common.driver.PumpBLESelector +import info.nightscout.androidaps.plugins.pump.common.driver.PumpBLESelectorText +import info.nightscout.androidaps.plugins.pump.common.driver.PumpDriverConfigurationCapable +import info.nightscout.androidaps.utils.alertDialogs.OKDialog +import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.shared.logging.AAPSLogger +import info.nightscout.shared.logging.LTag +import info.nightscout.shared.sharedPreferences.SP +import org.apache.commons.lang3.StringUtils +import javax.inject.Inject + +@SuppressLint("MissingPermission") +class PumpBLEConfigActivity : DaggerAppCompatActivity() { + + @Inject lateinit var resourceHelper: ResourceHelper + @Inject lateinit var activePlugin: ActivePlugin + @Inject lateinit var sp: SP + @Inject lateinit var blePreCheck: BlePreCheck + @Inject lateinit var context: Context + @Inject lateinit var aapsLogger: AAPSLogger + @Inject lateinit var rxBus: RxBus + + private lateinit var binding: PumpBleConfigActivityBinding + private lateinit var bleSelector: PumpBLESelector + + private var settings: ScanSettings? = null + private var filters: List? = null + private var bleScanner: BluetoothLeScanner? = null + private var deviceListAdapter = LeDeviceListAdapter() + private val handler = Handler(HandlerThread(this::class.simpleName + "Handler").also { it.start() }.looper) + private val bluetoothAdapter: BluetoothAdapter? get() = (context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager?)?.adapter + var scanning = false + private val devicesMap: MutableMap = HashMap() + + private val stopScanAfterTimeoutRunnable = Runnable { + if (scanning) { + stopLeDeviceScan(false) + } + } + + @SuppressLint("MissingPermission") + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = PumpBleConfigActivityBinding.inflate(layoutInflater) + setContentView(binding.root) + + if (!blePreCheck.prerequisitesCheck(this)) { + aapsLogger.error(TAG, "prerequisitesCheck failed.") + finish() + return + } + + // Configuration + val activePump = activePlugin.activePump + + if (activePump is PumpDriverConfigurationCapable) { + bleSelector = activePump.getPumpDriverConfiguration().getPumpBLESelector() + } else { + throw RuntimeException("PumpBLEConfigActivity can be used only with PumpDriverConfigurationCapable pump driver.") + } + + binding.pumpBleConfigCurrentlySelectedText.text = bleSelector.getText(PumpBLESelectorText.SELECTED_PUMP_TITLE) + binding.pumpBleConfigScanTitle.text = bleSelector.getText(PumpBLESelectorText.SCAN_TITLE) + + title = bleSelector.getText(PumpBLESelectorText.PUMP_CONFIGURATION) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + supportActionBar?.setDisplayShowHomeEnabled(true) + + binding.pumpBleConfigScanDeviceList.adapter = deviceListAdapter + binding.pumpBleConfigScanDeviceList.onItemClickListener = OnItemClickListener { _: AdapterView<*>?, view: View, _: Int, _: Long -> + // stop scanning if still active + if (scanning) { + stopLeDeviceScan(true) + } + val bleAddress = (view.findViewById(R.id.pump_ble_config_scan_item_device_address) as TextView).text.toString() + val deviceName = (view.findViewById(R.id.pump_ble_config_scan_item_device_name) as TextView).text.toString() + + if (devicesMap.containsKey(bleAddress)) { + aapsLogger.debug(TAG, "Device FOUND in deviceMap: $bleAddress") + val bluetoothDevice = devicesMap[bleAddress] + bleSelector.onDeviceSelected(bluetoothDevice!!, bleAddress, deviceName) + } else { + aapsLogger.debug(TAG, "Device NOT found in deviceMap: $bleAddress") + } + + finish() + } + binding.pumpBleConfigScanStart.setOnClickListener { startLeDeviceScan() } + binding.pumpBleConfigButtonScanStop.setOnClickListener { + if (scanning) { + stopLeDeviceScan(true) + } + } + + binding.pumpBleConfigButtonRemove.setOnClickListener { + OKDialog.showConfirmation( + this@PumpBLEConfigActivity, + bleSelector.getText(PumpBLESelectorText.REMOVE_TITLE), + bleSelector.getText(PumpBLESelectorText.REMOVE_TEXT), + Runnable { + val deviceAddress: String = binding.pumpBleConfigCurrentlySelectedPumpAddress.text.toString() + aapsLogger.debug(TAG, "Removing device as selected: $deviceAddress") + if (devicesMap.containsKey(deviceAddress)) { + val bluetoothDevice = devicesMap[deviceAddress] + aapsLogger.debug(TAG, "Device can be detected near, so trying to remove bond if possible.") + bleSelector.removeDevice(bluetoothDevice!!) + } else { + val remoteDevice = bluetoothAdapter!!.getRemoteDevice(deviceAddress) + if (remoteDevice != null) { + bleSelector.removeDevice(remoteDevice) + } + } + bleSelector.cleanupAfterDeviceRemoved() + updateCurrentlySelectedBTDevice() + }) + } + } + + private fun updateCurrentlySelectedBTDevice() { + val address = bleSelector.currentlySelectedPumpAddress() + if (StringUtils.isEmpty(address)) { + binding.pumpBleConfigCurrentlySelectedPumpName.text = bleSelector.getText(PumpBLESelectorText.NO_SELECTED_PUMP) + binding.pumpBleConfigCurrentlySelectedPumpAddress.visibility = View.GONE + binding.pumpBleConfigButtonRemove.visibility = View.GONE + } else { + binding.pumpBleConfigCurrentlySelectedPumpAddress.visibility = View.VISIBLE + binding.pumpBleConfigButtonRemove.visibility = View.VISIBLE + binding.pumpBleConfigCurrentlySelectedPumpName.text = bleSelector.currentlySelectedPumpName() + binding.pumpBleConfigCurrentlySelectedPumpAddress.text = address + } + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean = + when (item.itemId) { + android.R.id.home -> { + finish() + true + } + + else -> false + } + + override fun onResume() { + super.onResume() + bleSelector.onResume() + prepareForScanning() + updateCurrentlySelectedBTDevice() + } + + override fun onDestroy() { + super.onDestroy() + if (scanning) { + stopLeDeviceScan(false) + } + bleSelector.onDestroy() + } + + private fun prepareForScanning() { + bleScanner = bluetoothAdapter!!.bluetoothLeScanner + settings = bleSelector.getScanSettings() + filters = bleSelector.getScanFilters() + } + + private val bleScanCallback: ScanCallback = object : ScanCallback() { + + override fun onScanResult(callbackType: Int, scanRecord: ScanResult) { + aapsLogger.debug(TAG, scanRecord.toString()) + runOnUiThread { if (addDevice(scanRecord)) deviceListAdapter.notifyDataSetChanged() } + } + + override fun onBatchScanResults(results: List) { + runOnUiThread { + var added = false + for (result in results) { + aapsLogger.debug(TAG, "SCAN: " + result.advertisingSid + " name=" + result.device.address) + if (addDevice(result)) added = true + } + if (added) + deviceListAdapter.notifyDataSetChanged() + } + } + + private fun addDevice(result: ScanResult): Boolean { + var device = result.device + + device = bleSelector.filterDevice(device) + + if (device == null) { + return false + } + + deviceListAdapter.addDevice(result) + if (!devicesMap.containsKey(device.address)) { + devicesMap[device.address] = device + } + return true + } + + override fun onScanFailed(errorCode: Int) { + aapsLogger.error(TAG, "Scan Failed - Error Code: $errorCode") + bleSelector.onScanFailed(this@PumpBLEConfigActivity, errorCode) + } + } + + private fun startLeDeviceScan() { + if (bleScanner == null) { + aapsLogger.error(LTag.PUMPBTCOMM, "startLeDeviceScan failed: bleScanner is null") + return + } + deviceListAdapter.clear() + deviceListAdapter.notifyDataSetChanged() + handler.postDelayed(stopScanAfterTimeoutRunnable, SCAN_PERIOD_MILLIS) + runOnUiThread { + binding.pumpBleConfigScanStart.isEnabled = false + binding.pumpBleConfigButtonScanStop.visibility = View.VISIBLE + } + scanning = true + bleScanner!!.startScan(filters, settings, bleScanCallback) + aapsLogger.debug(LTag.PUMPBTCOMM, "startLeDeviceScan: Scanning Start") + bleSelector.onStartLeDeviceScan(this@PumpBLEConfigActivity) + } + + private fun stopLeDeviceScan(manualStop: Boolean) { + if (scanning) { + scanning = false + bleScanner!!.stopScan(bleScanCallback) + aapsLogger.debug(LTag.PUMPBTCOMM, "stopLeDeviceScan: Scanning Stop") + bleSelector.onStopLeDeviceScan(this@PumpBLEConfigActivity) + handler.removeCallbacks(stopScanAfterTimeoutRunnable) + } + if (manualStop) { + bleSelector.onManualStopLeDeviceScan(this@PumpBLEConfigActivity) + } else { + bleSelector.onNonManualStopLeDeviceScan(this@PumpBLEConfigActivity) + } + + runOnUiThread { + binding.pumpBleConfigScanStart.isEnabled = true + binding.pumpBleConfigButtonScanStop.visibility = View.GONE + } + } + + private inner class LeDeviceListAdapter : BaseAdapter() { + + private var devicesList: ArrayList = arrayListOf() + private var devicesMap: MutableMap = mutableMapOf() + + fun addDevice(result: ScanResult) { + if (!devicesList.contains(result.device)) { + devicesList.add(result.device) + } + devicesMap[result.device] = result.rssi + notifyDataSetChanged() + } + + fun clear() { + devicesList.clear() + devicesMap.clear() + notifyDataSetChanged() + } + + override fun getCount(): Int { + val c = devicesList.size + aapsLogger.info(TAG, "D: count=$c") + return c + } + + override fun getItem(i: Int): Any = devicesList[i] + override fun getItemId(i: Int): Long = i.toLong() + + override fun getView(i: Int, convertView: View?, viewGroup: ViewGroup?): View { + var v = convertView + val holder: ViewHolder + if (v == null) { + v = View.inflate(applicationContext, R.layout.pump_ble_config_scan_item, null) + holder = ViewHolder() + holder.deviceAddress = v.findViewById(R.id.pump_ble_config_scan_item_device_address) + holder.deviceName = v.findViewById(R.id.pump_ble_config_scan_item_device_name) + v.tag = holder + } else { + // reuse view if already exists + holder = v.tag as ViewHolder + } + + val device = devicesList[i] + var deviceName = device.name + if (StringUtils.isBlank(deviceName)) { + deviceName = bleSelector.getUnknownPumpName() + } + deviceName += " [" + devicesMap[device] + "]" + val currentlySelectedAddress = bleSelector.currentlySelectedPumpAddress() // TODO + if (currentlySelectedAddress == device.address) { + deviceName += " (" + resources.getString(R.string.ble_config_scan_selected) + ")" + } + holder.deviceName!!.text = deviceName + holder.deviceAddress!!.text = device.address + return v!! + } + } + + internal class ViewHolder { + var deviceName: TextView? = null + var deviceAddress: TextView? = null + } + + companion object { + private val TAG = LTag.PUMPBTCOMM + private const val SCAN_PERIOD_MILLIS: Long = 15000 + } +} \ No newline at end of file diff --git a/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/ui/PumpHistoryActivity.kt b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/ui/PumpHistoryActivity.kt new file mode 100755 index 0000000000..a29cf41094 --- /dev/null +++ b/pump-common/src/main/java/info/nightscout/androidaps/plugins/pump/common/ui/PumpHistoryActivity.kt @@ -0,0 +1,217 @@ +package info.nightscout.androidaps.plugins.pump.common.ui + +import android.content.Context +import android.os.Bundle +import android.os.SystemClock +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import dagger.android.support.DaggerAppCompatActivity +import info.nightscout.androidaps.interfaces.ActivePlugin +import info.nightscout.androidaps.plugins.pump.common.R +import info.nightscout.androidaps.plugins.pump.common.databinding.PumpHistoryActivityBinding +import info.nightscout.androidaps.plugins.pump.common.defs.PumpHistoryEntryGroup +import info.nightscout.androidaps.plugins.pump.common.driver.PumpDriverConfigurationCapable +import info.nightscout.androidaps.plugins.pump.common.driver.history.PumpHistoryDataProvider +import info.nightscout.androidaps.plugins.pump.common.driver.history.PumpHistoryEntry +import info.nightscout.androidaps.plugins.pump.common.driver.history.PumpHistoryText +import info.nightscout.androidaps.interfaces.ResourceHelper +import info.nightscout.shared.logging.AAPSLogger +import info.nightscout.shared.logging.LTag +import javax.inject.Inject + +class PumpHistoryActivity : DaggerAppCompatActivity() { + + @Inject lateinit var resourceHelper: ResourceHelper + @Inject lateinit var aapsLogger: AAPSLogger + @Inject lateinit var activePlugin: ActivePlugin + @Inject lateinit var context: Context + + var filteredHistoryList: MutableList = mutableListOf() + var typeListFull: List? = null + var fullList: MutableList = mutableListOf() + + private lateinit var historyDataProvider: PumpHistoryDataProvider + private lateinit var binding: PumpHistoryActivityBinding + + var manualChange = false + + lateinit var recyclerViewAdapter: RecyclerViewAdapter + + private fun prepareData() { + + val allData = historyDataProvider.getInitialData() + + aapsLogger.info(LTag.PUMP, "Loaded ${allData.size} items from database. [initialSize=${historyDataProvider.getInitialPeriod()}]") + + this.fullList.addAll(allData) + } + + private fun filterHistory(group: PumpHistoryEntryGroup) { + filteredHistoryList.clear() + + if (group === PumpHistoryEntryGroup.All) { + filteredHistoryList.addAll(fullList) + } else { + for (pumpHistoryEntry in fullList) { + if (historyDataProvider.isItemInSelection(pumpHistoryEntry.getEntryTypeGroup(), group)) { + filteredHistoryList.add(pumpHistoryEntry) + } + } + } + + aapsLogger.info(LTag.PUMP, "Filtered list ${filteredHistoryList.size} items (group ${group}), from full list (${fullList.size}).") + + recyclerViewAdapter.setHistoryListInternal(filteredHistoryList) + recyclerViewAdapter.notifyDataSetChanged() + + } + + override fun onResume() { + super.onResume() + //filterHistory(selectedGroup) + //setHistoryTypeSpinner() + //aapsLogger.info(LTag.PUMP, "onResume") + //binding.pumpHistoryRoot.requestLayout() + } + + private fun setHistoryTypeSpinner() { + manualChange = true + for (i in typeListFull!!.indices) { + if (typeListFull!![i].entryGroup === selectedGroup) { + binding.pumpHistoryType.setSelection(i) + break + } + } + SystemClock.sleep(200) + manualChange = false + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = PumpHistoryActivityBinding.inflate(layoutInflater) + setContentView(binding.root) + + // Configuration + val activePump = activePlugin.activePump + + if (activePump is PumpDriverConfigurationCapable) { + historyDataProvider = activePump.getPumpDriverConfiguration().getPumpHistoryDataProvider() + } else { + throw RuntimeException("PumpHistoryActivity can be used only with PumpDriverConfigurationCapable pump driver.") + } + + prepareData() + + binding.pumpHistoryRecyclerView.setHasFixedSize(true) + binding.pumpHistoryRecyclerView.layoutManager = LinearLayoutManager(this) + recyclerViewAdapter = RecyclerViewAdapter(filteredHistoryList) + binding.pumpHistoryRecyclerView.adapter = recyclerViewAdapter + binding.pumpHistoryStatus.visibility = View.GONE + typeListFull = getTypeList(historyDataProvider.getAllowedPumpHistoryGroups()) + val spinnerAdapter = ArrayAdapter(this, R.layout.spinner_centered, typeListFull!!) + + binding.pumpHistoryText.text = historyDataProvider.getText(PumpHistoryText.PUMP_HISTORY) + + binding.pumpHistoryType.adapter = spinnerAdapter + binding.pumpHistoryType.getLayoutParams().width = fromDpToSize(historyDataProvider.getSpinnerWidthInPixels()) + binding.pumpHistoryType.requestLayout(); + binding.pumpHistoryType.setOnItemSelectedListener(object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>?, view: View, position: Int, id: Long) { + if (manualChange) return + val selected = binding.pumpHistoryType.getSelectedItem() as TypeList + showingType = selected + selectedGroup = selected.entryGroup + filterHistory(selectedGroup) + val selectedText = parent!!.getChildAt(0) as TextView + selectedText.textSize = 15.0f // FIXME hack for selected item, also concerns pump_type marginTop + + binding.pumpHistoryTop.requestLayout() + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + if (manualChange) return + filterHistory(PumpHistoryEntryGroup.All) + } + }) + binding.pumpHistoryTypeText.requestLayout() + } + + private fun getTypeList(list: List?): List { + val typeList = ArrayList() + for (pumpHistoryEntryGroup in list!!) { + typeList.add(TypeList(pumpHistoryEntryGroup)) + } + return typeList + } + + fun fromDpToSize(dpSize: Int): Int { + val scale = context.resources.displayMetrics.density + val pixelsFl = ((dpSize * scale) + 0.5f) + return pixelsFl.toInt() + } + + class TypeList internal constructor(var entryGroup: PumpHistoryEntryGroup) { + + var name: String + override fun toString(): String { + return name + } + + init { + name = entryGroup.translated!! + } + } + + class RecyclerViewAdapter internal constructor( + var historyList: List + ) : RecyclerView.Adapter() { + + fun setHistoryListInternal(historyList: List) { + this.historyList = historyList + } + + override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): HistoryViewHolder { + val v = LayoutInflater.from(viewGroup.context).inflate( + R.layout.pump_history_item, // + viewGroup, false + ) + return HistoryViewHolder(v) + } + + override fun onBindViewHolder(holder: HistoryViewHolder, position: Int) { + val record = historyList[position] + holder.timeView.text = record.getEntryDateTime() + holder.typeView.text = record.getEntryType() + holder.valueView.text = record.getEntryValue() + } + + override fun getItemCount(): Int { + return historyList.size + } + + class HistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + + var timeView: TextView + var typeView: TextView + var valueView: TextView + + init { + timeView = itemView.findViewById(R.id.pump_history_time) + typeView = itemView.findViewById(R.id.pump_history_source) + valueView = itemView.findViewById(R.id.pump_history_description) + } + } + + } + + companion object { + var showingType: TypeList? = null + var selectedGroup = PumpHistoryEntryGroup.All + } +} \ No newline at end of file diff --git a/pump-common/src/main/res/layout/pump_ble_config_activity.xml b/pump-common/src/main/res/layout/pump_ble_config_activity.xml new file mode 100755 index 0000000000..b72fbd7e3f --- /dev/null +++ b/pump-common/src/main/res/layout/pump_ble_config_activity.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + +