Internet der Dinge WS2015/ WBPS - Wi-Fi Blutdruckmessgerät

Aus Verteilte Systeme - Wiki
Wechseln zu: Navigation, Suche

Präsentation des Projektes: Datei:Wbps talk.pdf

Einleitung

In diesem Projekt soll ein internetfähiges Blutdruckmessgerät entwickelt werden. Dieses kann über eine Webschnittstelle gesteuert sowie überwacht werden. Durch Einschalten des Blutdruckmessgerätes soll sich dieses automatisiert bei einem Webserver registrieren und initial einer Patienten-ID zugeordnet werden können. Die Blutdruckmessung soll wie bei einer Langzeitblutdruckmessung üblich zyklisch ausgeführt werden und lokal sowie remote protokolliert werden. Außerdem kann die Blutdruckmessung auf Wunsch remote getriggert werden.

Als Einsatzgebiete sind zum Beispiel Krankenhäuser, Reha-Kliniken und Hausärzte (Geräte-Verleih) vorstellbar. Durch die Internetfähigkeit ist eine Live-Überwachung eines Patienten möglich. Dadurch kann dem Patient schneller Feedback gegeben (zum Beispiel beim Eintreffen in der Praxis nach der Langzeitmessung) oder aber auf einen kritischen Zustand reagiert werden. Außerdem können über die Webschnittstelle alle Geräte zentral verwaltet und Messdaten übersichtlich angezeigt werden.

Der Webserver wurde exemplarisch und zur Vereinfachung nur für eine Organisation (z.B ein bestimmtes Krankenhaus) umgesetzt, könnte aber relativ einfach um eine Verwaltung von Organisationen erweitert werden. Dazu müssten Geräte und Benutzer immer der Organisation zugeordnet werden, die sie erstellt hat. Der Anbieter der Wi-Fi Blutdruckmessgeräte würde in diesem Fall Lizenzen verkaufen und daraufhin jeweils eine Organisation anlegen.

Das entwickelte Blutdruckmessgerät wird im Folgenden als (Wi-Fi) Blutdruckmessgerät, WBPS (Wireless Blood Pressure Sensor) oder einfach nur Gerät bezeichnet.

Anforderungen

  • Webserver zur Bearbeitung von Benutzeranfragen und mit Schnittstelle zur Kommunikation mit dem Mikrocontroller.
  • Datenbank zur Speicherung der Daten.
  • Übersichtliche Benutzerschnittstelle zur Verwendung der wichtigsten Funktionen. Unterteilt in Patienten- und Angestellten Schnittstelle.
  • Einfaches Protokoll zur Kommunikation zwischen Webserver und Mikrocontroller.
  • Angemessene Reaktion in Fehlerfällen (Keine Verbindung zum Server -> Zwischenspeichern von Daten).
  • Umfangreiches Logging der Daten (zur Fehlersuche, zur Anzeige des ACK-Status,...).
  • Möglichst genaue Messung durch Re-Engineering eines bestehenden Blutdruckmessgerätes.
  • Überwachung des Batteriestatus.

Systemarchitektur

Der grobe Aufbau der Architektur lässt sich in drei Einheiten unterteilen:

  • Die Clientseitige Schnittstelle, über die Patienten und Angestellte (z.B. Ärzte) Zugriff auf unterschiedliche Funktionen haben ("Blutdruck messen", "Batteriestatus abfragen", "Protokoll führen"...).
  • Der Webserver, der einerseits Daten aufbereitet und HTML-Dateien für die Clients rendert, andererseits aber auch Daten abspeichert und eine REST-artige Schnittstelle für das Messgerät zur Verfügung stellt.
  • Das eigentliche Blutdruckmessgerät, das mit dem Webserver kommuniziert, auf durch Benutzer angestoßene Änderungen reagiert und daraufhin zum Beispiel eine Messung ausführt und das Ergebnis an den Webserver sendet.

Aufbau blutdruck.png

Im Folgenden wird die Umsetzung der Architektur von außen (Benutzerschnittstellen) nach innen (Hardware) beschrieben.

Webschnittstelle

Die Webschnittstelle umfasst den für Clients sichtbaren Teil der Anwendung. Hier können Benutzer auf Daten zugreifen und Aktionen ausführen, die sowohl Einfluss auf den Zustand des Webservers (insbesondere der Datenbank) als auch auf den Zustand des Messgerätes haben. Beim Design der Webschnittstelle lag der Fokus auf einfacher Benutzbarkeit und einer zurückhaltenden Optik. So kann der Benutzer schnell die wesentlichen Funktionen erfassen.

Außerdem sollten die Kernfunktionen integriert werden, die für einen Einsatz im medizinischen Bereich nötig sind. Dazu gehört das Verbinden des WBPS in das Wi-Fi Netzwerk der Organisation, das Hinzufügen des Gerätes über seine MAC-Adresse, sowie die Benutzer- und Geräteverwaltung und ein Logging von ausgeführten Aktionen. Damit wurde prototypisch eine Webschnittstelle entwickelt, welche Benutzern alle wesentlichen Funktionen bietet.

Login

Wie bei einem Loginfenster üblich, können hier sowohl Patienten als auch Angestellte ihre Benutzerdaten (Benutzername und Passwort) eingeben und werden anschließend zu der für sie relevanten Seite weitergeleitet. Benutzer werden in der Angestelltenschnittstelle verwaltet.

Patienten

Die Benutzerschnittstelle des WBPS ist nicht nur von Angestellten nutzbar, sondern auch von Patienten. Sie liefert Patienten zum Einen eine Übersicht über die bisher gemessenen Blutdruckwerte. Zum Anderen können Patienten ein Protokoll ihrer Aktivitäten führen und ein Wi-Fi Setup des Gerätes durchführen.

Verlauf

Der Blutdruckverlauf liefert Patienten zum Einen eine Übersicht über die bisher gemessenen Blutdruckwerte. Dadurch sind sie in der Lage, Blutdruckwerte eigenständig zu überwachen. Der Blutdruckverlauf gliedert sich in eine Tabelle, in der alle Blutdruckmesswerte eingetragen sind und zwei graphischen Darstellungen des Blutdruckverlaufes (Kurvendiagramm, Balkendiagramm), die eine schnelle Übersicht ermöglichen. Pro Messpunkt wird der systolische sowie diastolische Wert zusammen mit dem Datum der Ausführung angezeigt. Die Messwerte können nach Datum gefiltert werden. In den unteren Abbildungen ist jeweils das selbe Messevent markiert. Gemessen wurden die angezeigten Daten mit dem "realen" Messgerät.

Wbps-staff trend1.png Wbps-staff trend2.png

Protokoll

Andererseits bietet die Schnittstelle auch die Möglichkeit ein Protokoll zu führen. Ein Protokoll, welches bei einer länger andauernden Blutdruckmessung üblich ist, dient dem Patienten der Angabe von Tätigkeiten und des Zeitraums an dem diese Tätigkeiten innerhalb der Überwachungsdauer ausgeführt wurden. Dies ist nötig, damit die Blutdruckmesswerte einer Tätigkeit zugeordnet werden können. Dadurch ist für Angestellte direkt sichtbar, was der Patient zum Zeitpunkt einer bestimmten Messung unternommen hat. Die jeweilige Tätigkeit kann einen Einfluss auf die Messwerte haben. Sie ist sowohl in der oben bereits beschriebenen Messwertetabelle als auch in den graphischen Verläufen ("Maus über Messpunkt") sichtbar. Im oberen Bild ist jeweils der selbe Messpunkt markiert, einmal in der Tabelle, einmal im Kurvendiagramm.

Wbps-patient protocol.png

In der Protokoll-Oberfläche können Patienten für jedes Datum ein Protokoll über ihre Aktivitäten führen. Dazu muss zuerst das Datum ausgewählt werden, für das Aktivitäten eingetragen werden sollen. Anschließend kann je nach Aktivität eine Uhrzeit ausgewählt und ein Textfeld mit der Beschreibung der Aktivität gefüllt werden. Durch Klick auf das "+" können Aktivitäten hinzugefügt werden. Nach Speicherung sortiert sich das Protokoll nach dem Zeitstempel der Aktivität. Der Zeitraum einer Aktivität ist dann die Spanne zwischen dem Zeitstempel einer Aktivität und der darauf folgenden. Das Protokoll sollte somit möglichst genau geführt werden. Eine Aktivität läuft jedoch höchstens bis zum Ende des ausgewählten Tages.

Wi-Fi Setup

Falls ein Blutdruckmessgerät dem Patienten zur temporären Nutzung zu Hause (z.B. durch den Hausarzt) mitgegeben wird, kann dieser das Gerät ebenso wie Angestellte in das eigene lokale Wi-Fi-Netzwerk einbinden (siehe Abschnitt Angestellte).

Angestellte

Angestellte verfügen in der Angestellten-Schnittstelle über weitreichendere Funktionen. Neben der Benutzerverwaltung dient sie auch der Verwaltung und Steuerung von Blutdruckmessgeräten.

Überblick

Die Startseite eines Angestellten gibt ihm einen Überblick über unterschiedliche Daten. So sind hier unter anderem die Anzahl der registrierten Patienten, das zuletzt hinzugefügte WBPS, die Anzahl der "online"-Geräte, als auch die letzte Blutdruckmessung aufgeführt.

Wbps-staff start.png

Benutzerverwaltung

In der Angestellten- und Patientenverwaltung lassen sich Angestellte, respektive Patienten, anlegen und löschen. Angestellte haben Zugriff auf den Angestelltenbereich der Webschnittstelle. In beiden Verwaltungen wird ein Benutzername und Passwort vergeben. In der Patientenverwaltung können zusätzlich optional Alter, Geschlecht und weitere Informationen angegeben werden.

Wbps-staff patienten.png

Mit Klick auf einen Angestellten oder Patienten werden seine Details angezeigt. Bei dem Patienten wird zusätzlich der Blutdruckverlauf, analog zum Verlauf in der Patientenschnittstelle, angezeigt. Bei Angestellten werden hingegen die Aktionen des jeweiligen Angestellten angezeigt.

Geräteverwaltung

Das Herzstück der Webschnittstelle ist die Geräteverwaltung. Während der Patient über die Webschnittstelle keine Aktionen des WBPS ansteuern kann, verfügen Angestellte über direkte Interaktionsmöglichkeiten mit registrierten Messgeräten. In der Geräteverwaltung werden in einer Übersicht alle registrierten WBPS angezeigt. Hier wird die MAC-Adresse des Gerätes, das Datum der Registrierung am Webserver sowie der zugeordnete Patient (falls bereits zugeordnet) angegeben.

Wbps-staff devices.png

Außerdem können weitere Geräte über ihre MAC-Adresse hinzugefügt werden.

Mit einem Klick auf "Details" erhält der Angestellte Zugriff auf die eigentlichen Funktionen des Messgerätes.

  • Im "Info" Segment wird die zuletzt ausgeführte Messung des ausgewählten Gerätes angezeigt. Außerdem ist hier der grobe Batteriestatus sichtbar ("Niedrig", "Mittel", "Hoch") sowie der Online-Status des Gerätes sichtbar.
  • In den "Einstellungen" ist die Zuordnung eines Patienten zu einem WBPS möglich. Dadurch werden auch die Messungen, die dieses Messgerät ausgeführt hat, automatisch dem Patienten zugeordnet. Die Zuordnung kann bei Bedarf wieder aufgelöst werden. Dadurch bleiben die in dem Zeitraum erhobenen Messwerte jedoch weiterhin dem Patienten zugeordnet. Der Blutdruckverlauf eines Patienten ist damit persistent und unabhängig des zugeordneten Messgerätes sichtbar. Außerdem ist hier das Intervall einstellbar, in welchem des Messgerät Messungen durchführen soll. Optional kann ein Startdatum übergeben werden, bei dem die Intervallmessung beginnt. Mit einem Klick auf "Bestätigen" werden die Daten in der Datenbank gespeichert. Das Messgerät kann daraufhin das Intervall abfragen. Bestätigt das Messgerät den Erhalt des Intervalls, wird ein grüner Pfeil (sonst grau) neben der Einstellung sichtbar.
  • Das Segement "Anweisungen" umfasst Befehle, die einmalig auf dem WBPS ausgeführt werden. Mit "Batteriestatus abfragen" berechnet das Messgerät seinen aktuellen Batteriestatus und teilt diesen dem Webserver mit. Mit "Sofort Messen" wird, unabhängig des eingestellten Intervalls, eine Messung getriggert. Die jeweiligen Buttons sind so lange nicht anklickbar, bis der Befehl ausgeführt wurde.

Im unteren Bereich der Geräte-Details kann außerdem das betreffende Messgerät gelöscht werden. Die Seite aktualisiert relevante Segmente per AJAX automatisch alle x Sekunden (voreingestellt sind 5). Diese Einstellung lässt sich im oberen rechten Bereich anpassen.

Wbps-staff device details.png

Übersicht Aktionen und Events

Zur Überwachung von über die Angestellten-Schnittstelle auf dem Messgerät ausgeführten Aktionen, kann für jeden Angestellten eine Liste der von ihm ausgeführten Aktionen angezeigt werden. Hier werden in den Aktionen-Details außerdem die Events angezeigt, die durch die jeweilige Aktion durch das Gerät ausgeführt und an den Webserver geschickt wurden (mehr zu Aktionen und Events im Abschnitt Webschnittstelle).

Wbps actions+events.png

Wi-Fi Setup

Wifi setup.jpg

Um das Gerät zur Benutzung in das Wi-Fi Netzwerk einer Organisation einbinden zu können, wurde zudem eine Seite zum einfachen Wi-Fi Setup erstellt. Zuerst muss sich der Benutzer mit dem Access Point des Blutdruckmessgerätes (bzw. des Particle Photon) verbinden. Dann kann er sich Wi-Fi Netzwerke in der Umgebung anzeigen lassen und sich mit einem von diesen verbinden (per Auswahl der SSID und evtl. Passworteingabe).

Wbps wifi.png

Umsetzung

Zur Umsetzung der Webschnittstelle (.html, .js, .css Dateien) wurde insbesondere das CSS Framework "Bootstrap"[1] verwendet. Dieses verfügt u.a. über ein Raster-System, mit dem sich Elemente einfach anordnen lassen. Zum Anzeigen der Blutdruckverläufe kam die Javascript Bibliothek "Chart.js"[2] zum Einsatz. Diese verfügt über unterschiedliche Diagrammarten und wird per Javascript konfiguriert. Außerdem wurde die JavaScript-Bibliothek "jQuery"[3] zur einfachen DOM-Navigation und DOM-Manipulation verwendet. Die HTML-Dateien selbst wurden über das Template-System des Web-Frameworks Django mit Daten gefüllt (siehe dazu Abschnitt Webserver).

Zur Konfigration der Wi-Fi Netzwerke wurde die Javascript-Bibliothek "softAP"[4] (von Particle selbst) verwendet. Über diese Schnittstelle können die Informationen des Photon (z.B. ID), mit dessen Access Point der Computer verbunden ist, abgefragt werden. Außerdem kann nach Access Points in der Reichweite des Photon gescannt werden (Rückgabe ist eine Liste dieser Access Points). Zum Verbinden wird dem Photon nun die SSID, Passwort, der Channel, sowie die Verschlüsselung des ausgewählten Netzwerkes übermittelt. Da der Computer während dem Wi-Fi Setup keine Internetverbindung hat, können keine Anfragen an den Server zur Generierung einer HTML-Seite geschickt werden. Das Userinterface zur Auswahl eines Netzwerkes wird deswegen nach der Verbindung mit dem Photon komplett über Javascript (bzw. jQuery) verändert. Im Folgenden ist der Code zum Setzen einer Wi-Fi Konfiguration auf dem Photon abgebildet. Im Fehler- oder Erfolgsfall werden jeweils verschiedene Meldungen auf der Seite angezeigt. Der Index des Access Points wird über das data-index Attribut des Tags des in der Schnittstelle ausgewählten Netzwerkes ermittelt. Dieses wurde zuvor bei der Abfrage der empfangenen Access Points und der daraus folgenden Manipulation des DOM-Baumes gesetzt.

var index = parseInt($(this).attr('data-index'));
ap = aps[index];

var ap_config = {
                ssid: ap.ssid,
                channel: ap.ch,
                security: SAP.securityLookup(ap.sec),
                password: $("#password_" + index).val()
};

SAP.configure( ap_config, function(err, dat) {
        if (err) { 
                console.log(err);
                wifi_alert("danger", "Fehler bei der Übernahme der Netzwerk-Daten.");
                throw err; 
        } else {
                SAP.connect( function(err, dat) {
                        if (err) { 
                                console.log(err); 
                                wifi_alert("danger", "Fehler bei der Übernahme der Netzwerk-Daten.");
                                throw err; 
                        } else {
                                console.log("connected");
                                var msg = '';
                                msg += "Die Netzwerk-Daten wurden erfolgreich &uuml;bernommen. <br/>";
                                msg += "Falls sich das WBPS nicht mit dem Internet verbindet, wurden unter Umst&auml;nden 
                                die Netzwerk-Daten falsch eingegeben. <br/>";
                                msg += " Geben Sie in diesem Fall die Netzwerk-Daten bitte erneut ein.";
                                wifi_alert("success", msg);
                                $('#wifi_alert').html();
                        }
                });
        }
});

Webserver

Der Webserver ist für die Verarbeitung von Benutzer- sowie Geräteanfragen zuständig. Dazu wurde das Python Web Framework Django[5] (Slogan: "The Web framework for perfectionists with Deadlines") verwendet. Dieses verfügt über einen großen Funktionsumfang. So besitzt es unter anderem einen objektrelationaler Mapper, mit dem sich Datenbank-Relationen über Python Klassen codieren und anschließend einfach in eine Datenbank (z.B. MySQL) überführen lassen. Das Routing (Mapping der URLs auf Python Funktionen) wird über reguläre Ausdrücke definiert. Zur Erzeugung von HTML-Seiten verfügt es außerdem über ein mächtiges Template-System.

Django läuft in diesem Projekt über einen Apache Webserver per mod_wsgi.

Aktionen

Aktionen werden auf dem Webserver immer dann erzeugt und in der Datenbank gespeichert, wenn der Benutzer eine Einstellung ändert oder eine Anweisung ausführt, die Einfluss auf ein bestimmtes Blutdruckmessgerät hat. Eine Aktion kapselt also den jeweiligen Befehl zusammen mit dem Zeitstempel der Ausführung und weiteren Aktionstyp-spezifischen Werten. Aktionen haben verschiedene Typen welche dem Gerät übermittelt werden. Dadurch kann es je nach Typ weiter verfahren (eine Messung ausführen, Batteriestatus prüfen...).

Jede Aktion wird vom zugeteilten WBPS bestätigt (ACK), wenn diese erfolgreich behandelt wurde. Bei den implementierten Aktionen wird dem Blutdruckmessgerät nur die aktuellste noch nicht bestätigte Aktion übermittelt. Somit kann es durchaus sein, dass eine Aktion nicht vom Messgerät bestätigt wird (z.B. bei mehrmaliger Intervalländerung während der das WBPS keinen Wi-Fi Empfang hat).

Aktionen dienen zum Einen der Visualisierung welche Einstellung bzw. Anweisung ein bestimmtes Messgerät bereits übernommen bzw. ausgeführt hat (Geräte-Details in der Webschnittstelle). Außerdem können damit alle bisher erzeugten Aktionen für ein Messgerätes zusammen mit dem Status der Bestätigung angezeigt werden (siehe Abschnitt "Webschnittstelle>Angestellte>Aktionen"). Das kann unter anderem der Fehlerfindung dienen. Zudem können mit diesem System in einer möglichen Erweiterung auch auf einfache Weise weitere Aktionstypen abgebildet werden, bei denen z.B. jede Aktion ausgeführt werden muss (und nicht nur die neuste). Dazu wird dem Messgerät immer die älteste noch nicht bestätigte Aktion übermittelt.

Es wurden folgende Aktionen implementiert:

Aktionstyp Code Beschreibung
IntervalAction 0 Benutzer hat das Messintervall verändert
MeasurementAction 1 Benutzer hat direkt eine Messung angestoßen
BatteryStatusAction 2 Benutzer hat die Batterie-Status Abfrage angestoßen

Events

Events sind der umgekehrte Fall zu Aktionen und gehen vom Blutdruckmessgerät aus. Führt das Gerät zum Beispiel eine Messung aus (da ein Intervall gesetzt wurde) sendet es ein Event an den Server. Auch Events besitzen unterschiedliche Typen und eventspezifische Werte (z.B. systolischer und diastolischer Druck bei einem MeasurementEvent). Sobald der Webserver ein Event erhält, speichert er es in der Datenbank ab und ordnet es außerdem der auslösenden Aktion zu.

Es wurden folgende Events implementiert:

Event-Typ Code Beschreibung
MeasurementEvent 0 Gerät hat Messung ausgeführt.
BatteryStatusEvent 1 Gerät hat Batteriemessung durchgeführt.

Schnittstellen zum WBPS

Wbps schnittstellen.jpg

Wie im Abschnitt "Architektur" bereits kurz beschrieben, erfolgt die Kommunikation zwischen Webserver und dem Photon Mikrocontroller des Blutdruckmessgerätes mittels HTTP, das bekanntlich auf TCP/IP aufbaut. Dazu besitzt der Webserver eine REST-artige Schnittstelle, durch die das WBPS regelmäßig per GET Aktionen abfragt oder aber Events per POST schickt.

Der Webserver verfügt über eine einfach gehaltente Schnittstelle zur Kommunikation mit den Photon Blutdruckmessgeräten. Sie besteht aus den Komponenten "Registrierung" (erreichbar über /device/Register), "Aktionen" (erreichbar über /device/<id>/actions und /device/<id>/actions/<typ> für einen bestimmten Aktionstyp) und "Events" (erreichbar über /device/<id>/events).

Da es für den Anwendungsfall nicht sinnvoll war, dass das Messgerät z.B. Zugriff auf eine spezielle, bereits erstellte Aktion oder ein Event hat und diese Ressourcen löschen und verändern kann, wie es oft bei einer REST-Architektur der Fall ist, sind die Möglichkeiten zur Interkation mit den Schnittstellen stark begrenzt. Das hat auch einen Sicherheitsvorteil: Das Gerät weiß weder welchem Patienten es zugeordnet ist, noch kann über die Schnittstelle ein Verlauf der bereits übermittelten Events erstellt oder bereits geschickte Events gelöscht werden (damit wären z.B. Blutdruckwerte des Patienten nicht mehr sichtbar). Diese Möglichkeiten bestehen lediglich durch Angestellte, deren Zugriff jedoch Passwort geschützt ist. Das Passwort wiederum wird nur auf dem Server gespeichert und nicht wie bei den WBPS zudem im Gerät selbst.

Das Gerät fragt je nach Situation die Schnittstellen zyklisch ab.

Registrierung-Schnittstelle

Wbps registrierung.jpg

Ist ein Gerät noch nicht registriert, spricht es nach dem Einschalten automatisch die Registrierungsschnittstelle des Webservers per POST an und bittet mit der Übermittlung der MAC-Adresse um eine Registrierung. Wurde die MAC-Adresse noch nicht durch einen Angestellten hinzugefügt, erhält das Gerät eine leere Antwort (Status 204 No Content). Wurde es jedoch registriert wird ein neues Gerät-Tupel in der Datenbank gespeichert und dem Gerät die ID und ein generiertes Token (Alphanumerisch, 50 Zeichen) mitgeteilt, mit dem es fortan seine Ressource anspricht und sich authentifiziert (Status 200 OK).

Aktionen-Schnittstelle

Grober Ablauf der Erzeugung und Bearbeitung von Aktionen

Über die Aktionen-Schnittstelle kann ein Gerät aktuelle Aktionen abfragen. Dazu schickt es ein GET-Request an seine Ressource mit angehängtem "/actions" ("device/<eigene ID>/actions/<optionaler typ>"). Übermitteln muss es außerdem sein Token im "Authorization" Headerfeld (ansonsten bekommt es eine "WWW-Authenticate" Aufforderung). Bei gültiger Anfrage werden dem WBPS alle aktuellen Aktionen, die noch nicht von dem Gerät bestätigt wurden, übermittelt. Dazu wurde eine einfache Serialisierung verwendet (Beispiel IntervalAction):

action_type=0&action_id=12&interval=60&start_date=1454448970

Bei mehreren Aktionen werden diese kommasepariert. Das Gerät reagiert nun auf die Aktionen (näheres im Abschnitt "Photon Mikrocontroller"). Der grobe Ablauf der Erzeugung von Aktionen bis zur Ausführung dieser ist in der Abbildung "Grober Ablauf der Erzeugung und Bearbeitung von Aktionen" dargestellt.

Events-Schnittstelle

Grober Ablauf der Erzeugung und Bearbeitung von Events

Über die Events-Schnittstelle kann der Mikrocontroller (Photon) des Gerätes die zuletzt durchgeführten Events per HTTP zu dem Webserver schicken. Dazu schickt es ein POST-Request an seine Ressource mit angehängtem "/events" ("device/<eigene ID>/events"). Übermitteln muss es außerdem sein Token im "Authorization" Headerfeld (ansonsten bekommt es eine "WWW-Authenticate" Aufforderung). Die Events werden vom Gerät auf die gleiche Weise wie Aktionen durch den Webserver serialisiert (Beispiel Messevent):

event_type=0&action_type=0&action_id=12&systolic=120&execution_date=1454448980...“

Bei mehreren Events werden diese kommasepariert. Der Webserver parst nun den Request-Body und leitet je nach Eventtyp an einen andere Funktion weiter, welche die Daten verarbeitet und in der Datenbank speichert. Hier erfolgt auch die Zuordnung zu der auslösenden Aktion (und die Bestätigung dieser, falls noch nicht zuvor erfolgt), die immer vom Gerät mitgeliefert wird. So kann eine IntervalAction mehrere Events zur Folge haben, eine MeasurementAction oder BatteryStatusAction jedoch nur eines. Die Verarbeitung des Request-Body und Weiterleitung an einen Handler wurde wie folgt im Python-Code umgesetzt:

event_handlers = {str(MeasurementEvent.code) : _handle_measurement_event,
                  str(BatteryStatusEvent.code) : _handle_battery_status_event}

def _process_events(raw_events):
    if not raw_events:
        return
    
    events = []

    #Read events from body
    for raw_event in raw_events.split(DATASET_SEPARATOR):
        attributes = raw_event.split(ATTR_SEPARATOR)

        event = {attribute.split("=")[0] : attribute.split("=")[1] for attribute in attributes}
        events.append(event)
        
    return events

def _handle_events(device, events):
    for event in events:
        if event['event_type'] in event_handlers:
            event_handlers[event['event_type']](device, event)

Der grobe Ablauf des Erzeugens von Events bis zur Speicherung dieser in der Datenbank und Anzeige für den Benutzer ist in der Abbildung "Grober Ablauf der Erzeugung und Bearbeitung von Events" dargestellt.

Datenbank

Der Webserver verwendet eine MySQL Datenbank zum Speichern unterschiedlicher Daten. Das sind zum Einen Daten von Patienten und Angestellten. Zum Anderen Daten der registrierten Geräte, Aktionen (siehe Abschnitt "Aktionen") und Events (siehe Abschnitt "Events"). Im Folgenden wird kurz auf die wichtigsten Relationen der Datenbank eingegangen.

Device

Die am Webserver registrierten WBPS werden in der Relation "Device" verwaltet. Hier wird die MAC-Adresse, das Token, der zugeordnete Patient, das Datum der Registrierung, sowie das Datum der letzten Anfrage des Gerätes an den Server gespeichert.

PendingDevice

Enthält nur die MAC-Adressen von Geräten die hinzugefügt werden sollen, jedoch noch nicht registriert sind. Nach der Registrierung wird das betreffende Tupel wieder gelöscht.

User

In der Relation "User" wird für jeden Benutzer ein Eintrag erstellt. Das umfasst den Benutzername und Passwort sowie Daten wie Alter und Geschlecht.

Aktion

Für jeden Aktiontyp (IntervalAction, MeasurementAction, BatteryStatusAction) existiert eine Relation. Alle Aktion-Relationen besitzen als Attribute einen Fremdschlüssel auf das Gerät sowie den ausführenden Benutzer, den zugeordneten Patienten und das Erstelldatum, sowie das ACK-Datum. Je nach Typ kommen weitere Attribute (Intervall, Startdatum) hinzu.

Event

Für jeden Eventtyp (MeasurementEvent, BatteryStatusEvent) existiert eine Relation. Alle Event-Relationen besitzen als Attribute einen Fremdschlüssel auf das Gerät sowie den Patienten und das Ausführungsdatum (des Gerätes) sowie Empfangsdatum (des Servers). Je nach Typ kommen weitere Attribute (Messwert, Batteriestatus) hinzu. Außerdem wird jedem Event durch den Fremdschlüssel die Aktion, die das Event getriggert hat, zugeordnet.

Photon Mikrocontroller

Bei dem Photon handelt sich um ein für IoT Projekte entwickeltes Modul der Firma Spark Labs[6]. Der Photon Mikrocontroller wurde vor allem wegen seiner kleinen Bauweise, der guten Dokumentation sowie eines geringen Energieverbrauches gewählt. Letzteres ist besonders bei einer Langzeitmessung wichtig. Über das auf dem Photon befindliche WLAN Modul kann eine Internetverbindung hergestellt werden. In diesem Projekt ist der Photon hauptsächlich für die Kommunikation mit dem Webserver sowie der Ausführung der Blutdruck- und Batteriestatusmessung zuständig und wird über GPIO-Pins mit den Aktoren und Sensoren verbunden.

HTTP-Client

Der HTTP-Client ist für das Abfragen (per GET) und Interpretieren der Aktionen des Webservers und das eventuell daraus resultierende Anstoßen des Messungsmoduls zuständig. Dieses übernimmt die eigentliche Messung. Außerdem steht ein Batteriemanagementmodul zur Verfügung, das im Falle einer Batteriemessung angestoßen wird. Der HTTP-Client sendet zudem per POST Events wie eine Blutdruckmessung an den Webserver.

Zusätzlich kümmert sich die HTTP-Client Komponente im Photon um die Speicherung wichtiger Daten im EEPROM. So wird die ID+Token des Gerätes sowie die zuletzt empfangene IntervalAction im EEPROM gespeichert. Damit stehen dem Gerät diese Daten auch dann noch zur Verfügung, wenn es zuvor ausgeschaltet wurde und evtl. nach Wiedereinschalten keine Internet-Verbindung hat. Der HTTP-Client sorgt außerdem dafür, das bei einer fehlenden Verbindung zum Server (Server down, keine Wi-Fi Verbindung) das Programm dennoch ordnungsgemäß durchlaufen wird und zum Beispiel Intervallmessungen durchgeführt werden.

Empfangen und Senden von Daten

Für das Erstellen und Senden der HTTP-Requests wird die Bibliothek "HttpClient"[7] verwendet. Dieser kann die IP oder URL des anzufragenden Webservers, Header Daten, sowie GET Parameter (über die URL) und ein Body (String Objekt von Particle) übergeben werden. Aktionen werden zyklisch alle 2 Sekunden abgefragt. Da der Photon kein nutzbares Multithreading besitzt, kann sich die Abfrage verzögern, zum Beispiel durch eine laufende Blutdruckmessung. Dies sollte jedoch im Anwendungsfall tolerierbar sein.

Jede Ausführung von Aktionen wird vom Http-Client bestätigt. Dies geschieht entweder per POST an die "/actions" Adresse (bei einer IntervalAction, also einer Einstellungsänderung) oder direkt beim Senden eines Events (bei MeasurementAction oder BatteryStatusAction).

Zwischenspeicherung von Daten

Für den Fall eines Ausfalls der Wi-Fi Verbindung oder der Verbindung zum Server müssen Messdaten (die z.B. über eine IntervalAction ausgeführt werden) temporär zwischengespeichert werden. Dazu werden maximal 20 Events in einem Array gespeichert und erst dann gesammelt geschickt, sobald die Verbindung wieder besteht. Dies ist bei einem Langzeitblutdruckmessgerät unbedingt notwendig, da Patienten nicht immer in der Reichweite eines Wi-Fi Netzwerkes sind. Gerade im medizinischen Bereich ist es wichtig, dass die Daten in diesem Fall nicht verloren gehen.

Zeitmessung

Der HTTP-Client schickt immer den exakten Zeitstempel (Unixzeit) einer Eventausführung an den Webserver. Würde der Webserver lediglich die Zeit des Eventempfangs speichern, führt dies vor allem bei einer fehlenden Wi-Fi Verbindung zu großen Diskrepanzen. Dadurch können Angestellte keinen guten Überblick über die ausgeführten Messungen gewinnen. Die aktuelle Unixzeit wird durch den Photon Mikrocontroller bei bestehender Internetverbindung aus der Photon-Cloud abgefragt und wird so lange weitergezählt (auch ohne Internetverbindung) wie eine Batterie dem Photon Spannung liefert.

Löschen des Gerätes

Immer wenn der HTTP-Client eine Anfrage an den Server schickt, wird der Status Code der Antwort überprüft. Erhält er einen 401 Unauthorized Code wurde das Gerät offensichtlich gelöscht (oder noch nicht hinzugefügt). In diesem Fall werden alle gespeicherten Informationen (auch im EEPROM) gelöscht. Das Gerät versucht sich nun von neuem zu registrieren.

Messung

Die Messung erfolgt in drei Schritten:

  1. Aufpumpen bis 200 mmHg
  2. Erfassen des systolischen Druckes
  3. Erfassen des diastolischen Druckes

Messen des Druckes in mmHG

In diesem Abschnitt wird beschrieben wie der ADC Wert(V_\text{raw}) in einen Druckwert umgewandelt wird. Als erstes wird der ADC Raw Wert in Spannung umgewandelt(Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle V_\text{adc}} ). Anschließend wird die Spannung ausgerechnet, die vor der Diode herrscht (Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle V_\text{bd}} ). Danach wird mit Hilfe einer logistischen Formel die Spannung vor der Diode approximiert (Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle V_\text{ad}} ). Anschließend wird die Spannungsdifferenz des Sensors ausgerechnet(Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle V_\text{div}} ) und in Druck umgewandelt (Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle V_\text{KPa}} und Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle V_\text{mmHg}} ). Somit entspricht Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle 1 V \approx 92,8778 mmHg } vor der Diode.

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle \begin{align*} V_\text{adc} &= V_\text{raw} \cdot \frac{3.4}{2^{12}} \\ V_\text{bd} &= V_\text{adc} \cdot \frac{10}{3,29} \\ V_\text{ad} &= V_\text{bd} + (0,039 \cdot (\ln(V_\text{bd})+18,42068) - 0,355) \\ V_\text{div} &= \frac{V_\text{ad}}{201,8946} \\ V_\text{KPa} &= V_\text{div} \cdot \frac{50}{0,02} \\ V_\text{mmHg} &= V_\text{KPa} \cdot \frac{760}{101,325} \\ V_\text{mmHg}&\approx V_\text{ad} \cdot 92,8778 \\ \end{align*} }

Messvorgang

Beispiel Aufzeichnung einer Messung. In diesem Fall 130 zu 90

Nachdem das Aufpumpen erfolgt ist wird die Pumpe abgeschaltet und die Messung beginnt. Hierfür wird alle 1 ms die Spannung am AC Port gemessen. Am AC Port liegt der Herzschlag an. Der systolische Druck wird dann festgelegt wenn die Amplitude des Herzschlages einen gewissen Schwellwert überschreitet. Der diastolische Druck wird dann festgelegt wenn die Amplitude diesen Schwellwert wieder unterschreitet. Um sicherzustellen, dass es sich nicht um ein Messfehler handelt, muss der Wert zweimal unterschritten / überschritten werden. Falls der Druck in der Manschette kleiner wird als 20mmHG wird ein Fehler ausgelöst. Weiter wird ein Bereich um 0 V ignoriert da es dort zu einem "Flattern" kommt. Dieses "Flattern" ensteht durch das Entspannen der Blutendgefäße während der Pause.

Hier wird exemplarisch das Finden des systolischen Wertes gezeigt. Das Finden des diastolischen Wertes ist identisch, nur das nach einem geringeren Wert als MAX gesucht wird.

#define IS_IN_RANGE(x, a, b) (x >= a && x <= b)
#define MAX 4.0
#define X3_RANGE 1.5
#define MIN_DC 20.
static float calc_systolic(struct bpm *bpm) {
        float pressure = 0.;
        float tmp = getAC(bpm);
        float ac = getAC(bpm);;
        float dc = getDCPressure(bpm);
        bool rising = ac > tmp;
        bool found = false;
        do {
                delay(1);
                ac = getAC(bpm);
                dc = getDCPressure(bpm);
                if (!IS_IN_RANGE(ac, -X3_RANGE, X3_RANGE) && ac >= 0) {
                        if (rising) {
                                if (ac < tmp) {
                                        rising = false;
                                        if (tmp > MAX) {
                                                /* 
                                                 * Only exit if the second time above Threshold
                                                 */
                                                if (found) {
                                                        break;
                                                } else {
                                                        pressure = dc;
                                                }
                                                found = true;
                                        } else {
                                                found = false;
                                        }
                                }
                        } else {
                                if (ac > tmp) {
                                        rising = true;
                                }
                        }
                }
                tmp = ac; /* Save old value */
        } while(dc > MIN_DC);
        if (dc <= MIN_DC) {
                return -1;
        }
        return pressure;
}

Schaltplan

Der Schaltplan teilt sich in vier Abschnitte auf:

  1. Photon
  2. Stromversorgung
  3. Sensor Aufbereitung
  4. Aktor Ansteuerung

Der Schaltplan basiert auf einer Schaltung eines Projektes das an der Cornell Universität durchgeführt worden ist.[8]

Photon

Schaltplan des Photon Teiles

Der Photon ist der Hauptteil des Blutdruckmessgerätes. Er verarbeitet die Daten des Sensors und steuert die Pumpe und das Ventil.

Zusätzlich bekommt er über Spannungsteiler die Spannungen einzelner Batterie Zellen zur Verfügung gestellt. Darüber besteht die Möglichkeit eine Batterie Überwachung zu implementieren. Es wird eine Spannungsquelle mit 3 Batterie Zellen unterstützt und einer maximalen Eingangsspannung von 15 V.

Weiter befindet sich für Debug Zwecke ein ARM JTAG auf dem Board. Der JTAG Header ist hierbei in einer abgewandelten Form installiert. Auf Pin 17 und 19 befindet sich statt Ground UART TX und RX. So ist es möglich über einen Adapter am Debugger zusätzlich eine serielle Konsole zu betreiben.

Stromversorgung

Schaltplan der Stromversorgung

Die Stromversorgung teilt sich in zwei Bereiche auf.

  1. ein DCDC der eine stabile 5 V Spannung aus einer Eingangsspannung von 6 - 15 V macht.
  2. eine DCDC zur Generierung der Versorgungsspannung für den Sensor und die Sensor Aufbereitung.

Als DCDC wird in diesem Projekt PTN78000W der Firma TI verwendet. Dieser hat einen guten Wirkungsgrad von max 90 % und kann maximal Strom von 1.5 A liefern. Dieser versorgt alle Komponenten des Blutdruckmessgerätes mit ausreichend Strom.

Der absolute Maximalverbrauch der Schaltung ist in der nachfolgenden Tabelle zu erkennen. Als Grundlage für diese Tabelle wurden die Maximalstromverbrauchsangaben laut Datenblatt verwendet. Der Reelle Verbrauch beim Pumpen liegt bei ca. 400 mA.

Komponente Stromverbrauch
Photon 100,00 mA
Sensor 12,00 mA
Sensor Aufbereitung 11,16 mA
Pumpe 500,00 mA
Ventil 100,00 mA
Summe 723.16 mA

Um die Sensor Aufbereitung zu betreiben wurde neben einer Positiven Spannung von 5 V auch eine negative Spannung von - 5 V benötigt. Hierfür wurde ein weiter DCDC TMA0505D der Firma Traco verwendet. Hierbei handelt es sich um ein galvanisch getrennter DCDC der aus einer Eingangsspannung von 5 V eine stabilisierte +5 und -5 V Spannung erzeugt. Der DCDC liefert dann einen maximalen Strom von Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle \pm 100mA} . Um die Spannungsquelle weiter zu stabilisieren wurde insgesamt 7 Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle 100 \mu F} Kondensatoren an allen Spannungsversorgungspins angebracht.

Sensor Aufbereitung

Schaltplan der Sensor Aufbereitung

Die Sensor Aufbereitung wird in drei Phrasen unterteilt:

  1. Linearisieren der Spannungsdifferenz des Sensors von einer Differenz von max 20mV auf 0 - 5 V.
  2. Filtern des Signales durch zwei Bandfilter.
  3. Anpassung des Signales auf 0 - 3.3V

Die Linearisierung der Spannungsdifferenz wurde durch einen Instrumentenverstärker erreicht. Hierbei handelt es sich um eine besonders präzise Operationsverstärker-Schaltung mit sehr hochohmigen Eingängen. Hierfür wurde der Baustein AD620 verwendet. Der Verstärkungsfaktor (Gain) wurde mithilfe von Widerständen auf ca. 200 eingestellt. So einspricht 20mV Differenzspannung einer Spannung von etwa 4 V. Die maximale Sensor Differenz ist um die Hälfte geringer als im Datenblatt angegeben, da die Sensor Stromversorgung von den empfohlenen 10 V auf 5 V reduziert worden ist. Eine Senkung war erforderlich da sonst die Spannung am + und - Pin des Instrumentenverstärkers größer gewesen währe als 5V.

Das Signal wird dann durch eine Diode abgegriffen und durch einen aktiven Spannungsteiler an den Photon angeschlossen. Die Diode dient als Schutz vor möglicher negativer Spannung, da der STM32 des Photon maximal -0.4 V an den analogen Pins haben darf. Wenn diese Spannung überschritten wird ist es möglich das der Pin oder der gesamte Prozessor beschädigt wird.

Nach dem das Signal linearisiert ist wird es durch zwei Bandfilter gefiltert. Die Bandfilter sind wie folgt eingestellt:

Minimalfrequenz des ersten Bandfilters:

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle f_{\text{low}}=\frac{1}{2\pi\cdot 47\mu F \cdot 10k\Omega}\approx 0.3386 Hz}

Maximalfrequenz des ersten Bandfilters beträgt:

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle f_{\text{high}}=\frac{1}{2\pi\cdot 200nF \cdot 120k\Omega}\approx 6.6315 Hz}

Die Mittelband Verstärkung des ersten Bandfilters beträgt:

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle A=-\frac{120k\Omega}{10k\Omega}=-12}

Minimalfrequenz des zweiten Bandfilters:

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle f_{\text{low}}=\frac{1}{2\pi\cdot 47\mu F \cdot 10k\Omega}\approx 0.3386 Hz}

Maximalfrequenz des zweiten Bandfilters beträgt:

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle f_{\text{high}}=\frac{1}{2\pi\cdot 24nF \cdot 333k\Omega}\approx 19.9143 Hz}

Die Mittelband Verstärkung des zweiten Bandfilters beträgt:

Schaltplan der Aktor Ansteuerung

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle A=-\frac{333k\Omega}{10k\Omega}=-33.3}

Die gesamte Mittelband Verstärkung beider Bandfilter beträgt somit Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle (-12) \cdot (-33.3) = 399,5\overline{9}} .

Nach der Filterung wird das Signal über einen Kondensator ausgekoppelt und mithilfe eines Spannungsteiler wird die Spannung um 2.5 V angehoben um ein negatives Signal am Prozessor messen zu können. Danach wird es ebenfalls über eine Diode abgegriffen und durch einen aktiven Spannungsteiler auf eine Spannung von 0 - 3.3V gebracht und am Photon über ein ADC eingelesen.

Aktor Ansteuerung

Die Aktor Ansteuerung wird über 2 MOSFET realisiert die das Ventil und die Pumpe schalten.

Layout

Finales Platinenlayout
Bestückte Platine

Nach dem Erstellen des Schaltplanes wurde erst ein Test der Schaltung auf dem Breadboard durchgeführt und dann ein Platinenlayout erstellt.

Test

Getestet wurde die Schaltung auf einem Breadboard. Hier wurden einige Schaltungsfehler erkannt und behoben.

Das Problem bei dem Breadboard-Test war jedoch, dass die Widerstände und Kapazitäten durch das Breadboard verändert worden sind und somit auf eine echte Platine übertragen werden mussten.

Layouten

Nach dem Testen der Schaltung wurde die Platine gelayoutet. Hier wurden zwei Revisionen hergestellt. Das größte Problem in der ersten Revision war das beim Herstellen statt einem 0.8mm Borrer ein 1mm Borrer verwendet worden ist und somit die Pad Größe zu klein war um die Komponenten fest zu löten. Deswegen wurde eine zweite Version hergestellt um diese Einschränkung zu berücksichtigen.

Evaluation / Test

Das Projekt wurde in zwei Teilen getestet:

  1. Kommunikation zum Webserver über Dummy Geräte und Photon Mikrocontroller ohne Messkomponenten (dafür mit Stubs) und mit Messkomponenten.
  2. Prüfung der Messung gegen ein manuelles Blutdruckmessgerät.

Kommunikationstests

Um das webserverseitige Geräte- bzw. Photon-Interface auch ohne ein voll funktionsfähiges Wi-Fi Blutdruckmessgerät testen und zugleich für Demo-Zwecke mehrere Geräte registrieren zu können, wurden mit Python "Dummy WBPS" entwickelt. Diese verfügen über einen ähnlichen Funktionsumfang wie das "reale" WBPS und sprechen die gleiche Schnittstelle an.

Sobald ein Dummy Gerät registriert ist fragt es zyklisch die Events des Webservers ab und schickt seinerseits Event-Bestätigungen und weitere Daten an den Webserver. Werte wie Messwerte und Batteriestatus werden dabei zufällig generiert. Intern speichert das Dummy Gerät Daten in einer einfachen Text-Datei. Im Gegensatz zum HTTP-Client auf dem Photon Mikrocontroller speichert es keine Daten im Falle einer fehlenden Verbindung zum Server zwischen.

Daneben wurden für das Messungs- und Batteriemanagementmodul des Photon Mikrocontroller einfache Stubs entwickelt, die zufällige Werte generieren wenn keine Messkomponenten angeschlossen sind.

Sowohl die Kommunikation zwischen Webserver und Dummy Geräten als auch zwischen Webserver und dem Photon Mikrocontroller (mit und ohne Stubs) wurde über einen längeren Zeitraum getestet. Dazu wurden verschiedene Szenarien (Mehrmalige Registrierung und Löschung, Triggern mehrere gleichzeitiger Aktionen, Ausschalten des Apache Webservers, Trennen der Wi-Fi Verbindung,...) getestet. Der Test verlief ohne Fehler.

Messtests

Beispiel Aufzeichnung einer Messung. In diesem Fall 130 zu 90

Um die Blutdruckmessung testen zu können wurde als Referenz eine Manschette mit Stethoskop verwendet.

Um den Schwellwert festzulegen wurde eine Aufzeichnung der kompletten Messung erstellt und während der Automatischen Messung eine manuelle Messung an dem anderen Arm durchgeführt. Nach der Messung wurde dann ein Diagramm erstellt und nach dem Herzschlag Peak gesucht der am nächsten am korrekten Wert liegt. Die Werte wurden notiert und mehrmals überprüft.

Messfehler

Dioden Fehler

Während des Projektes wurden einige Messfehler enteckt und behoben.

Fehler durch Diode

Während des Projektes stellte sich heraus, dass der Messfehler, der durch die Dioden enstanden ist zu einer großen Abweichung in der Berechnung führt.

Im Rahmen des Projekts wurde deswegen die Dioden vermessen und eine Funktion angenähert um den Fehler durch diese auszugleichen.

Dies war erforderlich da bei einer Eingangsspannung von 1 V bereits ein Fehler von Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle \approx 33.75244 mmHg} aufgetreten ist.

Fehler durch ungenaue Widerstände

Ein weiterer Fehler entstand durch die Verwendung von ungenauen Widerstände(Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle \pm 10 %} Widerstände) bei den Spannungsteilern.

Beim AC Teil gab es eine Abweichung von +0,6 % und beim DC Teil eine von +2,8 %. Dies wurde durch genaues Ausmessen der Widerstände entsprechend korrigiert.

Fehler durch Manschette

Der einzige Fehler der nicht ausgeglichen werden konnte war das falsche Anbringen der Blutdruck-Manschette. Durch das falsche Anbringen der Manschette ensteht ein Fehler von Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle \approx \pm 20 mmHg} .

Fehler durch Bewegung

Weiter wurde festgestellt das eine Bewegung oder Berührung der Manschette die Messung stark beeinflusst. Fehler durch Bewegung oder Berührung können nicht ausgeglichen werden da sie die Messung des Herzschlages beeinflussen und so die Erkennung der Maxima stören.

Fehler durch falsch festgelegte Schwellwerte

Wie bereits erwähnt wird der systolische Druck und der diastolische Druck durch einen Schwellwert festgellt. Wie in dem Paper [9] beschrieben ist das Festlegen des Schwellwertes Probanden abhängig. Diese Feststellung konnte durch das Messen von verschiedenen Personen bestätigt werden.

  • 2 Probanten: Schwellwert bei 4.5 V
  • 3 Probanten: Schwellwert bei 4 V

Fehler durch zu geringes Aufpumpen

Weiter wurde beobachtet dass das zu geringe Aufpumpen zu Fehlern in der Messung führen kann. Dies ist durch die Eigenschaft der Bandfilter zu erklären. Durch das Abschalten der Pumpe kommt es kurzfristig zu einer starken Druckänderung die dazu führt, das einer der Bandfilter in den so genannten Sättinungsbereich kommt(ca. bei -5 oder +5V). Das Problem hierbei ist, das die Operatinosverärker dann eine gewisse Ruhephase brauchen um wieder auf Änderungen reagieren zu können.

Wenn nun der Druck nahe an dem korrekten Bereich ist gibt es starke Amplituden auf dem Signal. Dies führt zu einer zu starken Amplitude am Anfang die dann langsam abklingt um dann wieder anzusteigen. Der Algorithmus zu Erkennung des Blutdruckes geht davon aus das die Amplituden erstmal ansteigen und dann wieder abfallen. Ist dies nicht der Fall wird fälschlicherweise der Anstieg zu früh und der Abfall zu früh erkannt, was das dann zu Fehleinschätzungen des Blutdruckes führt.

Demo

Eine Demo des Projektes ist über http://wbps.cs.hs-rm.de zu erreichen. Der Apache Webserver läuft in einer virtuellen Maschine der Hochschule. Dort sind auch mehrere Dummy Blutdruckmessgeräte registriert die ebenso permanent in der VM laufen. Auf diesen lassen sich alle Funktionen eines realen Messgerätes testen.

Angestellter

Benutzername: employee Passwort: employee

Patienten

Benutzername: markus Passwort: markus

Benutzername: andreas Passwort: andreas

Geräte

MAC-Adresse: 20:c1:d2:e4:7d:a1 (Dummy, permanent laufend)

MAC-Adresse: 30:11:22:44:7d:e1 (Dummy, permanent laufend)

MAC-Adresse: 6c:0b:84:59:17:83 (Photon, ohne Messkomponenten, generiert zufällige Messwerte/Batteriestatus)

MAC-Adresse: 6c:0b:84:59:2a:9d (Photon, mit Messkomponenten)

Die Geräte können entfernt und über ihre MAC-Adresse erneut angemeldet werden. Falls das Gerät online ist, registriert es sich wieder. Bitte nur bei den permanent laufenden Geräten testen, da die "realen" selten eingeschaltet werden.

Der Patient "markus" wurde vor allem Dummy Geräten oder Photon Geräten ohne Messkomponenten zugeordnet und enthält daher sehr merkwürdige Messwerte. Der Patient "andreas" wurde ausschließlich dem Photon mit angeschlossenen Messkomponenten zugeordnet. Dieser verfügt demnach über die realen Messwerte (das gilt bis einschließlich 08.02.2016 15:54, falls der Patient danach einem virtuellen Gerät zugeordnet wird).

Benutzer können in der Demo nicht entfernt werden, damit insbesondere die Werte von "andreas" nicht verloren gehen.

Fazit und Ausblick

Fazit

Das Ziel des Projektes bestand darin, ein Blutdruckmessgerät internetfähig zu machen und über eine Webschnittstelle ansteuerbar zu machen. Dazu wurde der Particle Photon als Hauptkomponente des Messgerätes verwendet und außerdem Teile aus einem bestehenden Blutdruckmessgerät sowie eigens bestellte Komponenten verbaut. Der Webserver wiederum wurde mit dem Web-Framework Django erstellt.

Letztendlich ist das Projekt um einiges komplexer geworden als anfangs geplant. So bietet die Webschnittstelle viele Interaktionsmöglichkeiten, die anfangs nicht vorgesehen waren, sich aber im Gesamtkonzept als nötig dargestellt haben. Dazu gehört die Einrichtung einer Wi-Fi Verbindung sowie die Übersicht über bisher getätigte Aktionen. Daneben wurde ein erweiterbares Aktions- und Eventsystem implementiert. Auch die Messung wurde aufgrund mehrerer Fehlerfälle und wenigen widerverwertbaren Komponenten eines bestehenden Blutdruckmessgerätes erschwert.

Das Endergebnis zeigt aber, dass ein Wi-Fi Blutdruckmessgerät ein praktisches "Ding des Internets" für Patienten mit Bluthochdruck ist und im Zuge eines Semesters umgesetzt werden konnte. Über die Webschnittstelle können Geräte einfach verwaltet und Patientendaten gesammelt angezeigt werden. Ein manuelles Auslesen der Daten aus dem Gerät entfällt. Das hat zur Folge das schon frühzeitig mit der Auswertung der Daten begonnen und auf kritische Zustände reagiert werden kann. Außerdem lassen sich Einstellungen remote (im Normalfall mit Patientenabsprache) ändern. Da Patienten auch Zugriff auf die Webschnittstelle haben, können sie auf einfache Weise ein häufig benötigtes Protokoll führen und haben zudem auch für sich selbst eine Übersicht der bisher gemessenen Blutdruckwerte.

Ausblick

Aktion- und Eventtypen

Das System der Aktion- und Eventtypen bietet viele Erweiterungsmöglichkeiten. So könnte es um eine Aktion erweitert werden, welche eine Messung an mehreren durch den Benutzer eingestellten Daten zulässt (15.02 um 18 Uhr, 16.02 um 14 Uhr...). Des Weiteren kann es beispielsweise um eine Pulsmessung und die Messung anderer Körperfunktionen erweitert werden.

Serialisierung

Die Serialisierung der Aktion- und Eventtypen könnte in einer XML-Form stattfinden. Das hat den Vorteil eines gängigen Formates und einer guten Struktur bei komplexer werdenden Daten. Zudem könnten die Daten dadurch einfach über bereits existierende XML-Bibliotheken geparsed werden (z.B. libxml2 für C).

Sicherheit

Über das Messgerät werden zwar keine Passwortdaten von Benutzern ausgetauscht, dennoch kann die momentan fehlende Verschlüsselung von Daten ausgenutzt werden. So könnte man unter anderem über das Auslesen des Token falsche Messdaten an den Server liefern und Messungen eines Patienten ("Man-in-the-Middle") ausspähen. Aus diesem Grund ist es unbedingt notwendig, den Photon Mikrocontroller um einen HTTPS-Client zum Verschlüsseln der Daten zu erweitern.

Webschnittstelle

In der Webschnittstelle ist eine Funktion zum Hinzufügen eigener privater Blutdruckmessgeräte durch Patienten und die direkte Zuordnung zum hinzufügenden Patienten denkbar. Dadurch müssten Geräte nicht verliehen werden und der Patient kann sein eigenes Gerät benutzen, falls er bereits eines besitzt. Zudem könnten Patienten über eine Schnittstelle ihre eigenen Geräte verwalten, ohne von einer Organisation abhängig zu sein.

Deployment

Das aktuelle Konzept sieht vor, dass durch einen Anbieter in einer Datenbank mehrere Organisationen verwaltet werden. Dieser Anbieter vergibt Lizenzen an Organisationen und verkauft die Blutdruckmessgeräte. Als weiteres Konzept ist es denkbar, ein einfaches Deployment des Webservers in der unternehmenseigenen Infrastruktur zu ermöglichen (auch aus Datenschutzgründen). Dazu müsste über den Access Point noch die IP des Webservers änderbar sein.

Messung

Das Messverfahren könnte durchaus noch weiter verfeinert werden. Derzeit ist der maximale Druck auf dem aufgepumpt wird fest definiert. Es wäre durchaus möglich eine Erkennung zu entwickeln, die erkennt ob genügend aufgepumpt worden ist, indem man die ersten Amplituden analysiert, ob diese steigend oder fallend sind.

Weiter wäre es möglich eine automatische Patienten Kalibrierung vorzusehen. Man könnte eine Vergleichsmessung durch ein anderes Blutdruckmessgerät machen und dem Gerät per Weboberfläche zur Verfügung stellen. Dann führt das Messgerät eine Messungen durch um den Schwellwert zu ermitteln. Während der Evaluation wurde bereits festgestellt das bei einmaliger Kalibrierung auf einen Patienten immer ein gültiger Wert ermittelt werden könnte.

Um die Kosten der elektronischen Schaltung zu senken wäre es möglich durch ein höher auflösenden ADC zu verwenden und mit Hilfe von Signalanalyse Algorithmen die Filtrierung des Signales durchzuführen.

Quellen

  1. Bootstrap http://getbootstrap.com/
  2. Chart.js http://www.chartjs.org/
  3. jQuery https://jquery.com/
  4. softAP https://github.com/spark/softap-setup-js
  5. Django https://www.djangoproject.com/
  6. Photon Datasheet (v012) - Spark Labs https://docs.particle.io/datasheets/photon-datasheet/
  7. HttpClient https://github.com/nmattisson/HttpClient
  8. Portable Digital blood Pressure Monitor - W. Wattanapanitch, W. Suampun - https://courses.cit.cornell.edu/ee476/FinalProjects/s2005/ww56_ws62/Final%20Project%20Web/
  9. Digital Blood Pressure Meter - Freescale Semiconductor - Application Note - http://www.nxp.com/files/sensors/doc/app_note/AN1571.pdf