Talking Pi

gruppe7.jpg

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:

Bauteile:

*Hinweis: Bauteile als Fritzing nicht verfügbar, für Voicecard s. https://github.com/respeaker/seeed-voicecard

Code-Ausschnitte:

NFC.py
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
Ausgabe.sh
#!/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.