Als erstes Peripheriegerät stellt das NFC Shield (Near Field Communication), ein auf der RFID-Technik basierender Übertragungsstandard zum kontaktlosen auslesen von NFC-Karten - die einzigartig durch UID oder Key zu zuordnen sind - eine intelligente und (zeitlich) effiziente Lösung zur Identifikation und Authentifikation von Personen dar. Dies ist besonders im Gesundheitswesen von Bedeutung und kann den Schutz der hoch sensiblen personenbezogenen Daten, sowie darüber hinaus die Dokumentationspflicht unterstützen. Hinzukommend als zweites Peripheriegerät bietet die Komponente Spracherkennung zukunftsorientiert sowie ausbaubar die Chance GUI's abzulösen. Die Form des Sprachassistenten kann dabei helfen, die Erstellung von medizinischen Dokumenten zu erleichtern, sowie kongruent den Arbeitsaufwand für die medizinischen Akteure dadurch zu reduzieren.
So soll für einen (fiktiven) Medikamentenschrank die Authentifizierung für 3 verschiedene Personengruppen innerhalb eines Klinikums (Chefarzt, Krankenschwester, FSJ’ler) mittels NFC-Komponente und einhergehender Authentifikation via UID stattfinden. Nach erfolgreichem Access der Karte wird die Auswahlmöglichkeit eröffnet, entweder die Sprachsteuerung (automatisch) zu starten oder durch Betätigung des dritten Peripheriegeräts, dem Button, das Dokument der (gespeicherten) vorherigen Entnahmen zu öffnen. Wird der Button nicht betätigt, so startet der Sprachassistent nach einem 5 Sekunden Countdown autonom und die Entnahme kann im Syntax von Medikamentenname, Menge, Einheit für einen zuvor eingesprochenen (via Mathlab, FB03), maßgeschneiderten Wortschatz erfolgen. Darauf folgend wird anhand der anfänglichen UID Zuordnung das entsprechende Schnittstellendokument zur Übersicht sowie Kontrolle der protokollierten Entnahme geöffnet.
*Hinweis: Bauteile als Fritzing nicht verfügbar, für Voicecard s. https://github.com/respeaker/seeed-voicecard
import RPi.GPIO as GPIO import MFRC522 #Import der Bibliothek MFRC readers/writers from subprocess import Popen #Import des Subprozessmoduls Popen, um externe Programme/Dateien aufzurufen oder gar zuverbinden import time #Import Zeitmodul z.B. für sleepmodus import signal #Import um GPIOS anzusteuern # Erfassen v. SIGINT(=Signale die den Prozess beenden) für Bereinigung, wenn das Skript abgebrochen wird def end_read(signal,frame): #Definition Struktur die Signal und Frame enthaelt global continue_reading #ueberall verfuegbar nicht nur in d. Schleife continue_reading = False GPIO.cleanup() #Aufräumen der GPIOS GPIO.setmode (GPIO.BOARD) GPIO.setup(40, GPIO.IN,pull_up_down=GPIO.PUD_UP) #Button GPIO Zuweisung mit Pullup-Widerstand (gegen + 3,3 V) zaehler=0 #Initialisierung für 5 Sek. Countdown uid="100, 100, 100, 100, 100" #Variable die das Array enthaelt (UIDs sind 3 stellig) # Hook the SIGINT signal.signal(signal.SIGINT, end_read) #interaktives Warnignal dass das (Ein)Lesen beendet MIFAREReader = MFRC522.MFRC522() #Kreiert eine Objekt aus der Klasse MFRC522 keinesprache= 0 #Button wurde gedrueck, es wird keine Spacherkennung gestartet erkannt = 0 #Variable fuer die Endlosschleife fuer die Erkennung der Karte fertig = 0 #Zeit wird aufgenommen und die 5 Sek. laufen t0 = 0 #Zeitstempel fuer Startzeit t1 = 0 #Zeitstempel fuer Endzeit typ = 0 #Typ 1=Chefarzt, Typ 2=KSW, Typ 3=FSJler while erkannt==0: #Kopfgesteuerte Whileschleife global continue_reading #Erhalte die UID der Karte (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL) #Antikollisions f. Schleife print "Card read UID: %s,%s,%s,%s" % (uid[0], uid[1], uid[2], uid[3]) #Ausgabe Array %s Syntax um String Ausgabe #Wenn UID erkannt: if status ==MIFAREReader.MI_OK: print "Karte erkannt" (status,uid) = MIFAREReader.MFRC522_Anticoll() #Zur Antikollision print uid print "uid0 ist %s " %(uid[0]) #gib die UID aus if uid[0] == 230 and uid[1] == 209 and uid[2] == 192 and uid[3] == 50 and fertig == 0: #wenn UID der 230, 209, .. entspricht dann starte oben def. Countdown fertig = 1 #siehe oben Zeitstempel nur einmal nehmen typ = 1 #mit zugewiese Karte Chefarzt weitermachen t0=time.time() #gibt aktuelle Zeit aus elif uid[0] == 136 and uid[1] == 4 and uid [2] ==139 and uid[3] == 94 and uid[4] ==89 and fertig == 0: fertig = 1 typ = 2 t0=time.time() elif uid[0] == 211 and uid[1] == 206 and uid[2] == 150 and uid[3] == 1 and uid[4] == 138 and fertig == 0: fertig = 1 typ = 3 t0=time.time() else: print "ACCESS DENIED - Fehlende Genehmigung fuer Ihre Karte" t1 = time.time() #wenn Knopf nicht gedrueckt wurde. if t1-t0 > 5 and fertig == 1 and keinesprache == 0: #Countdown wird heruntergezählt print "zeit abgelaufen" erkannt = 1 if typ == 1: print "Willkommen Herr Chefarzt" Popen(["/home/pi/Desktop/Client/client_0318/client_Chefarzt.sh"]) #Funktion zum GPIO XY auf 1 setzen, somit Aktivierung der Spracherkennung Popen("/usr/bin/leafpad /home/pi/NFC/Ausgabe_Chefarzt.txt",shell=True) #Aufrufparameter Subprocess-Methode: Code durch die Shell ausführen -> Prozess wird direkt gestartet if typ == 2: print "Willkommen Frau Krankenschwester" Popen(["/home/pi/Desktop/Client/client_0318/client_Krankenschwester.sh"]) Popen("/usr/bin/leafpad /home/pi/NFC/Ausgabe_Krankenschwester.txt",shell=True) if typ == 3: print "Willkommen FSJler" Popen(["/home/pi/Desktop/Client/client_0318/client_FSJler.sh"]) Popen("/usr/bin/leafpad /home/pi/NFC/Ausgabe_FSJler.txt",shell=True) typ = 0 #Abfrage Button wenn Knopf gedrueckt wurde if (GPIO.input(40)==0): time.sleep(0.1) #Abfrage des Buttons if typ == 1: keinesprache = 1 Popen("/usr/bin/leafpad /home/pi/NFC/Ausgabe_Chefarzt.txt",shell=True) #Ausfuehren Shell damit Parameter moeglich sind if typ == 2: keinesprache = 1 Popen("/usr/bin/leafpad /home/pi/NFC/Ausgabe_Krankenschwester.txt",shell=True) if typ == 3: keinesprache = 1 Popen("/usr/bin/leafpad /home/pi/NFC/Ausgabe_FSJler.txt",shell=True) print "T0" + str(t0) + " " + " T1" + str(t1) + " Diff " + str(t1-t0) #Zeitgeber Start; aktuell; Differenz T0=Start to wird in String konvertiert und somit ausgegeben time.sleep(0.5) #Führt die komplette Schleife jede halbe Sek. aus
#!/bin/bash while [ 1 ] do if [ -s /home/pi/Desktop/Chefarzt ] then echo "$(cat /home/pi/Desktop/Chefarzt)" >> Ausgabe_Chefarzt.txt echo "$(date '+%A %d %m %Y %X')" >> Ausgabe_Chefarzt.txt echo "" >> Ausgabe_Chefarzt.txt rm -f /home/pi/Desktop/Chefarzt touch /home/pi/Desktop/Chefarzt elif [ -s /home/pi/Desktop/Krankenschwester ] then echo "$(cat /home/pi/Desktop/Krankenschwester)" >> Ausgabe_Krankenschwester.txt echo "$(date '+%A %d %m %Y %X')" >> Ausgabe_Krankenschwester.txt echo "" >> Ausgabe_Krankenschwester.txt rm -f /home/pi/Desktop/Krankenschwester touch /home/pi/Desktop/Krankenschwester elif [ -s /home/pi/Desktop/FSJler ] then echo "$(cat /home/pi/Desktop/FSJler)" >> Ausgabe_FSJler.txt echo "$(date '+%A %d %m %Y %X')" >> Ausgabe_FSJler.txt echo "" >> Ausgabe_FSJler.txt rm -f /home/pi/Desktop/FSJler touch /home/pi/Desktop/FSJler else sleep 10 fi done
Das erarbeitete Projekt stellt einen Prototyp mit viel Ausbaupotenzial dar. Der erste Schritt der Erweiterung wäre einen automatisierten Server und Client Start im selben Netzwerk zu realisieren. Aufbauend auf der bestehenden Authentifikation mittels UID würde logisch die Integration von erweiterten rollen- und regelbasierten Zugriffskonzepten (RbAC), die das Workflow Management unterstützen und in bestehende Systeme integrierbar sind, folgen. Dies ist durch die Erstellung des individuellen Wortschatzes für verschiedene Abteilungen / Szenarien im Gesundheitswesen implementierbar. Im Rahmen des (technologischen) Fortschrittsgedanken animiert durch den Ausbau einer digitalisierten Gesundheitsversorgung trägt es dazu bei, den digitalen Informationsfluss, z. B. durch die patientenbezogene Informationshinterlegung innerhalb EPRs, zu unterstützen.