====== Talking Pi ======
{{gruppe7.jpg?400}}
==== Projekt Hintergrund (Implementierung verschiedener Peripheriegeräte): ====
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.
==== Projektbeschreibung: ====
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.
==== Strukturskizze: ====
{{strukturskizze.png}}
==== Bauteile: ====
{{bauteile.png?650}}
*Hinweis: Bauteile als Fritzing nicht verfügbar, für Voicecard s. https://github.com/respeaker/seeed-voicecard
==== Code-Ausschnitte: ====
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
==== Zukunftsperspektive des Projektes: ====
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.