Nach längerem herumprobieren bin ich jetzt zu dem Schluss gekommen die Socket-Problematik wie folgt zu lösen:
Es werden 2 Scripte auf dem PI benötigt:
- RoPi_Socket.py: Empfängt & verarbeitet Daten vom Arduino, und sendet Steuerbefehle an den Arduino
- WebSocketControl.py: Zur Kommunikation zwischen WebInterface und RoPi_Socket.py
Das 1.Script empfängt permanent Daten vom Arduino wie zB von den Sensoren, Distance Werte oder Movement Rückmeldungen.
Diese Werte werden im Script gespeichert bzw jeweils der aktuelle Wert hinterlegt. Hier soll später auch die KI enthalten sein. Das Script entscheidet dann auch was der RoPi machen soll wenn zB ein Hindernis im Weg ist.
Es nutzt den normalen SocketServer sowie Threading und Serial.
Das 2.Script ist vom 1.Script unabhängig und dient ausschließlich der Steuerung übers Web-Interface. Daten die das Web-Interface anfordert werden über einen internen Socket ausgetauscht - in dem Fall dann eben die Werte die das 1.Script zwischengespeichert hat.
Im 2.Script wird tornado für den WebSocket verwendet. Das erscheint mir zZt die einfachste Möglichkeit zu sein, zumal der als am schnellsten gilt. Zusätzlich kommt aber noch der normale SocketServer zum Einsatz, der nur aufgerufen/ausgeführt wird wenn ein Befehl vom WebIf erfolgt.
Somit gestaltet sich das ganze auch etwas Modularer und man könnte später auch noch weitere Socket Scripts einbinden die zB fürs Mapping zuständig sind o.ä.
Einen sehr ausführlichen Artikel zu dieser ganzen Python Real-Time Problematik hab ich > hier < gefunden, sollte man sich mal durchlesen ist echt interessant.