Hey,
wir müssen im Zuge eines Projektes fürs Abitur eine Tor-Steuerung realisieren. Diese Steuerung soll über eine Website realisierbar sein und der Programm Code soll in Python sein. Das Tor wird durch die GPIO Schnittstelle eines Raspberry Pi 3 und Relais gesteuert. Generell sind wir Neulinge im Bereich Python und haben uns jetzt durch verschieden Online Inhalte in Python eingelesen. Die Steuerung mit Python ohne eine Website ist für uns nicht das Problem. Das haben wir grundlegend schon erledigt.
Meine Frage ist eigentlich: Welche ist die beste Möglichkeit Python Code auf eine Website zu bringen? Kann man das über Shell/Bash Optionen in PHP erledigen oder kann man ein Web-Framework benutzen und wenn ja welches (Django, Flask, TurboGears2 etc.)? Und zusätzlich noch gibt es irgendwo ein gute Anleitung oder ähnliche Template die wir nur verändern müssten.
Wir würden uns über ein bisschen Hilfe freuen.
Wir wollen keine vollständigen Code nur eine Idee mit Linux und Websites an sich kennen wir uns besser aus als mit Python, wie gesagt Neueinsteiger :K
Steuerung eines Tores über ein Python code benutzedes Webinterface - Schulprojekt
- noisefloor
- User
- Beiträge: 3942
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
das ganze funktioniert (Iogischerweise) immer nach dem Server-Client-Prinzip. Heißt: auf der Webseite läuft kein Python (geht technisch auch nicht wirklich), sondern im einfachen Fall nur HTML.
Ein einfache Umsetzung wäre, dass auf der Webseite ein Formular ist, welches nur aus einer Schaltfläche besteht. Beim Klick darauf sendet die Webseite eine POST-Request an den Server (in eurem Fall läuft der auch auf dem Raspi), der daraufhin den Code für das Relais zum Öffen oder Schließen des Tor ausführt. Fertig.
Als Framework könnt ihr Bottle oder Flask nehmen, alle Django etc. kann viel mehr - braucht ihr alles nicht. In der Doku von Bottle und Flask findet ihr auch Beispiele zum Umgang mit POST-Requests.
Theoretisch kannst du auch über PHP ein Python-Skript ausführen - aber PHP und Python spielen nicht gut zusammen, alles in Python ist IMHO deutlich stressfreier.
BTW: ist da Abitur für dieses Jahr nicht vorbei? Oder ist das schon für 2019?
Gruß, noisefloor
das ganze funktioniert (Iogischerweise) immer nach dem Server-Client-Prinzip. Heißt: auf der Webseite läuft kein Python (geht technisch auch nicht wirklich), sondern im einfachen Fall nur HTML.
Ein einfache Umsetzung wäre, dass auf der Webseite ein Formular ist, welches nur aus einer Schaltfläche besteht. Beim Klick darauf sendet die Webseite eine POST-Request an den Server (in eurem Fall läuft der auch auf dem Raspi), der daraufhin den Code für das Relais zum Öffen oder Schließen des Tor ausführt. Fertig.
Als Framework könnt ihr Bottle oder Flask nehmen, alle Django etc. kann viel mehr - braucht ihr alles nicht. In der Doku von Bottle und Flask findet ihr auch Beispiele zum Umgang mit POST-Requests.
Theoretisch kannst du auch über PHP ein Python-Skript ausführen - aber PHP und Python spielen nicht gut zusammen, alles in Python ist IMHO deutlich stressfreier.
BTW: ist da Abitur für dieses Jahr nicht vorbei? Oder ist das schon für 2019?
Gruß, noisefloor
Erstmal vielen Dank für die schnelle Antwort.
Ich hab mich in der letzten Woche in ein paar Frameworks eingelesen bzw reingescnuppert und hab mir schon gedacht das Django für unser Vorhaben zu komplex ist. Wie das Server-Client Prinzip funktioniert etc weiß ich auch. Ich wollte lieber mal nachfragen bevor ich jetzt unnötig viel mache.
Dieses Projekt ist der Ersatz für ein Seminarfach. Wir sind in der 12 Klasse eines Gymnasiums und machen das Abitur mit technischen Schwerpunkt. Heißt P1 Informatik, P2 Mathe etc. Das Projekt ist schon für das Abitur 2019 und noch etwas weitreichender als hier beschrieben. Ich werde mir aber Bottle und Flask angucken.
Grüße
Ich hab mich in der letzten Woche in ein paar Frameworks eingelesen bzw reingescnuppert und hab mir schon gedacht das Django für unser Vorhaben zu komplex ist. Wie das Server-Client Prinzip funktioniert etc weiß ich auch. Ich wollte lieber mal nachfragen bevor ich jetzt unnötig viel mache.
Dieses Projekt ist der Ersatz für ein Seminarfach. Wir sind in der 12 Klasse eines Gymnasiums und machen das Abitur mit technischen Schwerpunkt. Heißt P1 Informatik, P2 Mathe etc. Das Projekt ist schon für das Abitur 2019 und noch etwas weitreichender als hier beschrieben. Ich werde mir aber Bottle und Flask angucken.
Grüße
- DeaD_EyE
- User
- Beiträge: 1127
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Ich hatte mal vor einiger Zeit ein Beispiel fuer flask gemacht.
https://pastebin.com/DNCTcw2z
Im web würde ich es nicht betreiben, da kein login benötigt wird. Das ließe sich ja erweitern.
Es fehlt auch die Möglichkeit die Aktion zu stoppen. Ein Tor, dass Menschen einquetschen kann, würde ich damit nicht betreiben.
Den thread nutze ich um die relais wieder auszuscahlten, ohne dabei den Webserver zu blockieren. Normalerweise würde man den code fuer hardware und software trennen.
Habt ihr schon ein Tor? Stellt euch die Schule Mittel zur Verfügung?
Edit: Lichtschranken/Endschalter werden nicht abgefragt. Bei Aktoren sind Timer niemals eine eine Lösung. Ein Pneumatikzylinder fährt z.B. langsamer aus, wenn der Druck niedriger wird (Kompressor leer). Würden dann andere Prozesse einfach starten ohne Rücksicht auf die Realität (position des zylinders) können halt Sachen zerstört oder sogar Persinen verletzt werden.
In der Regel hat eine Torsteuerung Lichtschranken, ggf. Gummilippe mit Sicherheitsschalter, Not-Halt Taster, drei normale Taster (Auf/Ab/Stop) und ggf. einen Schlüsselscahlter. Wenn es ein mini-tor ist, dass man auf den Tisch stellen kann, ist es von den Kosten her ertragbar. Keine Ahnung ob ich hier Werbung machen kann.
https://pastebin.com/DNCTcw2z
Im web würde ich es nicht betreiben, da kein login benötigt wird. Das ließe sich ja erweitern.
Es fehlt auch die Möglichkeit die Aktion zu stoppen. Ein Tor, dass Menschen einquetschen kann, würde ich damit nicht betreiben.
Den thread nutze ich um die relais wieder auszuscahlten, ohne dabei den Webserver zu blockieren. Normalerweise würde man den code fuer hardware und software trennen.
Habt ihr schon ein Tor? Stellt euch die Schule Mittel zur Verfügung?
Edit: Lichtschranken/Endschalter werden nicht abgefragt. Bei Aktoren sind Timer niemals eine eine Lösung. Ein Pneumatikzylinder fährt z.B. langsamer aus, wenn der Druck niedriger wird (Kompressor leer). Würden dann andere Prozesse einfach starten ohne Rücksicht auf die Realität (position des zylinders) können halt Sachen zerstört oder sogar Persinen verletzt werden.
In der Regel hat eine Torsteuerung Lichtschranken, ggf. Gummilippe mit Sicherheitsschalter, Not-Halt Taster, drei normale Taster (Auf/Ab/Stop) und ggf. einen Schlüsselscahlter. Wenn es ein mini-tor ist, dass man auf den Tisch stellen kann, ist es von den Kosten her ertragbar. Keine Ahnung ob ich hier Werbung machen kann.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
@DeaD_EyE: die Kombination aus globaler Variable `door` und ContextManager ist sehr komisch. `setmode` setzt einen globalen Zustand, sollte also nur global am Anfang des Skripts gesetzt werden. Kommunikation zwischen Hauptprogramm und Thread muß immer über spezielle Objekte stattfinden, hier Semaphore oder Du benutzt gleich nur einen Timer. Klarer wäre für mich ein dauernd laufender Thread, der über eine Queue mit den Routes kommuniziert, dann könnte man auch einfach mehrere open/close-Kommands ohne Fehlermeldung absetzen.
Danke für die Hilfestellung, den Code für das Tor kriegen wir denke ich alleine hin. Unsere Schule stellt Mittel bereit auch für sachen die neu bestellt werden müssen, bzw. schon bestellt wurden. Ich füge mal Bilder an, um euch genauer zu zeigen um was es geht. Das Tor ist noch von einem früheren projekt einer anderen Gruppe, diese wurde mit einer Siemens SPS S7 betrieben und wir machen das nun mit einem Raspi
Das Tor
Unsere generelle Idee der Lösung (Teile sind mittlerweile alle verbaut und realisiert und Betrieb über Console + Py Code funktioniert)
Diese Vorschau hat noch viele Fehler die bereits ausgemerzt wurden.
Das Tor
Unsere generelle Idee der Lösung (Teile sind mittlerweile alle verbaut und realisiert und Betrieb über Console + Py Code funktioniert)
Diese Vorschau hat noch viele Fehler die bereits ausgemerzt wurden.
- DeaD_EyE
- User
- Beiträge: 1127
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Stimmt. Sieht auch komisch aus und door ist vom Himmel gefallen.Sirius3 hat geschrieben:@DeaD_EyE: die Kombination aus globaler Variable `door` und ContextManager ist sehr komisch.
Man kann Flask objekte an app.config übergben.
Code: Alles auswählen
app.config['door'] = door
Ja und am besten nicht im gleichen Prozess. Kein Threading, Multiprocessing.Sirius3 hat geschrieben:`setmode` setzt einen globalen Zustand, sollte also nur global am Anfang des Skripts gesetzt werden.
In einem aktuellen Projekt nutze ich multiprocessing.Process und unterschiedliche Module zu starten, die über mehrere message queues miteinander kommunizieren. Daneben wird noch ein namespace mit mehreren dicts jedem Process zur Verfügung gestellt, um den aktuellen Status zu teilen bzw. um dynamisch Konfigurationsänderungen vorzunehmen und ggf. die Prozesse neu zu starten. Kommuniziert wird über zmq. Das würde ich jetzt aber nicht unbedingt einem Anfänger empfehlen.Sirius3 hat geschrieben:Kommunikation zwischen Hauptprogramm und Thread muß immer über spezielle Objekte stattfinden, hier Semaphore oder Du benutzt gleich nur einen Timer. Klarer wäre für mich ein dauernd laufender Thread, der über eine Queue mit den Routes kommuniziert, dann könnte man auch einfach mehrere open/close-Kommands ohne Fehlermeldung absetzen.
Queues wären Sinvoll. Man sollte wirklich den Teil des Webservers auslagern in eigenen Code und über queues kommunizieren. Ein manager Prozess kann die beiden Prozesse starten (Hardware, Webserver).
Code: Alles auswählen
import multiprocessing as mp
# Webservercode ausgelagert
from webserver import app
def do_something(cmd):
pass
def doorcode(queue):
while True:
command = queue.get() # hier blockiert er solange die queue leer ist.
do_something(command) # hier soll irgendwas geschaltet werden
manager = mp.Manager()
queue = manager.Queue()
app.config['queue'] = queue
webserver = mp.Process(target=app.run, kwargs={'host': '0.0.0.0', 'port': 5000})
webserver.start()
doorserver = mp.Process(target=doocode, args=[queue])
doorserver.start()
# ab hier müssten 4 Prozesse laufen.
# 1. Der aktuelle Code
# 2. Der Manager läuft in einem eigenen Prozess.
# 3. Webserver hat die queue in app.config['queue']
# 4. doorcode hat ebenso die Queue
app.run() startet die Eventloop des Webservers. Der Webserver gibt dann die Befehle an die queue weiter.
queue.put('befehl')
Auf der anderen Seite arbeitet der doorcode Process die Befehle ab.
Die Automatisierung ist das größere Problem.
Mit einer S7 wäre es ziemlich einfach.
Funktionen wie Start/Stop/Not-Halt/Quittieren sind mit zwei Bausteinen erledigt. Ein Flipflop mit Setzdominaz für den Not-Halt und eins für den Betrieb Automatik. Damit wären dann die oberen Funktionen erledigt. Dann nochmal zwei Bausteine für Linkslauf und Rechtslauf.
Hingegen ist es mit Python etwas anders. Wenn ich mir den Programmcode zum Ansteuern des Tors vor meinem geistigen Auge so vorstelle, sehe ich einmal Callbacks und Klassen. Die Callbacks (Interruptsteuerung, geht mit der Library) rufen die abstrahierten Methoden auf und ändern die Attribute in dem Objekt und steuern die Ausgänge. Abstrahiert in dem Sinne, dass die Lichtschranke die Methode stop() aufruft. Intern müsste dann der state auf Stop geändert werden, Antriebe deaktivieren und die Ausgänge für die Lampen setzen.
Ich muss jetzt mal so langsam Schluss machen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
@TDebo: Die Torsteuerung ist ein sehr schönes Projekt. Neben den genannten kleinen Frameworks bottle und Flask, fliegt CherryPy ein wenig unter dem Radar.
Die Entwicklung von bottle wurde übrigens hier im Forum vom Autor vorgestellt und diskutiert; Flask war namentlich eine Anspielung auf bottle und auch eine Reaktion darauf, was zu leichten Animositäten führte. (Beide Autoren sind hier im Forum z.Z. aber nicht mehr aktiv).
CherryPy ist älter als die beiden oben genannten Projekte. Das ist kein Nachteil, denn mit der Zeit können viele Bugs gefunden und behoben werden. Für Anwendungen die durch CherryPy abgedeckt werden können, ist dieses Framework immer eine gute Empfehlung. Vielleicht wollt ihr euch das auch einmal ansehen.
Die Entwicklung von bottle wurde übrigens hier im Forum vom Autor vorgestellt und diskutiert; Flask war namentlich eine Anspielung auf bottle und auch eine Reaktion darauf, was zu leichten Animositäten führte. (Beide Autoren sind hier im Forum z.Z. aber nicht mehr aktiv).
CherryPy ist älter als die beiden oben genannten Projekte. Das ist kein Nachteil, denn mit der Zeit können viele Bugs gefunden und behoben werden. Für Anwendungen die durch CherryPy abgedeckt werden können, ist dieses Framework immer eine gute Empfehlung. Vielleicht wollt ihr euch das auch einmal ansehen.
Leider wird nicht gesagt, welcher Webserver eingesetzt werden soll.
(Die meisten Frameworks bringen einen kleinen Webserver für die einfache Entwicklung mit; das würde auch schon reichen. Da kann man alles einbauen, auch Authentifizierung und dergleichen.)
Und der Vollständigkeit halber:
Man kann über das ordinäre cgi (CommonGatewayInterface) vom Webserver das Pythonscript auch direkt aufrufen.
Ganz ohne jeden Schnickschnack. Letztlich tut ein echter Webserver auch nichts anderes. Nur dass dort dann halt meist spezielle CGI Server, wie uwsgi eingesetzt werden. Bei PHP wird dannn halt ein CGI spezialisiert auf PHP aufgerufen, wofür auch verschiedene zur Auswahl stehen.
Daraus wird klar, dass ihr auch ein BASH Script via CGI einfach aufrufen könnt.
Ist zwar sicherheitstechnisch eine reine Katastrophe, aber es geht.
Wenn man in Kauf nimmt, Leute mit der Garagentür zu erdrücken, kommt es auf ein Loch im Webserver auch nicht mehr an.
(Die meisten Frameworks bringen einen kleinen Webserver für die einfache Entwicklung mit; das würde auch schon reichen. Da kann man alles einbauen, auch Authentifizierung und dergleichen.)
Und der Vollständigkeit halber:
Man kann über das ordinäre cgi (CommonGatewayInterface) vom Webserver das Pythonscript auch direkt aufrufen.
Ganz ohne jeden Schnickschnack. Letztlich tut ein echter Webserver auch nichts anderes. Nur dass dort dann halt meist spezielle CGI Server, wie uwsgi eingesetzt werden. Bei PHP wird dannn halt ein CGI spezialisiert auf PHP aufgerufen, wofür auch verschiedene zur Auswahl stehen.
Daraus wird klar, dass ihr auch ein BASH Script via CGI einfach aufrufen könnt.
Ist zwar sicherheitstechnisch eine reine Katastrophe, aber es geht.
Wenn man in Kauf nimmt, Leute mit der Garagentür zu erdrücken, kommt es auf ein Loch im Webserver auch nicht mehr an.
@IHack: es gibt wesentliche Unterschiede zwischen CGI und anderen Kommunikationsmethoden mit einem Webserver, die Du jetzt alle durcheinander in einen Topf geschmissen hast. Wie jetzt irgendeine Methode oder Programmiersprache Auswirkungen auf die Sicherheit hat, mußt Du mir noch erklären.
- noisefloor
- User
- Beiträge: 3942
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
also man man nicht hochgradig masochistisch verlagt ist (oder man aus technischen Gründen dazu gezwungen ist), weil man seit ca. 9 Jahren kein CGI mehr für Python und Webprogammierung einsetzen, sondern ein WSGI-basiertes Framework wie Bottle oder Flask oder ...
Gruß, noisefloor
also man man nicht hochgradig masochistisch verlagt ist (oder man aus technischen Gründen dazu gezwungen ist), weil man seit ca. 9 Jahren kein CGI mehr für Python und Webprogammierung einsetzen, sondern ein WSGI-basiertes Framework wie Bottle oder Flask oder ...
Braucht man ja auch nicht wirklich, ein WSGI-Applikationsserver wie Gunicorn würde wohl reichen.Leider wird nicht gesagt, welcher Webserver eingesetzt werden soll.
Gruß, noisefloor
Die Ansteuerung von GPIOs/I2C/SPI Geraeten ist notorisch doof wenn man immer nur auf ein HTTP-Request warten kann/muss, und einem
auch noch der Prozess-Zustand vom Apache nach Gusto weggebombt wird. Oder auch die oft wichtigen zeitgesteuerten Aktionen keine Heimstatt finden. Darauf verlassen, dass da ein timer-gesteuertes AJAX-Request eintrudelt sollte man jedenfalls nicht.
Darum wuerde ich das immer mit einer Standalone Applikation machen. Dieses System muss ja nun nicht 10000de konkurrierende Verbindungen zur Kontrolle einer einzelnen geteilten Resource "Garagentor" abhandeln...
Die Alternative waere sonst eine Kontrollanwendung und ein IPC Mechanismus des Vertrauens - aber das ist etwas viel Komplexitaet fuer so ein Problem.
auch noch der Prozess-Zustand vom Apache nach Gusto weggebombt wird. Oder auch die oft wichtigen zeitgesteuerten Aktionen keine Heimstatt finden. Darauf verlassen, dass da ein timer-gesteuertes AJAX-Request eintrudelt sollte man jedenfalls nicht.
Darum wuerde ich das immer mit einer Standalone Applikation machen. Dieses System muss ja nun nicht 10000de konkurrierende Verbindungen zur Kontrolle einer einzelnen geteilten Resource "Garagentor" abhandeln...
Die Alternative waere sonst eine Kontrollanwendung und ein IPC Mechanismus des Vertrauens - aber das ist etwas viel Komplexitaet fuer so ein Problem.