Steuerung eines Tores über ein Python code benutzedes Webinterface - Schulprojekt

Django, Flask, Bottle, WSGI, CGI…
Antworten
TDebo
User
Beiträge: 3
Registriert: Mittwoch 14. März 2018, 10:37
Wohnort: Aachen

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 :wink: :K
Benutzeravatar
noisefloor
User
Beiträge: 3843
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
TDebo
User
Beiträge: 3
Registriert: Mittwoch 14. März 2018, 10:37
Wohnort: Aachen

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 :)
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
TDebo
User
Beiträge: 3
Registriert: Mittwoch 14. März 2018, 10:37
Wohnort: Aachen

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 :D

Das Tor
Bild

Unsere generelle Idee der Lösung (Teile sind mittlerweile alle verbaut und realisiert und Betrieb über Console + Py Code funktioniert)
Bild
Diese Vorschau hat noch viele Fehler die bereits ausgemerzt wurden.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Sirius3 hat geschrieben:@DeaD_EyE: die Kombination aus globaler Variable `door` und ContextManager ist sehr komisch.
Stimmt. Sieht auch komisch aus und door ist vom Himmel gefallen.
Man kann Flask objekte an app.config übergben.

Code: Alles auswählen

app.config['door'] = door
Sirius3 hat geschrieben:`setmode` setzt einen globalen Zustand, sollte also nur global am Anfang des Skripts gesetzt werden.
Ja und am besten nicht im gleichen Prozess. Kein Threading, Multiprocessing.
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.
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.

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
Würde man dem Beispiel folgen, müsste es die Datei webserver.py geben, in der es das objekt app gibt.
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
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@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.
IHack
User
Beiträge: 14
Registriert: Dienstag 13. März 2018, 11:17

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.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
noisefloor
User
Beiträge: 3843
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 ...
Leider wird nicht gesagt, welcher Webserver eingesetzt werden soll.
Braucht man ja auch nicht wirklich, ein WSGI-Applikationsserver wie Gunicorn würde wohl reichen.

Gruß, noisefloor
IHack
User
Beiträge: 14
Registriert: Dienstag 13. März 2018, 11:17

Ich würde dafür einfach Uwsgi nehmen. Braucht auch keinen Webserver.
Aber ich denke, der TE will das schon auf einem "herkömmlichen" Webserver laufen lassen.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Antworten