thesis #5
@ -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
|
||||||
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 632 KiB |
1
docs/figures/components-micro.drawio
Normal file
@ -0,0 +1 @@
|
|||||||
|
<mxGraphModel><root><mxCell id="0"/><mxCell id="1" parent="0"/></root></mxGraphModel>
|
@ -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="<p style="margin:0px;margin-top:4px;text-align:center;text-decoration:underline;"><b>User</b></p><hr><p style="margin:0px;margin-left:8px;"><u>id<i style="">&nbsp;: Integer</i><br></u>password<i>&nbsp;: String</i><br>last_login<i>&nbsp;: DateTime</i><br>is_superuser<i>&nbsp;: Boolean</i><br>username<i>&nbsp;: String</i><br>first_name<i>&nbsp;: String</i><br>last_name : <i>String</i><br>email<i>&nbsp;: String</i><br>is_staff<i>&nbsp;: Boolean</i><br>is_active<i>&nbsp;: Boolean</i><br>date_joined<i>&nbsp;: DateTime</i></p>" 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="<p style="margin:0px;margin-top:4px;text-align:center;text-decoration:underline;"><b>GotifyApplication</b></p><hr><p style="margin:0px;margin-left:8px;">id<i>&nbsp;: Integer</i><br>token<i> : String</i><br></p>" 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="<p style="margin:0px;margin-top:4px;text-align:center;text-decoration:underline;"><b>GotifyUser</b></p><hr><p style="margin:0px;margin-left:8px;">id<i>&nbsp;: Integer</i><br></p>" 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="<p style="margin:0px;margin-top:4px;text-align:center;text-decoration:underline;"><b>ApiAccount</b></p><hr><p style="margin:0px;margin-left:8px;">userid<i>&nbsp;: Integer</i><br>last_update<i>&nbsp;: DateTime</i></p>" 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="<p style="margin:0px;margin-top:4px;text-align:center;text-decoration:underline;"><b>RefreshToken</b></p><hr><p style="margin:0px;margin-left:8px;">value<i>&nbsp;: String</i><br>expires<i>&nbsp;: DateTime</i></p>" 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="<p style="margin:0px;margin-top:4px;text-align:center;text-decoration:underline;"><b>AccessToken</b></p><hr><p style="margin:0px;margin-left:8px;">value<i>&nbsp;: String</i><br>expires<i>&nbsp;: DateTime</i></p>" 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="<p style="margin:0px;margin-top:4px;text-align:center;text-decoration:underline;"><b>Profile</b></p><hr><p style="margin:0px;margin-left:8px;">sex<i>&nbsp;: Enum</i><br>date_of_birth<i>&nbsp;: Date</i></p>" 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="<p style="margin:0px;margin-top:4px;text-align:center;text-decoration:underline;"><b>HeartRateRecord</b></p><hr><p style="margin:0px;margin-left:8px;"><u>id<i>&nbsp;: Integer</i></u><br>recorded<i>&nbsp;: DateTime</i><br>value_bpm<i> : Integer</i></p>" 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="<p style="margin:0px;margin-top:4px;text-align:center;text-decoration:underline;"><b>BodyTempRecord</b></p><hr><p style="margin:0px;margin-left:8px;"><u>id<i>&nbsp;: Integer</i></u><br>recorded<i>&nbsp;: DateTime</i><br>value_celcius<i> : Decimal</i></p>" 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="<p style="margin:0px;margin-top:4px;text-align:center;text-decoration:underline;"><b>Spo2LevelRecord</b></p><hr><p style="margin:0px;margin-left:8px;"><u>id<i> : Integer</i></u></p><p style="margin:0px;margin-left:8px;">recorded<i>&nbsp;: DateTime</i><br>value_percent<i> : Integer</i></p>" 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="<p style="margin:0px;margin-top:4px;text-align:center;text-decoration:underline;"><b>BloodPressureRecord</b></p><hr><p style="margin:0px;margin-left:8px;"><u>id<i>&nbsp;: Integer</i></u><br>recorded<i>&nbsp;: DateTime</i><br>value_systolic_mmhg<i>&nbsp;: Integer</i><br>value_diastolic_mmhg<i> : Integer<br></i></p>" 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="<p style="margin:0px;margin-top:4px;text-align:center;text-decoration:underline;"><b>RespirationScoreRecord</b></p><hr><p style="margin:0px;margin-left:8px;"><u>id<i>&nbsp;: Integer</i></u><br>recorded<i>&nbsp;: DateTime</i><br>value_severity<i>&nbsp;: Enum</i></p>" 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="<p style="margin:0px;margin-top:4px;text-align:center;text-decoration:underline;"><b>MewsRecord</b></p><hr><p style="margin:0px;margin-left:8px;"><u>id<i>&nbsp;: Integer</i></u><br>recorded<i>&nbsp;: DateTime</i><br>value_n<i>&nbsp;: Integer</i></p>" 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>
|
||||||
|
17
docs/figures/icon-browser.svg
Normal 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 |
10
docs/figures/icon-server.svg
Normal 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 |
34
docs/figures/icon-user-interface.svg
Normal 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 |
@ -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
|
||||||
|
BIN
docs/thesis/figures/components-macro.png
Normal file
After Width: | Height: | Size: 261 KiB |
BIN
docs/thesis/figures/datamodel.png
Normal file
After Width: | Height: | Size: 336 KiB |
@ -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}.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 owner’s 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 system’s 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}
|
||||||
|