thesis #5

Merged
jlobbes merged 8 commits from thesis into master 2023-09-01 11:45:44 +01:00
14 changed files with 1121 additions and 412 deletions
Showing only changes of commit e6f9e30363 - Show all commits

View File

@ -10,7 +10,7 @@ We use the following devices for vitals data measurement:
* Heart Rate, SPO2 * Heart Rate, SPO2
* [Withings Thermo](https://www.withings.com/de/en/thermo) * [Withings Thermo](https://www.withings.com/de/en/thermo)
* Body Surface Temperature * Body Surface Temperature
* [WIthings BPM Core](https://www.withings.com/de/en/bpm-core) * [Withings BPM Core](https://www.withings.com/de/en/bpm-core)
* Blood Pressure * Blood Pressure
## API Access ## API Access

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 632 KiB

View File

@ -0,0 +1 @@
<mxGraphModel><root><mxCell id="0"/><mxCell id="1" parent="0"/></root></mxGraphModel>

View File

@ -1 +1,210 @@
<mxfile host="Electron" modified="2023-08-02T11:28:29.093Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.7.4 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36" etag="zYpybP46Dq96U6SLnOQ4" version="20.7.4" type="device"><diagram id="f6zhRbDmt8kIpFGfOheX" name="Page-1">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</diagram></mxfile> <mxfile host="app.diagrams.net" modified="2023-08-20T22:49:49.811Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" etag="PkJOclFEVI5TEfIjMddY" version="21.6.8" type="device">
<diagram id="f6zhRbDmt8kIpFGfOheX" name="Page-1">
<mxGraphModel dx="1412" dy="742" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-14" value="medwings" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontStyle=1;container=0;" parent="1" vertex="1">
<mxGeometry x="134" y="250" width="570" height="330" as="geometry" />
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-12" value="" style="group" parent="1" vertex="1" connectable="0">
<mxGeometry x="94" y="620" width="280" height="250" as="geometry" />
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-1" value="authentication" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontStyle=1" parent="V-qh-Gk3nv3sh-DeGmF5-12" vertex="1">
<mxGeometry x="40" y="-10" width="240" height="250" as="geometry" />
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-2" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;text-decoration:underline;&quot;&gt;&lt;b&gt;User&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p style=&quot;margin:0px;margin-left:8px;&quot;&gt;&lt;u&gt;id&lt;i style=&quot;&quot;&gt;&amp;nbsp;: Integer&lt;/i&gt;&lt;br&gt;&lt;/u&gt;password&lt;i&gt;&amp;nbsp;: String&lt;/i&gt;&lt;br&gt;last_login&lt;i&gt;&amp;nbsp;: DateTime&lt;/i&gt;&lt;br&gt;is_superuser&lt;i&gt;&amp;nbsp;: Boolean&lt;/i&gt;&lt;br&gt;username&lt;i&gt;&amp;nbsp;: String&lt;/i&gt;&lt;br&gt;first_name&lt;i&gt;&amp;nbsp;: String&lt;/i&gt;&lt;br&gt;last_name : &lt;i&gt;String&lt;/i&gt;&lt;br&gt;email&lt;i&gt;&amp;nbsp;: String&lt;/i&gt;&lt;br&gt;is_staff&lt;i&gt;&amp;nbsp;: Boolean&lt;/i&gt;&lt;br&gt;is_active&lt;i&gt;&amp;nbsp;: Boolean&lt;/i&gt;&lt;br&gt;date_joined&lt;i&gt;&amp;nbsp;: DateTime&lt;/i&gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;" parent="V-qh-Gk3nv3sh-DeGmF5-12" vertex="1">
<mxGeometry x="69.99565217391304" y="20" width="194.7826086956522" height="200" as="geometry" />
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-26" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERzeroToMany;startArrow=ERmandOne;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=1.003;exitY=0.323;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="V-qh-Gk3nv3sh-DeGmF5-2" target="V-qh-Gk3nv3sh-DeGmF5-16" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="-96" y="590" as="sourcePoint" />
<mxPoint x="4" y="490" as="targetPoint" />
<Array as="points">
<mxPoint x="404" y="705" />
<mxPoint x="404" y="610" />
<mxPoint x="724" y="610" />
<mxPoint x="724" y="420" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-27" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERzeroToMany;startArrow=ERmandOne;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0.997;exitY=0.398;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="V-qh-Gk3nv3sh-DeGmF5-2" target="V-qh-Gk3nv3sh-DeGmF5-17" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="-86" y="600" as="sourcePoint" />
<mxPoint x="14" y="500" as="targetPoint" />
<Array as="points">
<mxPoint x="414" y="720" />
<mxPoint x="414" y="620" />
<mxPoint x="734" y="620" />
<mxPoint x="734" y="320" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-28" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERzeroToMany;startArrow=ERmandOne;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.25;exitDx=0;exitDy=0;" parent="1" source="V-qh-Gk3nv3sh-DeGmF5-2" target="V-qh-Gk3nv3sh-DeGmF5-19" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="-76" y="610" as="sourcePoint" />
<mxPoint x="24" y="510" as="targetPoint" />
<Array as="points">
<mxPoint x="394" y="690" />
<mxPoint x="394" y="600" />
<mxPoint x="714" y="600" />
<mxPoint x="714" y="520" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-29" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERzeroToMany;startArrow=ERmandOne;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=-0.002;exitY=0.33;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="V-qh-Gk3nv3sh-DeGmF5-2" target="V-qh-Gk3nv3sh-DeGmF5-20" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="-66" y="620" as="sourcePoint" />
<mxPoint x="34" y="520" as="targetPoint" />
<Array as="points">
<mxPoint x="114" y="706" />
<mxPoint x="114" y="420" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-30" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERmandOne;startArrow=ERmandOne;rounded=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endFill=0;" parent="1" source="V-qh-Gk3nv3sh-DeGmF5-2" target="V-qh-Gk3nv3sh-DeGmF5-15" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="-56" y="630" as="sourcePoint" />
<mxPoint x="134" y="530" as="targetPoint" />
<Array as="points">
<mxPoint x="213" y="610" />
<mxPoint x="213" y="600" />
<mxPoint x="226" y="600" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-32" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERzeroToMany;startArrow=ERmandOne;rounded=0;exitX=0;exitY=0.4;exitDx=0;exitDy=0;exitPerimeter=0;endFill=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="V-qh-Gk3nv3sh-DeGmF5-2" target="V-qh-Gk3nv3sh-DeGmF5-21" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="-66" y="620" as="sourcePoint" />
<mxPoint x="124" y="355" as="targetPoint" />
<Array as="points">
<mxPoint x="130" y="720" />
<mxPoint x="130" y="320" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="b34YlEaqVGowunhmw_iH-3" value="gotify" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontStyle=1" parent="1" vertex="1">
<mxGeometry x="134" y="880" width="276" height="110" as="geometry" />
</mxCell>
<mxCell id="b34YlEaqVGowunhmw_iH-5" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;text-decoration:underline;&quot;&gt;&lt;b&gt;GotifyApplication&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p style=&quot;margin:0px;margin-left:8px;&quot;&gt;id&lt;i&gt;&amp;nbsp;: Integer&lt;/i&gt;&lt;br&gt;token&lt;i&gt; : String&lt;/i&gt;&lt;br&gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;" parent="1" vertex="1">
<mxGeometry x="280" y="905" width="110" height="70" as="geometry" />
</mxCell>
<mxCell id="b34YlEaqVGowunhmw_iH-9" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;text-decoration:underline;&quot;&gt;&lt;b&gt;GotifyUser&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p style=&quot;margin:0px;margin-left:8px;&quot;&gt;id&lt;i&gt;&amp;nbsp;: Integer&lt;/i&gt;&lt;br&gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;" parent="1" vertex="1">
<mxGeometry x="167" y="915" width="74" height="50" as="geometry" />
</mxCell>
<mxCell id="b34YlEaqVGowunhmw_iH-10" value="" style="fontSize=12;html=1;endArrow=ERmandOne;startArrow=ERmandOne;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" parent="1" source="b34YlEaqVGowunhmw_iH-9" target="b34YlEaqVGowunhmw_iH-5" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="440.2782608695652" y="1735" as="sourcePoint" />
<mxPoint x="621" y="1690" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-4" value="withings" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontStyle=1" parent="1" vertex="1">
<mxGeometry x="424" y="640" width="310" height="230" as="geometry" />
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-5" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;text-decoration:underline;&quot;&gt;&lt;b&gt;ApiAccount&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p style=&quot;margin:0px;margin-left:8px;&quot;&gt;userid&lt;i&gt;&amp;nbsp;: Integer&lt;/i&gt;&lt;br&gt;last_update&lt;i&gt;&amp;nbsp;: DateTime&lt;/i&gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;" parent="1" vertex="1">
<mxGeometry x="520" y="787" width="140.5" height="63" as="geometry" />
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-6" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;text-decoration:underline;&quot;&gt;&lt;b&gt;RefreshToken&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p style=&quot;margin:0px;margin-left:8px;&quot;&gt;value&lt;i&gt;&amp;nbsp;: String&lt;/i&gt;&lt;br&gt;expires&lt;i&gt;&amp;nbsp;: DateTime&lt;/i&gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;" parent="1" vertex="1">
<mxGeometry x="457" y="680" width="120" height="70" as="geometry" />
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-7" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;text-decoration:underline;&quot;&gt;&lt;b&gt;AccessToken&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p style=&quot;margin:0px;margin-left:8px;&quot;&gt;value&lt;i&gt;&amp;nbsp;: String&lt;/i&gt;&lt;br&gt;expires&lt;i&gt;&amp;nbsp;: DateTime&lt;/i&gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;" parent="1" vertex="1">
<mxGeometry x="597" y="680" width="120" height="70" as="geometry" />
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-9" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERmandOne;startArrow=ERmandOne;rounded=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="V-qh-Gk3nv3sh-DeGmF5-6" target="V-qh-Gk3nv3sh-DeGmF5-5" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="387" y="740" as="sourcePoint" />
<mxPoint x="527" y="870" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-10" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERmandOne;startArrow=ERmandOne;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" parent="1" source="V-qh-Gk3nv3sh-DeGmF5-7" target="V-qh-Gk3nv3sh-DeGmF5-5" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="787" y="730" as="sourcePoint" />
<mxPoint x="767" y="770" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="b34YlEaqVGowunhmw_iH-11" value="" style="fontSize=12;html=1;endArrow=ERmandOne;startArrow=ERmandOne;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" parent="1" source="V-qh-Gk3nv3sh-DeGmF5-2" target="b34YlEaqVGowunhmw_iH-9" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="304" y="950" as="sourcePoint" />
<mxPoint x="360" y="950" as="targetPoint" />
<Array as="points">
<mxPoint x="261" y="870" />
<mxPoint x="204" y="870" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-8" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERmandOne;startArrow=ERmandOne;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;" parent="1" source="V-qh-Gk3nv3sh-DeGmF5-2" target="V-qh-Gk3nv3sh-DeGmF5-5" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="404" y="790" as="sourcePoint" />
<mxPoint x="524" y="330" as="targetPoint" />
<Array as="points">
<mxPoint x="404" y="790" />
<mxPoint x="404" y="819" />
<mxPoint x="520" y="819" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-15" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;text-decoration:underline;&quot;&gt;&lt;b&gt;Profile&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p style=&quot;margin:0px;margin-left:8px;&quot;&gt;sex&lt;i&gt;&amp;nbsp;: Enum&lt;/i&gt;&lt;br&gt;date_of_birth&lt;i&gt;&amp;nbsp;: Date&lt;/i&gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;container=0;" parent="1" vertex="1">
<mxGeometry x="163.99" y="480" width="124.21" height="80" as="geometry" />
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-16" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;text-decoration:underline;&quot;&gt;&lt;b&gt;HeartRateRecord&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p style=&quot;margin:0px;margin-left:8px;&quot;&gt;&lt;u&gt;id&lt;i&gt;&amp;nbsp;: Integer&lt;/i&gt;&lt;/u&gt;&lt;br&gt;recorded&lt;i&gt;&amp;nbsp;: DateTime&lt;/i&gt;&lt;br&gt;value_bpm&lt;i&gt; : Integer&lt;/i&gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;container=0;" parent="1" vertex="1">
<mxGeometry x="544.36" y="370" width="134.56" height="100" as="geometry" />
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-17" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;text-decoration:underline;&quot;&gt;&lt;b&gt;BodyTempRecord&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p style=&quot;margin:0px;margin-left:8px;&quot;&gt;&lt;u&gt;id&lt;i&gt;&amp;nbsp;: Integer&lt;/i&gt;&lt;/u&gt;&lt;br&gt;recorded&lt;i&gt;&amp;nbsp;: DateTime&lt;/i&gt;&lt;br&gt;value_celcius&lt;i&gt; : Decimal&lt;/i&gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;container=0;" parent="1" vertex="1">
<mxGeometry x="534.01" y="280" width="144.91" height="80" as="geometry" />
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-19" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;text-decoration:underline;&quot;&gt;&lt;b&gt;Spo2LevelRecord&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p style=&quot;margin:0px;margin-left:8px;&quot;&gt;&lt;u&gt;id&lt;i&gt; : Integer&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:8px;&quot;&gt;recorded&lt;i&gt;&amp;nbsp;: DateTime&lt;/i&gt;&lt;br&gt;value_percent&lt;i&gt; : Integer&lt;/i&gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;container=0;" parent="1" vertex="1">
<mxGeometry x="534" y="480" width="144.91" height="80" as="geometry" />
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-20" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;text-decoration:underline;&quot;&gt;&lt;b&gt;BloodPressureRecord&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p style=&quot;margin:0px;margin-left:8px;&quot;&gt;&lt;u&gt;id&lt;i&gt;&amp;nbsp;: Integer&lt;/i&gt;&lt;/u&gt;&lt;br&gt;recorded&lt;i&gt;&amp;nbsp;: DateTime&lt;/i&gt;&lt;br&gt;value_systolic_mmhg&lt;i&gt;&amp;nbsp;: Integer&lt;/i&gt;&lt;br&gt;value_diastolic_mmhg&lt;i&gt; : Integer&lt;br&gt;&lt;/i&gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;container=0;" parent="1" vertex="1">
<mxGeometry x="163.98999999999998" y="370" width="186.32" height="100" as="geometry" />
</mxCell>
<mxCell id="V-qh-Gk3nv3sh-DeGmF5-21" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;text-decoration:underline;&quot;&gt;&lt;b&gt;RespirationScoreRecord&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p style=&quot;margin:0px;margin-left:8px;&quot;&gt;&lt;u&gt;id&lt;i&gt;&amp;nbsp;: Integer&lt;/i&gt;&lt;/u&gt;&lt;br&gt;recorded&lt;i&gt;&amp;nbsp;: DateTime&lt;/i&gt;&lt;br&gt;value_severity&lt;i&gt;&amp;nbsp;: Enum&lt;/i&gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;container=0;" parent="1" vertex="1">
<mxGeometry x="164" y="280" width="155.26" height="80" as="geometry" />
</mxCell>
<mxCell id="b34YlEaqVGowunhmw_iH-14" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;text-decoration:underline;&quot;&gt;&lt;b&gt;MewsRecord&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p style=&quot;margin:0px;margin-left:8px;&quot;&gt;&lt;u&gt;id&lt;i&gt;&amp;nbsp;: Integer&lt;/i&gt;&lt;/u&gt;&lt;br&gt;recorded&lt;i&gt;&amp;nbsp;: DateTime&lt;/i&gt;&lt;br&gt;value_n&lt;i&gt;&amp;nbsp;: Integer&lt;/i&gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;container=0;" parent="1" vertex="1">
<mxGeometry x="358.78" y="480" width="134.56" height="80" as="geometry" />
</mxCell>
<mxCell id="b34YlEaqVGowunhmw_iH-16" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERzeroToMany;startArrow=ERmandOne;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;endFill=0;" parent="1" source="V-qh-Gk3nv3sh-DeGmF5-2" target="b34YlEaqVGowunhmw_iH-14" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="334" y="630" as="sourcePoint" />
<mxPoint x="434" y="530" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="b34YlEaqVGowunhmw_iH-17" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERmandOne;startArrow=ERzeroToOne;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0.472;exitY=-0.004;exitDx=0;exitDy=0;exitPerimeter=0;startFill=0;" parent="1" source="b34YlEaqVGowunhmw_iH-14" target="V-qh-Gk3nv3sh-DeGmF5-21" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="387.0326086956521" y="455" as="sourcePoint" />
<mxPoint x="440.95" y="330" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="b34YlEaqVGowunhmw_iH-18" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERmandOne;startArrow=ERzeroToOne;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0.383;exitY=-0.007;exitDx=0;exitDy=0;exitPerimeter=0;startFill=0;" parent="1" source="b34YlEaqVGowunhmw_iH-14" target="V-qh-Gk3nv3sh-DeGmF5-20" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="437.51298245614055" y="499.71999999999997" as="sourcePoint" />
<mxPoint x="329.2521052631579" y="365" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="b34YlEaqVGowunhmw_iH-19" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERmandOne;startArrow=ERzeroToOne;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0.565;exitY=-0.006;exitDx=0;exitDy=0;exitPerimeter=0;startFill=0;" parent="1" source="b34YlEaqVGowunhmw_iH-14" target="V-qh-Gk3nv3sh-DeGmF5-17" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="425.53701754385975" y="499.51" as="sourcePoint" />
<mxPoint x="360.3084210526315" y="450" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="b34YlEaqVGowunhmw_iH-20" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERmandOne;startArrow=ERzeroToOne;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0.655;exitY=-0.007;exitDx=0;exitDy=0;exitPerimeter=0;startFill=0;" parent="1" source="b34YlEaqVGowunhmw_iH-14" target="V-qh-Gk3nv3sh-DeGmF5-16" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="450.0271929824563" y="499.5799999999999" as="sourcePoint" />
<mxPoint x="544.0045614035089" y="364.99999999999994" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="b34YlEaqVGowunhmw_iH-21" value="" style="edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=ERmandOne;startArrow=ERzeroToOne;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;startFill=0;" parent="1" source="b34YlEaqVGowunhmw_iH-14" target="V-qh-Gk3nv3sh-DeGmF5-19" edge="1">
<mxGeometry width="100" height="100" relative="1" as="geometry">
<mxPoint x="462.13771929824577" y="499.51" as="sourcePoint" />
<mxPoint x="554.3600000000001" y="445" as="targetPoint" />
<Array as="points">
<mxPoint x="530" y="520" />
<mxPoint x="530" y="520" />
</Array>
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<title>browser</title>
<desc>Created with Sketch Beta.</desc>
<defs>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="Icon-Set" sketch:type="MSLayerGroup" transform="translate(-256.000000, -671.000000)" fill="#000000">
<path d="M265,675 C264.448,675 264,675.448 264,676 C264,676.553 264.448,677 265,677 C265.552,677 266,676.553 266,676 C266,675.448 265.552,675 265,675 L265,675 Z M269,675 C268.448,675 268,675.448 268,676 C268,676.553 268.448,677 269,677 C269.552,677 270,676.553 270,676 C270,675.448 269.552,675 269,675 L269,675 Z M286,679 L258,679 L258,675 C258,673.896 258.896,673 260,673 L284,673 C285.104,673 286,673.896 286,675 L286,679 L286,679 Z M286,699 C286,700.104 285.104,701 284,701 L260,701 C258.896,701 258,700.104 258,699 L258,681 L286,681 L286,699 L286,699 Z M284,671 L260,671 C257.791,671 256,672.791 256,675 L256,699 C256,701.209 257.791,703 260,703 L284,703 C286.209,703 288,701.209 288,699 L288,675 C288,672.791 286.209,671 284,671 L284,671 Z M261,675 C260.448,675 260,675.448 260,676 C260,676.553 260.448,677 261,677 C261.552,677 262,676.553 262,676 C262,675.448 261.552,675 261,675 L261,675 Z" id="browser" sketch:type="MSShapeGroup">
</path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd" transform="translate(2 4)">
<path d="m.5 10.5v-2c0-1.1045695.8954305-2 2-2h12c1.1045695 0 2 .8954305 2 2v2c0 1.1045695-.8954305 2-2 2h-12c-1.1045695 0-2-.8954305-2-2z" stroke="#000000" stroke-linecap="round" stroke-linejoin="round"/>
<path d="m4.5 9.5c0-.55228475-.44771525-1-1-1s-1 .44771525-1 1c0 .5522847.44771525 1 1 1s1-.4477153 1-1z" fill="#000000"/>
<path d="m.5 4.49375668.00936503-2c.00344048-1.10212675.89785814-1.99375668 1.99999025-1.99375668h11.99057232c1.0543617 0 1.9181651.81587779 1.9945142 1.85073766l.005476.15550566-.009365 2c-.0034405 1.10212675-.8978582 1.99375668-1.9999903 1.99375668h-11.9905625c-1.05437154 0-1.91817487-.81587779-1.99452401-1.85073766z" stroke="#000000" stroke-linecap="round" stroke-linejoin="round"/>
<path d="m4.5 3.5c0-.55228475-.44771525-1-1-1s-1 .44771525-1 1 .44771525 1 1 1 1-.44771525 1-1z" fill="#000000"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,34 @@
<?xml version="1.0" ?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 281.25 281.25" id="svg2" version="1.1" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg">
<defs id="defs4"/>
<g id="layer1" transform="translate(7276.1064,-3697.2496)">
<g id="g23642" style="fill:#3d3d3d;fill-opacity:1">
<path d="m -7211.4766,3736.0898 c -14.2755,10e-5 -25.9492,11.6738 -25.9492,25.9493 0,14.2755 11.6737,25.9491 25.9492,25.9492 14.2756,0 25.9493,-11.6737 25.9493,-25.9492 0,-14.2756 -11.6737,-25.9493 -25.9493,-25.9493 z m 0,9.375 c 9.209,0 16.5743,7.3653 16.5743,16.5743 0,9.2089 -7.3653,16.5742 -16.5743,16.5742 -9.2088,0 -16.5742,-7.3654 -16.5742,-16.5742 0,-9.2089 7.3654,-16.5742 16.5742,-16.5743 z" id="path3266" style="color:#000000;fill:#3d3d3d;fill-opacity:1;fill-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none"/>
<path d="m -7167.4922,3743.8574 a 4.6875,4.6875 0 0 0 -4.6875,4.6875 4.6875,4.6875 0 0 0 4.6875,4.6875 h 129.2676 a 4.6875,4.6875 0 0 0 4.6875,-4.6875 4.6875,4.6875 0 0 0 -4.6875,-4.6875 z" id="path3268" style="color:#000000;fill:#3d3d3d;fill-opacity:1;fill-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none"/>
<path d="m -7167.4922,3770.8477 a 4.6875,4.6875 0 0 0 -4.6875,4.6875 4.6875,4.6875 0 0 0 4.6875,4.6875 h 53.5059 a 4.6875,4.6875 0 0 0 4.6875,-4.6875 4.6875,4.6875 0 0 0 -4.6875,-4.6875 z" id="path3270" style="color:#000000;fill:#3d3d3d;fill-opacity:1;fill-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none"/>
<path d="m -7211.4766,3811.9258 c -14.2755,0 -25.9492,11.6737 -25.9492,25.9492 0,14.2755 11.6737,25.9472 25.9492,25.9473 14.2756,0 25.9493,-11.6718 25.9493,-25.9473 0,-14.2755 -11.6737,-25.9492 -25.9493,-25.9492 z m 0,9.375 c 9.209,0 16.5743,7.3653 16.5743,16.5742 0,9.2089 -7.3653,16.5723 -16.5743,16.5723 -9.2088,-10e-5 -16.5742,-7.3634 -16.5742,-16.5723 0,-9.2089 7.3654,-16.5742 16.5742,-16.5742 z" id="circle3282" style="color:#000000;fill:#3d3d3d;fill-opacity:1;fill-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none"/>
<path d="m -7167.4922,3819.6914 a 4.6875,4.6875 0 0 0 -4.6875,4.6875 4.6875,4.6875 0 0 0 4.6875,4.6875 h 129.2676 a 4.6875,4.6875 0 0 0 4.6875,-4.6875 4.6875,4.6875 0 0 0 -4.6875,-4.6875 z" id="path3284" style="color:#000000;fill:#3d3d3d;fill-opacity:1;fill-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none"/>
<path d="m -7167.4922,3846.6816 a 4.6875,4.6875 0 0 0 -4.6875,4.6875 4.6875,4.6875 0 0 0 4.6875,4.6875 h 53.5059 a 4.6875,4.6875 0 0 0 4.6875,-4.6875 4.6875,4.6875 0 0 0 -4.6875,-4.6875 z" id="path3286" style="color:#000000;fill:#3d3d3d;fill-opacity:1;fill-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none"/>
<path d="m -7211.4766,3887.7617 c -14.2754,1e-4 -25.9491,11.6718 -25.9492,25.9473 0,14.2755 11.6737,25.9492 25.9492,25.9492 14.2756,0 25.9493,-11.6737 25.9493,-25.9492 -1e-4,-14.2755 -11.6738,-25.9473 -25.9493,-25.9473 z m 0,9.375 c 9.2089,0 16.5742,7.3634 16.5743,16.5723 0,9.2089 -7.3653,16.5742 -16.5743,16.5742 -9.2088,0 -16.5742,-7.3653 -16.5742,-16.5742 0,-9.2089 7.3654,-16.5723 16.5742,-16.5723 z" id="circle3292" style="color:#000000;fill:#3d3d3d;fill-opacity:1;fill-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none"/>
<path d="m -7167.4922,3895.5273 a 4.6875,4.6875 0 0 0 -4.6875,4.6875 4.6875,4.6875 0 0 0 4.6875,4.6875 h 129.2676 a 4.6875,4.6875 0 0 0 4.6875,-4.6875 4.6875,4.6875 0 0 0 -4.6875,-4.6875 z" id="path3294" style="color:#000000;fill:#3d3d3d;fill-opacity:1;fill-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none"/>
<path d="m -7167.4922,3922.5176 a 4.6875,4.6875 0 0 0 -4.6875,4.6875 4.6875,4.6875 0 0 0 4.6875,4.6875 h 53.5059 a 4.6875,4.6875 0 0 0 4.6875,-4.6875 4.6875,4.6875 0 0 0 -4.6875,-4.6875 z" id="path3296" style="color:#000000;fill:#3d3d3d;fill-opacity:1;fill-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -1,28 +1,34 @@
\begin{titlepage} \begin{titlepage}
\begin{center} \begin{center}
{\normalsize\textbf{Early detection of patient deterioration at home using smart medical sensors}} \\ {\Large\textbf{Early detection of patient deterioration at home using smart medical sensors}} \\
\vspace{1cm} \vspace{2cm}
\includegraphics[width=0.5\textwidth]{figures/tubs-logo.png} \\ \includegraphics[width=0.5\textwidth]{figures/tubs-logo.png} \\
\vspace{2cm}
{\large\textbf{Bachelor Thesis}} \\
\vspace{1cm} \vspace{1cm}
{\large{Bachelor Thesis}} \\ {\small{
\vspace{1cm}
{\small\textbf{
submitted to \\ submitted to \\
Peter L. Reichertz Institut für Medizinische Informatik \\ \vspace{1cm}
der Technischen Universität Braunschweig \\ \textbf{
und der Medizinischen Hochschule Hannover \\ Peter L. Reichertz Institut für Medizinische Informatik \\
der Technischen Universität Braunschweig \\
und der Medizinischen Hochschule Hannover \\
}
\vspace{0.5cm} \vspace{0.5cm}
in September 2023 \\ in \\
\vspace{0.5cm}
\textbf{September 2023} \\
\vspace{0.5cm} \vspace{0.5cm}
by \\ by \\
Julian Lobbes \\ \vspace{0.5cm}
from Hannover \textbf{Julian Lobbes} \\
born in Hannover
}} \\ }} \\
\end{center} \end{center}
\vfill \vfill
{\footnotesize{ {\footnotesize{
Supervisor: Prof. Dr. Thomas M. Deserno \\ Supervisor: \textbf{Prof. Dr. Thomas M. Deserno} \\
Supervising assistant: Prof. Dr. Sharareh R. Niakan Kalhori \\ Supervising assistant: \textbf{Prof. Dr. Sharareh R. Niakan Kalhori} \\
}} }}
\end{titlepage} \end{titlepage}
%\newpage %\newpage

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

View File

@ -11,5 +11,26 @@
A Database Management System is a software system which enables the creation, organization, and management of databases. A Database Management System is a software system which enables the creation, organization, and management of databases.
It generally acts as an interface between the database and client applications, ensuring that data is consistently It generally acts as an interface between the database and client applications, ensuring that data is consistently
stored and readily accessible in a secure and efficient manner, while maintaining data integrity. stored and readily accessible in a secure and efficient manner, while maintaining data integrity.
They can manage various forms of data, including text, numbers, multimedia, and more.
The DBMS plays a crucial role in maintaining the integrity, consistency, and security of the data it handles.
}
}
\newglossaryentry{gui}{
type=\acronymtype,
name={GUI},
description={Graphical User Interface},
first={Graphical User Interface (GUI)}
}
\newglossaryentry{spo2}{
type=\acronymtype,
name={SPO\textsubscript{2}},
description={\Gls{spo2_full}},
first={\Gls{spo2_full} (SPO\textsubscript{2})}
}
\newglossaryentry{spo2_full}{
name={Blood Oxygen Saturation},
description={
A percentage measure indicating the level of oxygen saturation in the blood.
The blood oxygen saturation represents the proportion of hemoglobin molecules in the bloodstream that are saturated with oxygen\cite{hafen_oxygen_2023}.
} }
} }

View File

@ -2,6 +2,8 @@
\usepackage[utf8]{inputenc} \usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc} \usepackage[T1]{fontenc}
\usepackage{DejaVuSerif} % Serif font
\usepackage{ascii} % Monospace font
\usepackage{csquotes} \usepackage{csquotes}
\usepackage[english]{babel} \usepackage[english]{babel}
\usepackage{graphicx} \usepackage{graphicx}
@ -55,7 +57,7 @@
commentstyle=\color{codepurple}, commentstyle=\color{codepurple},
keywordstyle=\color{codegray}, keywordstyle=\color{codegray},
stringstyle=\color{codegreen}, stringstyle=\color{codegreen},
basicstyle=\ttfamily\scriptsize\color{codegray}, basicstyle=\asciifamily\color{codegray},
breakatwhitespace=true, breakatwhitespace=true,
breaklines=true, breaklines=true,
captionpos=b, captionpos=b,
@ -67,6 +69,9 @@
} }
\lstset{style=mystyle} \lstset{style=mystyle}
% Inline code snippets
\newcommand{\code}[1]{\tikz[baseline=(X.base)]\node [draw=gray!50,fill=gray!25,semithick,rectangle,inner sep=2.5pt, rounded corners=3pt] (X) {\asciifamily\color{codegray}{#1}};}
% Citations % Citations
%\usepackage{cite} %\usepackage{cite}
\usepackage[backend=biber, style=vancouver]{biblatex} \usepackage[backend=biber, style=vancouver]{biblatex}
@ -77,26 +82,25 @@
\definecolor{grau}{RGB}{120,110,100} \definecolor{grau}{RGB}{120,110,100}
% A command which generates a TODO message % A command which generates a TODO message
\newcommand{\todo}[1]{\fontfamily{lmtt}\selectfont{\color{orange}\small\underline{TODO:}} \textbf{#1}\fontfamily{lmss}\selectfont\normalsize \\} \newcommand{\todo}[1]{{\fontfamily{lmtt}\selectfont{\color{orange}\small\underline{TODO:}} \textbf{#1}\normalsize \\}}
\input{./glossary.tex} \input{./glossary.tex}
\renewcommand{\thepage}{\Roman{page}} \renewcommand{\thepage}{\Roman{page}}
\begin{document} \begin{document}
{\fontfamily{phv}\selectfont} %{\fontfamily{phv}\selectfont}
\pagenumbering{Roman} \pagenumbering{Roman}
\input{cover.tex} \input{cover.tex}
\section{Summary} \section*{Summary}
\addcontentsline{toc}{section}{Summary}
\todo{Add: appendix, statement of eigenständigkeit.} The summary should be a guideline for creating the work, and briefly name the findings.
Die Zusammenfassung sollte der Leitfaden der Ausarbeitung sein und einen kurzen Überblick A summary must be written in both English and German.
über die Ergebnisse geben. Eine maximal einseitige Zusammenfassung ist jeweils in
deutscher und englischer Sprache anzufertigen.
\newpage \newpage
\renewcommand*\contentsname{Table of contents} \renewcommand*\contentsname{Table of contents}
@ -107,21 +111,33 @@ deutscher und englischer Sprache anzufertigen.
\pagenumbering{arabic} \pagenumbering{arabic}
\section{Introduction} \section{Introduction}
Die Struktur des Einleitungskapitels sollte sich an den einzelnen Stufen des 5-Stufen-Modells1 \textbf{Gegenstand und Motivation}
zur Vorgehensplanung orientieren. Zunächst beginnen Sie mit dem Abschnitt „Gegenstand
und Motivation“. In diesem Abschnitt sollen Sie:
\begin{itemize} \begin{itemize}
\item{den Gegenstand Ihrer Arbeit beschreiben, } \item{brief description of the project}
\item{die Bedeutung Ihrer Arbeit für das Umfeld aufzeigen, } \item{impact on the field}
\item{begründen, welche Problematik zur Erstellung der Arbeit geführt hat, sowie } \item{background (what lead to the project?)}
\item{die Motivation für die Erstellung dieser Arbeit erläutern. } \item{motivation, predicted usefulness to the field}
\end{itemize} \end{itemize}
Die weiteren Stufen sind die Beschreibung der Problemstellung, die Zielsetzung der Arbeit \textbf{Problemstellung}
und die daraus resultierende Fragestellung sowie eine Gliederung ihrer Arbeit.
\todo{write} State clearly which problems exist.
They should phrased such that the project can solve them.
\textbf{Zielsetzung}
State clearly the goals of the research work.
The goals should be derived clearly from the problem statement, and meeting the goals should solve the stated problems.
\textbf{Frage- und Aufgabenstellung}
List concrete questions/tasks, derived from the goals.
Completing all tasks should result meeting all goals.
\textbf{Gliederung}
Describe the structure of the work.
\newpage \newpage
@ -131,21 +147,198 @@ und die daraus resultierende Fragestellung sowie eine Gliederung ihrer Arbeit.
\newpage \newpage
\section{Main Section} \section{Architecture and Design}
\todo{write} Medwings is designed as a browser-based web application in the classic client-server model, facilitating centralized data storage and evaluation.
Opting for a web application offers numerous advantages: the primary benefit is its inherent cross-platform compatibility, enabling usage
on a wide range of devices such as mobile phones and personal computers.
Secondly, implementing a web application reduces complexity and shortens development time, compared to the creation of a native mobile app coupled
with a separate, dedicated API server.
\begin{figure}[!ht]
\begin{center}
\includegraphics[width=.75\textwidth]{./figures/components-macro.png}
\caption{\label{fig:components-macro}System diagram showing data flow and user interactions between components in the Medwings environment.}
\end{center}
\end{figure}
The overall system environment is shown in Figure~\ref{fig:components-macro}, depicting the following workflow:
\begin{enumerate}
\item A patient receives a notification on their mobile phone, prompting them to take vitals measurements.
\item Upon opening the notification, they are redirected to the Medwings website.
Here, they are prompted to self-assess their respiration score by answering a short questionnaire, followed by a prompt to take one measurement
on each smart medical device.
\item Upon completion of the measurement, each device transmits the data via Bluetooth to the Withings mobile app, installed on the user's phone.
The mobile app now sends the data to the Withings Cloud for storage.
\item A backend process on the Medwings server awaits the arrival of all recorded measurements from the Withings Cloud, storing them upon reception.
Once all required vitals measurements have been retrieved, the MEWS is calculated, stored and displayed to the patient.
\end{enumerate}
Measurement prompt notifications are dispatched to the patient at regular intervals throughout the day.
\subsection{Application Modules}\label{sec:modules}
To separate the different functional aspects of Medwings according to responsibility, its application code is split into the following five modules:
\begin{itemize}
\item \code{core}
\item \code{withings}
\item \code{gotify}
\item \code{authentication}
\item \code{medwings}
\end{itemize}
Each module defines classes representing backend logic, database schemas and user interface elements pertaining to its specific function.
Implementation details are encapsulated within these classes, while public interfaces are exposed to external program code to provide each module's core functionality.
The \code{core} module forms the backbone of the application.
It encompasses configuration settings, secrets such as private encryption keys or API tokens, and functionalities shared across multiple other modules.
Medwings interfaces with the Withings Cloud through the \code{withings} module.
This includes retrieving vitals data through authenticated requests to the Withings Cloud API, which implements the OAuth 2.0 Authorization Framework.
As per its specification, \enquote{In OAuth, the client requests access to resources controlled by the resource owner and hosted by the resource server\ldots~
Instead of using the resource owners credentials to access protected resources, the client obtains an access token\ldots~
The client uses the access token to access the protected resources hosted by the resource server.
}\cite{hardt_oauth_2012}
While this process is largely transparent for the resource owner --- the patient in this case --- the communication between
Medwings as the resource client and Withings as the resource server is complex, and is therefore abstracted by the module.
Aside from OAuth 2.0, \code{withings} also encapsulates fetching, parsing, and storing vitals data retrieved from Withings.
Medwings implements a standalone user authentication system, which is provided by the \code{authentication} module.
Patients must register with a username and password to be able to use the application.
The registration occurs in three stages:
\begin{enumerate}
\item The patient grants Medwings the permission to retrieve their health data from Withings in an OAuth2 authorization flow.
\item A registration form is shown, prompting the user to choose a username and password, and to enter relevant personal information.
\item The user is shown a confirmation that the account was created successfully, and is asked to download the Gotify app, described below, and log in using their Medwings credentials.
\end{enumerate}
Following registration, the supplied information and numerous authentication tokens are saved in the Medwings database.
Patients can now sign in on the Medwings website.
The \code{medwings} module, pivotal to the core functionalty of Medwings, defines the data model used to represent and store the various vital signs handled by the application.
Furthermore, it provides interfaces to access the data, as well as the algorithm used to calculate the MEWS.
In order to send push notifications to mobile devices, Medwings leverages \textit{Gotify} -- a dedicated notification microservice\cite{noauthor_gotify_nodate}.
Gotify is composed of a web server component, and a mobile app acting as the client software.
The server exposes its own API, which allows external applications like Medwings to dispatch push notifications programmatically.
It uses an independent database for client authentication. The \code{gotify} module ensures synchronization between the user databases of Gotify and Medwings.
In addition, the module provides interfaces to send customized push notifications to specific patients.
\subsection{Data Model}
A relational database is used to store application data, whereby each Medwings module defines the database schema for the underlying data it is responsible for handling.
Module interdependencies correlate closely with the foreign key references in the data model.
A holistic representation of the Medwings data model is shown in Figure~\ref{fig:datamodel}.
\begin{figure}[!ht]
\begin{center}
\includegraphics[width=\textwidth]{./figures/datamodel.png}
\caption{\label{fig:datamodel}Entity-Relationship diagram (Crow's Foot notation) showing the data model of the Medwings database.}
\end{center}
\end{figure}
At its heart lies the \code{User} entity: it forms the nexus to which all vitals data and user information is linked.
Withings API tokens are stored in the \code{RefreshToken} and \code{AccessToken} entities, while the \code{GotifyUser} and \code{GotifyAccount} entities retain the Gotify API credentials.
The numerous vital signs, as well as the MEWS record which can potentially be calculated based on them, are also represented.
The \code{Profile} table stores additional medically relevant patient information as supplied during user registration.
\subsection{Deployment}
To use the smart devices to take measurements, patient users must first install the Withings mobile app on their phone, and use it to create a Withings user account.
Following registration, each device must be linked to the app and configured via Bluetooth.
Some basic configuration is required in order to enable specific device features, such as measurement of \Gls{spo2} on the Scanwatch.
Users are guided through the process by the app's \Gls{gui}.
Being a web application, no installation is necessary to access the Medwings interface, patients simply visit the website in a web browser.
Patients do need to create a Medwings account on the website however, followed by installation and configuration of the Gotify mobile app, as described in the registration
process in Section~\ref{sec:modules}.
The centralized server components, including the Gotify server, a task scheduler used to schedule sending notifications and the Medwings application code itself are deployed
on a publicly accessible web server using a Docker container environment.
\subsection{Design Challenges}
Since managing a user in Medwings requires the respective user's state to be mirrored by two other services, Withings and Gotify, keeping user accounts across
all three services in sync presents a challenge.
Particularly during user creation, user accounts must be linked to Withings, created on the Gotify server and finally saved to the Medwings database.
Various integrity checks, such as when the user aborts the registration process midway, were put in place to prevent diverging user states across the three services
and overcome this challenge.
Similarly, vitals records kept in the Medwings database must be synchronized with all records available on the Withings cloud.
Regularly recurring, as well as on-demand data synchronization hooks were implemented to keep the Medwings database up to date,
while database constraints ensure validity of imported data and prevent duplication of existing records.
The non-enterprise Withings API enforces a rate limit of 120 requests per minute.
Medwings polls the API regularly to retrieve the latest health data for patients.
At scale, with many patient users, the rate limit would quickly be reached.
The Withing API does provide functionality to notify client applications upon availability of new data, making it possible to avoid polling.
Given that Medwings was only used by a single patient user during the trial phase, falling back to polling was an acceptable compromise to lower complexity
while still operating within the rate limit.
A MEWS calculation should represent the patient's overall physiological state at -- ideally -- a discrete point in time.
Naturally, there is a delay from when a measurement is taken with a device until it can be retrieved from the API.
The percieved transmission delay in the Medwings implementation was generally consistent with what is stated in the Withings public API documentation:
\enquote{Delays are typically less than two minutes, but it can be longer.}\cite{noauthor_keep_nodate}.
However, in some cases, the measurements taken on a device do not get pushed to the Withings Cloud until much later, or fail to do so at all.
While the cause for these longer than normal delays and missing data points is unknown and outside of the control of Medwings, these edge cases
had to be taken into account.
Furthermore, the time it takes a patient to take measurements using all three devices must also be accounted for.
Therefore, Medwings enforces a maximum allowed time difference of ten minutes between measurements of the different vitals records used to calculate MEWS.
If a set of vitals measurements is, across all records in the set, spaced further apart than ten minutes, no MEWS record is calculated, and the user is shown an
error message, prompting them to repeat the measurements.
\newpage \newpage
\section{Implementation} \section{System Interaction and Usability}
\begin{itemize}
\todo{write} \item Personal experiences in interacting with the system and the medical devices
\item What went well and what didn't? Why?
\item Usability for potential medical staff, if applicable
\item Strengths and weaknesses of patients taking their own measurements vs. having a medical professional take them
\item How well did patients (or you, in this case) adhere to the measurement schedule? What factors influenced this?
\end{itemize}
\newpage \newpage
\section{Evaluation} \section{Data Presentation and Analysis}
\begin{itemize}
\item Present your measured vitals data in an organized and visual manner (tables, graphs, etc.)
\item Analyze the vitals and MEWS data: trends, anomalies, etc.
\item Discuss the regularity of measurements and the systems effectiveness in prompting and collecting data
\end{itemize}
\todo{write}
\newpage
\section{Evaluation and Validation}
\begin{itemize}
\item Describe the methods used to evaluate the system
\item Discuss the validity of the study, especially considering that the test patient was yourself
Explicitly state the limitations of your study. For example, the fact that you were the test patient, which might introduce bias into the results
\item Are the results likely to generalize? Why or why not?
\end{itemize}
\newpage
\section{Lessons Learned and Reflections}
\begin{itemize}
\item Reflect on the overall development process
\item What would you do differently if you were to start over?
\item What did you learn that was unexpected?
\end{itemize}
\newpage
\section{Future Work and Improvements}
\begin{itemize}
\item What can be improved in the current system?
\item Are there additional features that could make the system more effective?
\item Any scalability or security issues that would need to be addressed for a larger-scale deployment?
\end{itemize}
\newpage
\section{Implications and Conclusions}
\begin{itemize}
\item Implications of this research for the wider field of remote patient monitoring
\item Conclusions drawn from the research
\item Summary of the contributions of your work
\end{itemize}
\newpage \newpage
@ -153,6 +346,7 @@ und die daraus resultierende Fragestellung sowie eine Gliederung ihrer Arbeit.
\setcounter{page}{3} \setcounter{page}{3}
\pagenumbering{Roman} \pagenumbering{Roman}
\printnoidxglossary[title=Glossary, toctitle=Glossary]\label{sec:glossary} \printnoidxglossary[title=Glossary, toctitle=Glossary]\label{sec:glossary}
\newpage \newpage
\printnoidxglossary[type=\acronymtype, title=Acronyms, toctitle=Acronyms]\label{sec:acronyms} \printnoidxglossary[type=\acronymtype, title=Acronyms, toctitle=Acronyms]\label{sec:acronyms}
@ -167,8 +361,19 @@ und die daraus resultierende Fragestellung sowie eine Gliederung ihrer Arbeit.
% Appendix here % Appendix here
\section{Ehrenwörtliche Erklärung} \newpage
% Eigenständigkeitserklärung here \section*{Ehrenwörtliche Erklärung}
\todo{write} \addcontentsline{toc}{section}{Ehrenwörtliche Erklärung}
Ich versichere, dass ich die beiliegende Bachelorarbeit ohne Hilfe Dritter und ohne Benutzung anderer als der angegebenen
Quellen und Hilfsmittel angefertigt und die den benutzten Quellen wörtlich oder inhaltlich entnommenen Stellen als solche
kenntlich gemacht habe.
Diese Arbeit hat in gleicher Form noch keiner Prüfungsbehörde vorgelegen.
Ich bin mir bewusst, dass eine falsche Erklärung rechtliche Folgen haben wird.
Braunschweig, 12.09.2023
\vspace{3cm}
\end{document} \end{document}