In diesem Projekt soll die Möglichkeit geschaffen werden automatisiert Medikamente zu stellen. Diese sollen nicht mehr zeitaufwändig pro Tag in verschiedene Behälter gefüllt werden müssen sondern nur noch in die Fächer des Medikamentendosierer „Medibox“ gefüllt werden. Die Ausgabe erfolgt automatisiert und durch den vorher über die Webseite erstellten Einnahmeplan. In dem Webinterface werden der Medikamentenname, die Anzahl der Medikamente und die Einnahmezeitfenster eingegeben.
Im Rahmen des Projektes ist es möglich drei Medikamente in die Fächer der „Medibox“ zu hinterlegen. Eine Weboberfläche ermöglicht es die Anzahl sowie die Einnahmezeitfenster(Morgens,Mittags,Abends) zu hinterlegen. Die Fächer werden vor jedem Durchlauf geprüft, ob noch genügend Medikamente für die Ausgabe vorhanden sind. Falls ein Medikament nicht mehr ausreichend vorhanden ist wird die Ausgabe abgebrochen und der Nutzer via E-Mail informiert. Die Motoren werden dann in Ihre Ausgangsposition zurück.
Verwendete Komponenten:
Im Projekt verwendete Pakete:
Einrichtung des Webserver Apache:
Pakete auf neusten Standen bringen
Command: sudo apt-get update
Donwload und installation apache 2
Command: sudo apt-get install apache2
Ausführen:
Download und Installation
Command: apt-get install php7.0
Nach einem Neustart ist PHP 7 einsatzbereit
MySQL Pakete mit allen Abhängigkeiten installieren
Command: sudo apt-get install mysql-server php5-mysql mysql-client
Im nächsten Schritt Passwort vergeben und Bestätigen und anschließend neustarten
Der Webserver benötigt keine Verwaltung, aber zum Anzeigen und Testen der Datensätze ist Phpmyadmin sehr hilfreich.
Download und Installation der angegebenen Pakete
Command: sudo apt-get install php5-mysql libapache2-mod-auth-mysql phpmyadmin
Im weiteren Verlauf muss diese mehrfach bestätigt werden und ein Passwort gesetzt werden.
Anschließend muss Apache mit Phpmyadmin noch verknüpft werden: *Dazu muss die Datei (/etc/php5/apache2/php.ini*) bearbeitet werden
Command: sudo vi /etc/php5/apache2/php.ini
Am Ende der Datei wird folgenden eingefügt extension=mysql.so
Phpmyadmin ist nun unter: http://raspberrypi/phpmyadmin/ erreichbar
Nun können Dateien ins Verzeichnis /var/www hochgeladen werden und sind unter localhost/dateiname aus dem Netzwerk zu erreichen
LINK https://tutorials-raspberrypi.de/webserver-installation-apache2/
Nach der o.g. Einrichtung des Webservers können html-Dateien unter dem Pfad: /var/www/html/ abgelegt werden.
Die Weboberfläche ist html basiert. Die durch den Nutzer eingegebenen Werte werden an ein PHP-Skript (POST) übergeben Benutzereingaben übergeben und ausgeführt.
Hier werden u.a. feste Werte vergeben, um „mid“ (MotorID) das Medikament an ein Fach/Motor zu binden und „medcount“ (Medikamentcount) um den Startwert für das Zählen der Medikamente auf 1 zu setzen. Außerdem eine Selectbox zur Auswahl der Medikamentenanzahl.
<h3>1. Medikament eingeben</h3> <p> <input type="hidden" name="mid" value="1"> <input type="hidden" name="medcount" value="1"> <label for="name">Name: </label> <input name="name" id="name" type="text" size="35" maxlength="50" /> </p> <p> <label for="anzahl">Anzahl: </label> <select name=anzahl id="anzahl" > <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> </select>
Beispielcode: Prüfung, ob das Fach zum Medikament 1 leer ist, wenn Bedingung erfüllt ist werden die Funktionen ausgeführt u.a. E-Mail an Nutzer, Zurückstellen der Motoren ins Ausgangsposition und Abbruch des Skripts.
#pruefen ob das Medikament 1 voll ist def fach1voll(): cursor = connection.cursor() cursor.execute("SELECT anzahl,medcount from Medikament where mid=1") resultvoll = cursor.fetchall() cursor.close() for data in resultvoll: if data[0]== 1 and data[1]>=12: print("ERROR: Das Medikament 1 ist leer!!! ") zurueckstellen1() zurueckstellen2() zurueckstellen3() #updatemid() subprocess.call("./mail_1.sh", shell=True) GPIO.cleanup() sys.exit(0) elif data[0]== 2 and data[1]>=11:
Abfrage aus Datenbank, wie viele Medikamente ausgegeben wurden und entsprechend wird der Motor in die andere Richtung zurückgedreht
def zurueckstellen1(): cursor = connection.cursor() cursor.execute("SELECT medcount,anzahl from Medikament where mid=1") result4 = cursor.fetchall() cursor.close() for data in result4: if data[0]==2: RIGHT_1(100) elif data[0]==3: RIGHT_1(200) [...] elif data[0]==10: RIGHT_1(900) elif data[0]==11: RIGHT_1(1000) elif data[0]==12: RIGHT_1(1100)
Das Module „Schedule“ ermöglicht die Zeitsteuerung. Für das Projekt wurde in der Testphase ein kürzeres Intervall verwendet. Unter Realbedingungen würde die Ausgabe Morgens(8 Uhr), Mittags (12 Uhr) und Abends um ( 18 Uhr ) erfolgen. „Schedule“ wird über eine while-Schleife ausgeführt, der Job(z.B. morgens3) wird jeweils an die Funktion gehangen.
#verwendete Zeitsteuerung schedule.every(4).seconds.do(morgens3) #Zeitsteuerung unter Realbedingungen schedule.every().day.at("08:00").do(morgens3)
Funktion um zu schauen, ob für das erste Medikament eine Ausgabe erfolgen muss, außerdem die Prüfung wie viel Stück ausgegeben werden müssen.
def morgens1(): for data in result: if data[1]== 1 and data[2]== 1: cursor = connection.cursor() cursor.execute("update Medikament set medcount=medcount+1 WHERE mid=1") connection.commit() cursor.close() LEFT_1(100) print ("Morgens: 1.Medikament:" + data[0] + "Ein Stueck") elif data[1]== 2 and data[2]== 1: cursor = connection.cursor() cursor.execute("update Medikament set medcount=medcount+2 WHERE mid=1") connection.commit() cursor.close() LEFT_1(200) print ("Morgens: 1.Medikament:" + data[0] + "Zwei Stueck") elif data[1]== 3 and data[2]== 1: cursor = connection.cursor() cursor.execute("update Medikament set medcount=medcount+3 WHERE mid=1") connection.commit() cursor.close() LEFT_1(300) print ("Morgens: 1.Medikament:" + data[0] + "Drei Stueck") else: print ("1.Medikament" + data[0] + " Morgens keine Ausgabe") schedule.every(4).seconds.do(morgens1)
Das größte Problem war die Installation von dem Webserver Apache und der Integration von PHP. Trotz guter Anleitung hat dies viele Anläufe gebraucht um das System zu etablieren.
Nach erfolgreicher Integration gab es das Problem, dass das in der Installation vergebene Passwort für den MySql User nicht funktionierte. Nach langer Internetrecherche gab es einen Lösungsweg zum Zurücksetzen des Passworts: