thesis #5

Merged
jlobbes merged 8 commits from thesis into master 2023-09-01 11:45:44 +01:00
43 changed files with 5475 additions and 414 deletions

1
.gitignore vendored
View File

@ -21,6 +21,7 @@
**/*.bcf **/*.bcf
**/*.blg **/*.blg
**/*.gz **/*.gz
**/*.loa
**/*.log **/*.log
**/*.lof **/*.lof
**/*.lot **/*.lot

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

1
docs/analysis/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/.venv/

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 479 KiB

Binary file not shown.

217
docs/analysis/charts.py Normal file
View File

@ -0,0 +1,217 @@
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.size'] = 12
def generate_measurement_stats_pie_chart(show: bool, save: bool):
fig, ax = plt.subplots()
size_outer = 0.3
size_inner = 0.2
vals_outer = np.array([28., 7.]) # Measurements vs Measurement failures
vals_middle = np.array([17., 11., 7., 0.]) # MEWS calculations, Measurement only, P2 failures, P1 failures
vals_inner = np.array([16., 1., 8., 3., 2., 5., 0., 0.]) # Innermost ring values
cmap = plt.get_cmap("tab20b")
outer_colors = cmap(np.array([6, 13]))
middle_colors = cmap(np.array([5, 15, 14, 14]))
inner_colors = cmap(np.array([11, 10, 11, 10, 11, 10, 11, 10]))
# Outer ring
ax.pie(vals_outer, radius=1, colors=outer_colors,
wedgeprops=dict(width=size_outer, edgecolor='w'))
# Middle ring
ax.pie(vals_middle, radius=1-size_outer, colors=middle_colors,
wedgeprops=dict(width=size_inner, edgecolor='w'))
# Innermost ring
inner_pie = ax.pie(vals_inner, radius=1-size_outer-size_inner, colors=inner_colors,
wedgeprops=dict(width=size_inner, edgecolor='w'))
#labels_inner = ["home", "on the go"]
#ax.legend(inner_pie[0], labels_inner, loc="center right")
ax.set(aspect="equal")
if save:
plt.savefig(
"chart-measurement-stats.png",
dpi=900,
bbox_inches='tight',
transparent=True
)
if show:
plt.show()
def generate_measurement_repeats_histogram(show: bool, save: bool):
device_names = ["Scanwatch", "BPM Core", "Thermo"]
labels_attempts = [f"{name} measurement attempts" for name in device_names]
labels_failures = ["S\u2081 failures", "B\u2081 failures", "T\u2081 failures"]
values_attempts = [43, 33, 28]
values_failures = [15, 5, 0]
# Define a list of colors for the bars
cmap = plt.get_cmap("tab20b")
colors_attempts = cmap(np.array([15, 11, 7]))
colors_failures = cmap(np.array([13, 9, 5]))
# Plot the bars with the specified colors and labels for the legend
bars_attempts = plt.bar(device_names, values_attempts, color=colors_attempts)
bars_failures = plt.bar(device_names, values_failures, color=colors_failures)
# Add individual labels for each bar in the legend
for i in range(3):
bars_attempts[i].set_label(labels_attempts[i])
bars_failures[i].set_label(labels_failures[i])
plt.ylabel("Count")
plt.ylim(0, 55)
plt.yticks(range(0, 56, 5))
plt.legend(loc="upper right", prop={"size":8})
if save:
plt.savefig(
"chart-measurement-repeats.png",
dpi=900,
bbox_inches="tight",
transparent=True
)
if show:
plt.show()
def generate_connection_boxplots(show: bool, save: bool):
data_downlink = [
[50.42, 46.29, 39.94, 39.44, 50.21, 44.34, 41.03, 47.88, 50.34, 41.72, 43.93, 49.34, 50.49, 52.47, 47.04, 45.86, 51.17, 50.12, 52.16, 50.55, 50.69, 53.43, 42.21, 46.81],
[15.3, 25.47, 33.91, 12.27]
]
data_uplink = [
[11.38, 11.24, 8.46, 9.33, 11.39, 9.33, 9.03, 10.65, 11.59, 8.81, 8.91, 10.56, 10.98, 10.04, 9.11, 8.62, 11.08, 10.62, 11.24, 11.29, 10.86, 10.46, 9.16, 9.15],
[5.33, 5.46, 3.38, 4.23]
]
data_rtt = [
[14, 16, 15, 15, 15, 15, 16, 12, 15, 14, 18, 14, 19, 16, 23, 12, 16, 14, 12, 13, 13, 13, 17, 15],
[145, 127, 104, 108]
]
fig, axes = plt.subplots(nrows=1, ncols=3, sharex=True, figsize=(15,5))
#plt.subplots_adjust(wspace=0.4)
cmap = plt.get_cmap("tab20b")
medianprops= {
"color": cmap(1),
"linewidth": 2,
}
# Downlink Boxplot
axes[1].boxplot(data_downlink, medianprops=medianprops)
axes[1].set_ylabel("Datarate [Mbps]")
axes[1].set_title("Downlink")
axes[1].set_xticks([1, 2])
axes[1].set_xticklabels(["At home", "On the go"])
# Uplink Boxplot
axes[0].boxplot(data_uplink, medianprops=medianprops)
axes[0].set_ylabel("Datarate [Mbps]")
axes[0].set_title("Uplink")
axes[0].set_xticks([1, 2])
axes[0].set_xticklabels(["At home", "On the go"])
# RTT Boxplot
axes[2].boxplot(data_rtt, medianprops=medianprops)
axes[2].set_ylabel("RTT [ms]")
axes[2].set_title("RTT")
axes[2].set_xticks([1, 2])
axes[2].set_xticklabels(["At home", "On the go"])
# Function to add jitter
def jitter(x, width=0.1):
"""Return the given x coordinate plus a small random offset."""
np.random.seed = 0
return x + np.random.uniform(-width, width)
# Sample points to plot on the boxplots
points_uplink = [
(1, 11.38),
(2, 5.33),
(1, 9.33),
(2, 5.46),
(1, 11.59),
(1, 10.56),
(1, 10.98),
(1, 11.24),
(2, 4.23),
(1, 10.86),
(1, 10.46),
]
points_downlink = [
(1, 50.42),
(2, 15.3),
(1, 39.44),
(2, 25.47),
(1, 50.34),
(1, 49.34),
(1, 50.49),
(1, 52.16),
(2, 12.27),
(1, 50.69),
(1, 53.43),
]
points_rtt = [
(1, 14),
(2, 145),
(1, 15),
(2, 127),
(1, 15),
(1, 14),
(1, 19),
(1, 12),
(2, 108),
(1, 13),
(1, 13),
]
# Plotting points on Uplink Boxplot
for x, y in points_uplink:
axes[0].scatter(jitter(x), y, marker='x', color=cmap(14), linewidth=0.5)
# Plotting points on Downlink Boxplot
for x, y in points_downlink:
axes[1].scatter(jitter(x), y, marker='x', color=cmap(14), linewidth=0.5)
# Plotting points on RTT Boxplot
for x, y in points_rtt:
axes[2].scatter(jitter(x), y, marker='x', color=cmap(14), linewidth=0.5)
# Plot a dummy point for the legend (outside the visible range)
#axes[0].scatter([-100], [-100], marker='x', color=cmap(14), linewidth=0.5, label='synchronization failure')
#fig.legend(loc='upper center', bbox_to_anchor=(0.5, 1.1))
if save:
plt.savefig(
"chart-connection-boxplot.png",
dpi=900,
bbox_inches="tight",
transparent=True
)
if show:
plt.show()
def main():
#generate_measurement_stats_pie_chart(False, True)
#generate_measurement_repeats_histogram(False, True)
generate_connection_boxplots(False, True)
if __name__ == "__main__":
main()

1402
docs/analysis/data.json Normal file

File diff suppressed because it is too large Load Diff

BIN
docs/analysis/data.ods Normal file

Binary file not shown.

108
docs/analysis/main.py Normal file
View File

@ -0,0 +1,108 @@
import json
from datetime import datetime, timedelta
import records as r
def get_records() -> list[r.Collection]:
"""Returns the trial data as a list of `records.Collection` objects."""
json_data = []
with open('data.json', 'r') as file:
json_data = json.load(file)
def incremented(time: datetime) -> datetime:
if time.hour == 22:
time += timedelta(hours=12)
else:
time += timedelta(hours=3)
return time
records: list[r.Collection] = []
time = datetime.fromisoformat("2023-08-14T10:00:00")
for item in json_data:
p1 = item['p1']
home_environment = item['home']
if p1:
mews = None
blood_pressure = None
body_temp = None
heart_rate = None
respiration_score = None
spo2 = None
s1 = None
b1 = None
t1 = None
p2 = None
s2 = None
b2 = None
t2 = None
uplink = None
downlink = None
rtt = None
else:
blood_pressure = r.BloodPressure(
time=datetime.fromisoformat(item['blood_pressure']['time']),
value_systolic=item['blood_pressure']['value_systolic'],
value_diastolic=item['blood_pressure']['value_systolic']
)
body_temp = r.BodyTemp(
time=datetime.fromisoformat(item['body_temp']['time']),
value=item['body_temp']['value']
)
heart_rate = r.HeartRate(
time=datetime.fromisoformat(item['heart_rate']['time']),
value=item['heart_rate']['value']
)
respiration_score = r.RespirationScore(
time=datetime.fromisoformat(item['respiration_score']['time']),
value=item['respiration_score']['value']
)
spo2 = r.Spo2(
time=datetime.fromisoformat(item['spo2']['time']),
value=item['spo2']['value']
)
s1 = item['s1']
b1 = item['b1']
t1 = item['t1']
p2 = item['p2']
s2 = item['s2']
b2 = item['b2']
t2 = item['t2']
uplink = item['uplink']
downlink = item['downlink']
rtt = item['rtt']
if s2 or b2 or t2:
mews = None
else:
mews = r.Mews(
time=datetime.fromisoformat(item['mews']['time']),
value=item['mews']['value']
)
records.append(r.Collection(
notification_time=time,
mews=mews,
blood_pressure=blood_pressure,
body_temp=body_temp,
heart_rate=heart_rate,
respiration_score=respiration_score,
spo2=spo2,
s1=s1,
b1=b1,
t1=t1,
s2=s2,
b2=b2,
t2=t2,
p1=p1,
p2=p2,
home_environment=home_environment,
uplink=uplink,
downlink=downlink,
rtt=rtt
))
time = incremented(time)
return records

65
docs/analysis/records.py Normal file
View File

@ -0,0 +1,65 @@
"""Type classes used during analysis."""
from datetime import datetime
from dataclasses import dataclass
from typing import Optional
@dataclass
class BloodPressure:
time: datetime
value_diastolic: int
value_systolic: int
@dataclass
class BodyTemp:
time: datetime
value: float
@dataclass
class HeartRate:
time: datetime
value: int
@dataclass
class Mews:
time: datetime
value: int
@dataclass
class RespirationScore:
time: datetime
value: int
@dataclass
class Spo2:
time: datetime
value: int
@dataclass
class Collection:
notification_time: datetime
mews: Optional[Mews]
blood_pressure: Optional[BloodPressure]
body_temp: Optional[BodyTemp]
heart_rate: Optional[HeartRate]
respiration_score: Optional[RespirationScore]
spo2: Optional[Spo2]
s1: Optional[int]
b1: Optional[int]
t1: Optional[int]
s2: Optional[bool]
b2: Optional[bool]
t2: Optional[bool]
p1: bool
p2: Optional[bool]
home_environment: bool
uplink: Optional[float]
downlink: Optional[float]
rtt: Optional[int]

14
docs/analysis/shell.nix Normal file
View File

@ -0,0 +1,14 @@
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
nativeBuildInputs = with pkgs; [
python3Packages.numpy
python3Packages.matplotlib
python310Packages.pyqt6
python310Packages.pyside6
qt6.qtwayland
];
shellHook = ''
export MPLBACKEND=QtAgg
'';
}

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

947
docs/misc/trial-data.json Normal file
View File

@ -0,0 +1,947 @@
[
{
"blood_pressure": {
"time": "2023-08-14T10:26:35",
"value_diastolic": 86,
"value_systolic": 131
},
"body_temp": {
"time": "2023-08-14T10:25:48",
"value": 36.98
},
"heart_rate": {
"time": "2023-08-14T10:26:35",
"value": 90
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": "2023-08-14T10:24:51",
"value": 0
},
"spo2": {
"time": "2023-08-14T10:25:35",
"value": 96
}
},
{
"blood_pressure": {
"time": "2023-08-14T13:05:06",
"value_diastolic": 75,
"value_systolic": 117
},
"body_temp": {
"time": "2023-08-14T13:04:18",
"value": 37.49
},
"heart_rate": {
"time": "2023-08-14T13:05:06",
"value": 71
},
"mews": {
"time": "2023-08-14T13:06:18",
"value": 0
},
"respiration_score": {
"time": "2023-08-14T13:03:24",
"value": 0
},
"spo2": {
"time": "2023-08-14T13:03:59",
"value": 97
}
},
{
"blood_pressure": {
"time": "2023-08-14T16:48:16",
"value_diastolic": 85,
"value_systolic": 126
},
"body_temp": {
"time": "2023-08-14T16:47:12",
"value": 37.16
},
"heart_rate": {
"time": "2023-08-14T16:48:16",
"value": 73
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": "2023-08-14T16:46:18",
"value": 0
},
"spo2": {
"time": "2023-08-14T16:46:57",
"value": 98
}
},
{
"blood_pressure": {
"time": "2023-08-14T19:06:01",
"value_diastolic": 86,
"value_systolic": 124
},
"body_temp": {
"time": "2023-08-14T19:05:10",
"value": 37.28
},
"heart_rate": {
"time": "2023-08-14T19:06:01",
"value": 82
},
"mews": {
"time": "2023-08-14T19:07:22",
"value": 0
},
"respiration_score": {
"time": "2023-08-14T19:03:39",
"value": 0
},
"spo2": {
"time": "2023-08-14T19:04:57",
"value": 96
}
},
{
"blood_pressure": {
"time": "2023-08-14T22:27:50",
"value_diastolic": 86,
"value_systolic": 114
},
"body_temp": {
"time": "2023-08-14T22:27:12",
"value": 37.32
},
"heart_rate": {
"time": "2023-08-14T22:27:50",
"value": 56
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": "2023-08-14T22:24:14",
"value": 0
},
"spo2": {
"time": "2023-08-14T22:26:54",
"value": 98
}
},
{
"blood_pressure": {
"time": null,
"value_diastolic": null,
"value_systolic": null
},
"body_temp": {
"time": null,
"value": null
},
"heart_rate": {
"time": null,
"value": null
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": null,
"value": null
},
"spo2": {
"time": null,
"value": null
}
},
{
"blood_pressure": {
"time": null,
"value_diastolic": null,
"value_systolic": null
},
"body_temp": {
"time": null,
"value": null
},
"heart_rate": {
"time": null,
"value": null
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": null,
"value": null
},
"spo2": {
"time": null,
"value": null
}
},
{
"blood_pressure": {
"time": "2023-08-15T16:13:28",
"value_diastolic": 83,
"value_systolic": 115
},
"body_temp": {
"time": "2023-08-15T16:12:25",
"value": 37.64
},
"heart_rate": {
"time": "2023-08-15T16:13:28",
"value": 84
},
"mews": {
"time": "2023-08-15T16:16:55",
"value": 0
},
"respiration_score": {
"time": "2023-08-15T16:11:23",
"value": 0
},
"spo2": {
"time": "2023-08-15T16:12:03",
"value": 96
}
},
{
"blood_pressure": {
"time": "2023-08-15T19:37:37",
"value_diastolic": 80,
"value_systolic": 114
},
"body_temp": {
"time": "2023-08-15T19:36:32",
"value": 37.33
},
"heart_rate": {
"time": "2023-08-15T19:37:37",
"value": 75
},
"mews": {
"time": "2023-08-15T19:40:31",
"value": 0
},
"respiration_score": {
"time": "2023-08-15T19:35:07",
"value": 0
},
"spo2": {
"time": "2023-08-15T19:36:19",
"value": 97
}
},
{
"blood_pressure": {
"time": "2023-08-15T22:37:09",
"value_diastolic": 78,
"value_systolic": 114
},
"body_temp": {
"time": "2023-08-15T22:36:27",
"value": 37.27
},
"heart_rate": {
"time": "2023-08-15T22:37:09",
"value": 63
},
"mews": {
"time": "2023-08-15T22:37:55",
"value": 0
},
"respiration_score": {
"time": "2023-08-15T22:35:34",
"value": 0
},
"spo2": {
"time": "2023-08-15T22:36:09",
"value": 99
}
},
{
"blood_pressure": {
"time": "2023-08-16T10:33:29",
"value_diastolic": 82,
"value_systolic": 112
},
"body_temp": {
"time": "2023-08-16T10:32:39",
"value": 37.39
},
"heart_rate": {
"time": "2023-08-16T10:33:29",
"value": 93
},
"mews": {
"time": "2023-08-16T10:34:59",
"value": 0
},
"respiration_score": {
"time": "2023-08-16T10:31:40",
"value": 0
},
"spo2": {
"time": "2023-08-16T10:32:23",
"value": 96
}
},
{
"blood_pressure": {
"time": "2023-08-16T14:38:04",
"value_diastolic": 93,
"value_systolic": 119
},
"body_temp": {
"time": "2023-08-16T14:36:55",
"value": 37.65
},
"heart_rate": {
"time": "2023-08-16T14:38:04",
"value": 72
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": "2023-08-16T14:36:04",
"value": 0
},
"spo2": {
"time": "2023-08-16T14:36:42",
"value": 97
}
},
{
"blood_pressure": {
"time": "2023-08-16T16:47:26",
"value_diastolic": 83,
"value_systolic": 118
},
"body_temp": {
"time": "2023-08-16T16:45:42",
"value": 37.64
},
"heart_rate": {
"time": "2023-08-16T16:47:26",
"value": 89
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": "2023-08-16T16:44:39",
"value": 0
},
"spo2": {
"time": "2023-08-16T16:45:28",
"value": 98
}
},
{
"blood_pressure": {
"time": "2023-08-16T20:12:49",
"value_diastolic": 81,
"value_systolic": 118
},
"body_temp": {
"time": "2023-08-16T20:11:58",
"value": 37.52
},
"heart_rate": {
"time": "2023-08-16T20:12:49",
"value": 97
},
"mews": {
"time": "2023-08-16T20:15:42",
"value": 0
},
"respiration_score": {
"time": "2023-08-16T20:10:52",
"value": 0
},
"spo2": {
"time": "2023-08-16T20:11:35",
"value": 98
}
},
{
"blood_pressure": {
"time": "2023-08-16T23:18:08",
"value_diastolic": 74,
"value_systolic": 125
},
"body_temp": {
"time": "2023-08-16T23:15:39",
"value": 37.65
},
"heart_rate": {
"time": "2023-08-16T23:18:08",
"value": 85
},
"mews": {
"time": "2023-08-16T23:18:50",
"value": 0
},
"respiration_score": {
"time": "2023-08-16T23:13:39",
"value": 0
},
"spo2": {
"time": "2023-08-16T23:15:17",
"value": 99
}
},
{
"blood_pressure": {
"time": "2023-08-17T11:01:05",
"value_diastolic": 79,
"value_systolic": 112
},
"body_temp": {
"time": "2023-08-17T11:00:04",
"value": 37.05
},
"heart_rate": {
"time": "2023-08-17T11:01:05",
"value": 87
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": "2023-08-17T10:58:59",
"value": 0
},
"spo2": {
"time": "2023-08-17T10:59:48",
"value": 95
}
},
{
"blood_pressure": {
"time": "2023-08-17T14:27:40",
"value_diastolic": 82,
"value_systolic": 118
},
"body_temp": {
"time": "2023-08-17T14:27:09",
"value": 37.43
},
"heart_rate": {
"time": "2023-08-17T14:27:40",
"value": 80
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": "2023-08-17T14:25:59",
"value": 0
},
"spo2": {
"time": "2023-08-17T14:26:45",
"value": 98
}
},
{
"blood_pressure": {
"time": "2023-08-17T16:53:03",
"value_diastolic": 71,
"value_systolic": 121
},
"body_temp": {
"time": "2023-08-17T16:52:21",
"value": 37.73
},
"heart_rate": {
"time": "2023-08-17T16:53:03",
"value": 83
},
"mews": {
"time": "2023-08-17T16:54:15",
"value": 0
},
"respiration_score": {
"time": "2023-08-17T16:50:34",
"value": 0
},
"spo2": {
"time": "2023-08-17T16:51:58",
"value": 98
}
},
{
"blood_pressure": {
"time": "2023-08-17T20:12:24",
"value_diastolic": 69,
"value_systolic": 129
},
"body_temp": {
"time": "2023-08-17T20:11:32",
"value": 37.46
},
"heart_rate": {
"time": "2023-08-17T20:12:24",
"value": 73
},
"mews": {
"time": "2023-08-17T20:13:09",
"value": 0
},
"respiration_score": {
"time": "2023-08-17T20:10:31",
"value": 0
},
"spo2": {
"time": "2023-08-17T20:11:13",
"value": 96
}
},
{
"blood_pressure": {
"time": "2023-08-17T22:47:55",
"value_diastolic": 81,
"value_systolic": 121
},
"body_temp": {
"time": "2023-08-17T22:47:18",
"value": 36.79
},
"heart_rate": {
"time": "2023-08-17T22:47:55",
"value": 95
},
"mews": {
"time": "2023-08-17T22:50:02",
"value": 0
},
"respiration_score": {
"time": "2023-08-17T22:46:04",
"value": 0
},
"spo2": {
"time": "2023-08-17T22:46:54",
"value": 97
}
},
{
"blood_pressure": {
"time": "2023-08-18T10:54:12",
"value_diastolic": 75,
"value_systolic": 124
},
"body_temp": {
"time": "2023-08-18T10:53:27",
"value": 37.34
},
"heart_rate": {
"time": "2023-08-18T10:54:12",
"value": 73
},
"mews": {
"time": "2023-08-18T10:55:50",
"value": 0
},
"respiration_score": {
"time": "2023-08-18T10:51:36",
"value": 0
},
"spo2": {
"time": "2023-08-18T10:53:12",
"value": 96
}
},
{
"blood_pressure": {
"time": "2023-08-18T13:32:51",
"value_diastolic": 86,
"value_systolic": 123
},
"body_temp": {
"time": "2023-08-18T13:32:16",
"value": 37.09
},
"heart_rate": {
"time": "2023-08-18T13:32:51",
"value": 61
},
"mews": {
"time": "2023-08-18T13:34:01",
"value": 0
},
"respiration_score": {
"time": "2023-08-18T13:29:25",
"value": 0
},
"spo2": {
"time": "2023-08-18T13:31:55",
"value": 97
}
},
{
"blood_pressure": {
"time": "2023-08-18T16:39:14",
"value_diastolic": 83,
"value_systolic": 122
},
"body_temp": {
"time": "2023-08-18T16:37:22",
"value": 37.13
},
"heart_rate": {
"time": "2023-08-18T16:39:14",
"value": 73
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": "2023-08-18T16:36:14",
"value": 0
},
"spo2": {
"time": "2023-08-18T16:37:02",
"value": 96
}
},
{
"blood_pressure": {
"time": "2023-08-18T19:38:58",
"value_diastolic": 75,
"value_systolic": 123
},
"body_temp": {
"time": "2023-08-18T19:36:37",
"value": 37.65
},
"heart_rate": {
"time": "2023-08-18T19:38:58",
"value": 114
},
"mews": {
"time": "2023-08-18T19:41:43",
"value": 2
},
"respiration_score": {
"time": "2023-08-18T19:35:24",
"value": 0
},
"spo2": {
"time": "2023-08-18T19:36:14",
"value": 95
}
},
{
"blood_pressure": {
"time": null,
"value_diastolic": null,
"value_systolic": null
},
"body_temp": {
"time": null,
"value": null
},
"heart_rate": {
"time": null,
"value": null
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": null,
"value": null
},
"spo2": {
"time": null,
"value": null
}
},
{
"blood_pressure": {
"time": "2023-08-19T11:36:26",
"value_diastolic": 76,
"value_systolic": 121
},
"body_temp": {
"time": "2023-08-19T11:35:24",
"value": 37.5
},
"heart_rate": {
"time": "2023-08-19T11:36:26",
"value": 54
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": "2023-08-19T11:34:30",
"value": 0
},
"spo2": {
"time": "2023-08-19T11:35:05",
"value": 98
}
},
{
"blood_pressure": {
"time": "2023-08-19T13:24:56",
"value_diastolic": 73,
"value_systolic": 120
},
"body_temp": {
"time": "2023-08-19T13:24:02",
"value": 37.31
},
"heart_rate": {
"time": "2023-08-19T13:24:56",
"value": 106
},
"mews": {
"time": "2023-08-19T13:27:13",
"value": 1
},
"respiration_score": {
"time": "2023-08-19T13:21:46",
"value": 0
},
"spo2": {
"time": "2023-08-19T13:23:43",
"value": 96
}
},
{
"blood_pressure": {
"time": null,
"value_diastolic": null,
"value_systolic": null
},
"body_temp": {
"time": null,
"value": null
},
"heart_rate": {
"time": null,
"value": null
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": null,
"value": null
},
"spo2": {
"time": null,
"value": null
}
},
{
"blood_pressure": {
"time": null,
"value_diastolic": null,
"value_systolic": null
},
"body_temp": {
"time": null,
"value": null
},
"heart_rate": {
"time": null,
"value": null
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": null,
"value": null
},
"spo2": {
"time": null,
"value": null
}
},
{
"blood_pressure": {
"time": null,
"value_diastolic": null,
"value_systolic": null
},
"body_temp": {
"time": null,
"value": null
},
"heart_rate": {
"time": null,
"value": null
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": null,
"value": null
},
"spo2": {
"time": null,
"value": null
}
},
{
"blood_pressure": {
"time": null,
"value_diastolic": null,
"value_systolic": null
},
"body_temp": {
"time": null,
"value": null
},
"heart_rate": {
"time": null,
"value": null
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": null,
"value": null
},
"spo2": {
"time": null,
"value": null
}
},
{
"blood_pressure": {
"time": "2023-08-20T13:21:35",
"value_diastolic": 82,
"value_systolic": 119
},
"body_temp": {
"time": "2023-08-20T13:20:44",
"value": 37.29
},
"heart_rate": {
"time": "2023-08-20T13:21:35",
"value": 83
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": "2023-08-20T13:18:46",
"value": 0
},
"spo2": {
"time": "2023-08-20T13:20:20",
"value": 98
}
},
{
"blood_pressure": {
"time": "2023-08-20T16:13:04",
"value_diastolic": 79,
"value_systolic": 118
},
"body_temp": {
"time": "2023-08-20T16:12:05",
"value": 37.38
},
"heart_rate": {
"time": "2023-08-20T16:13:04",
"value": 95
},
"mews": {
"time": null,
"value": null
},
"respiration_score": {
"time": "2023-08-20T16:10:40",
"value": 0
},
"spo2": {
"time": "2023-08-20T16:11:52",
"value": 97
}
},
{
"blood_pressure": {
"time": "2023-08-20T19:06:47",
"value_diastolic": 82,
"value_systolic": 120
},
"body_temp": {
"time": "2023-08-20T19:05:37",
"value": 37.25
},
"heart_rate": {
"time": "2023-08-20T19:06:47",
"value": 93
},
"mews": {
"time": "2023-08-20T19:12:52",
"value": 0
},
"respiration_score": {
"time": "2023-08-20T19:04:47",
"value": 0
},
"spo2": {
"time": "2023-08-20T19:05:24",
"value": 97
}
},
{
"blood_pressure": {
"time": "2023-08-20T22:25:47",
"value_diastolic": 73,
"value_systolic": 115
},
"body_temp": {
"time": "2023-08-20T22:25:06",
"value": 37.45
},
"heart_rate": {
"time": "2023-08-20T22:25:47",
"value": 83
},
"mews": {
"time": "2023-08-20T22:29:09",
"value": 0
},
"respiration_score": {
"time": "2023-08-20T22:23:27",
"value": 0
},
"spo2": {
"time": "2023-08-20T22:24:51",
"value": 97
}
}
]

BIN
docs/misc/trial-data.ods Normal file

Binary file not shown.

Binary file not shown.

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: 449 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 930 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 624 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

View File

@ -1,15 +1,211 @@
\makenoidxglossaries \makenoidxglossaries
\newglossaryentry{dbms}{ \newglossaryentry{dbms}{
type=\acronymtype, type=\acronymtype,
name={DBMS}, name={DBMS},
description={Database Management System}, description={Database Management System},
first={\Gls{dbms_full} (DBMS)} first={\Gls{dbms_full} (DBMS)}
} }
\newglossaryentry{dbms_full}{ \newglossaryentry{dbms_full}{
name={Database Management System}, name={Database Management System},
description={ description={
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{ui}{
type=\acronymtype,
name={UI},
description={User Interface},
first={User Interface (UI)}
}
\newglossaryentry{iot}{
type=\acronymtype,
name={IoT},
description={Internet of Things},
first={Internet of Things (IoT)}
}
\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}.
}
}
\newglossaryentry{uplink-datarate}{
name={uplink datarate},
description={
The speed at which data is transmitted from a client device, such as a computer or smartphone, to a server or central network.
Typically measured in Mbps (megabits per second), it represents the efficiency of data sending capabilities of a network connection.
}
}
\newglossaryentry{downlink-datarate}{
name={downlink datarate},
description={
The rate at which data is received by a client device from a central server or network.
Expressed often in Mbps, it reflects the downloading or data reception efficiency of a network connection.
}
}
\newglossaryentry{rtt}{
type=\acronymtype,
name={RTT},
description={\Gls{rtt_full}},
first={\Gls{rtt_full} (RTT)}
}
\newglossaryentry{rtt_full}{
name={Round trip time},
description={
The time taken for a data packet to travel from a source to a destination and back again.
It provides an indication of the latency or delay inherent in a network connection and is usually measured in milliseconds (ms).
}
}
\newglossaryentry{icu}{
type=\acronymtype,
name={ICU},
description={intensive care unit},
first={intensive care unit (ICU)},
}
\newglossaryentry{mews}{
type=\acronymtype,
name={MEWS},
plural={MEWSs},
description={\Gls{mews_full}},
first={\Gls{mews_full} (MEWS)},
}
\newglossaryentry{mews_full}{
name={Modified Early Warning Score},
description={
An adaptation of the \Gls{ews_full}, which provides a simplified scoring system based on fewer physiological parameters to predict medical deterioration.
}
}
\newglossaryentry{news2}{
type=\acronymtype,
name={NEWS2},
description={\Gls{news2_full}},
first={\Gls{news2_full} (NEWS2)},
}
\newglossaryentry{news2_full}{
name={National Early Warning Score 2},
description={
The second iteration of a standardized scoring system used in the UK to detect and respond to clinical deterioration in adult patients.
It builds upon and refines the original NEWS score.
}
}
\newglossaryentry{ews}{
type=\acronymtype,
name={EWS},
plural={EWSs},
description={\Gls{ews_full}},
first={\Gls{ews_full} (EWS)}
}
\newglossaryentry{ews_full}{
name={Early Warning Score},
plural={Early Warning Scores},
description={
A clinical tool used to assess the severity and likelihood of patient deterioration by scoring multiple vital signs.
}
}
\newglossaryentry{deterioration}{
name={deterioration},
description={
A decline in a patient's health status marked by worsening of clinical signs and symptoms, often necessitating escalated medical intervention.
}
}
\newglossaryentry{rpm}{
type=\acronymtype,
name={RPM},
description={\Gls{rpm_full}},
first={\Gls{rpm_full} (RPM)}
}
\newglossaryentry{rpm_full}{
name={remote patient monitoring},
description={
A technology to enable monitoring of patients outside of conventional clinical settings, such as in the home or in a remote area,
which may increase access to care and decrease healthcare delivery costs.
}
}
\newglossaryentry{rwsm}{
type=\acronymtype,
name={RWSM},
description={\Gls{rwm_full}},
first={\Gls{rwm_full} (RWSM)}
}
\newglossaryentry{rwm_full}{
name={Remote Warning Score Monitoring},
description={
An approach that integrates \gls{rpm} of mobile patients with the automated calculation of an \gls{ews}.
It enables real-time assessment of patient deterioration risk based on data gathered remotely.
}
}
\newglossaryentry{api}{
type=\acronymtype,
name={API},
description={\Gls{api_full}},
first={\Gls{api_full} (API)}
}
\newglossaryentry{api_full}{
name={Application Programming Interface},
description={
A set of rules and protocols that allow different software entities to communicate with each other.
It defines the methods and data formats that applications can use to request and exchange information.
APIs are utilized to enable the integration between different systems and devices, streamlining their functionalities and expanding capabilities.
}
}
\newglossaryentry{pews}{
type=\acronymtype,
name={PEWS},
description={\Gls{pews_full}},
first={\Gls{pews_full} (PEWS)}
}
\newglossaryentry{pews_full}{
name={Pediatric Early Warning Score},
description={
An early warning score used to identify early signs of \gls{deterioration} in pediatric patients.
}
}
\newglossaryentry{avpu}{
type=\acronymtype,
name={AVPU},
description={\Gls{avpu_full}},
first={\Gls{avpu_full} (AVPU)}
}
\newglossaryentry{avpu_full}{
name={AVPU Score},
description={
A rapid assessment method to determine a patient's level of consciousness.
The AVPU scale is used to quickly identify potential neurological impairment or altered mental status in emergency settings.
The four possible findings are:
\begin{itemize}
\item \textbf{Alert}: Patient is fully alert and oriented.
\item \textbf{Voice}: Patient responds to verbal stimuli but is not fully alert.
\item \textbf{Pain}: Patient responds only to painful stimuli.
\item \textbf{Unresponsive}: Patient does not respond to any external stimuli.
\end{itemize}
}
}
\newglossaryentry{ecg}{
type=\acronymtype,
name={ECG},
description={\Gls{ecg_full}},
first={\Gls{ecg_full} (ECG)}
}
\newglossaryentry{ecg_full}{
name={Electrocardiogram},
description={
A medical test that measures the electrical activity of the heartbeat to diagnose various heart conditions.
}
} }

File diff suppressed because it is too large Load Diff