Steuerung über eine Website

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Hallo zusammen,[/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]ich habe folgendes Problem:[/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Ich möchte gerne meinen Raspberry PI über eine Website steuern. [/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Auf dieser Website sollen per Knopfdruck einzelne Signale versendet werden können oder Skripte gestartet werden können. [/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Ganz wichtig ist mir hier auch der CAN - Bus.[/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Beispielsweise kann man aus der Shell heraus eine CAN Nachricht versenden.[/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Gibt nun der Benutzer eine CAN-Botschaft in ein dafür vorgesehenes Feld auf der Website ein und klickt auf senden, soll der Befehl mit den eingegebenen Werten vom Raspberry ausgeführt werden. [/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Ist so etwas möglich? [/font][font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Und wie?[/font]

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Bei der Ausführung der Skripte per Knopfdruck wäre es schön, dass man das was der Raspberry macht, also was er sendet und empfängt live darstellen kann, geht sowas auch? [/font]

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Ich weiß ist jetzt ein Haufen Zeug , aber ich wurde bisher einfach nicht schlau aus den Beiträgen im Internet.[/font]

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Ich hoffe ihr könnt mir helfen, [/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]liebe Grüße[/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Sophia[/font]

  • Kannst du mir eventuell auf die Sprünge helfen?
    Der Webserver funktioniert wunderbar.
    Wie muss ich denn ansetzen um nun eingegebene Variablen auf meiner Website verarbeiten zu können und im Terminal bzw Python Skript verwenden zu können ?
    Vielen Dank und Grüße
    Sophia


  • Zeig bitte deinen bisherigen Code und beschreib dazu was genau du vor hast.

    Also ich habe das oben genannte Tutorial verfolgt.
    Ich habe Schalter zum Schalten der GPIOs implementiert.
    Diese schalten auch richtig.
    Was nicht funktioniert ist die Rueckgabe des aktuellen Wertes, der sollte einfach wie im Beispiel PITEMP funktionieren und auf der Website angezeigt werden, geht aber nicht, mache ich was falsch?

    Ausserdem moechte ich nun die eingegebenen Werte byte1 byte2 usw bei einem Knopfdruck "Senden" in meinem Python Skript verwenden. Geht das?

    Ist es moeglich ein anderes Python Skript aus Python heraus zu starten?

    Hier mein code:
    (Das meiste identisch mit dem Tutorial)

    web_bottle.py:

    control.js

    websocket.js (keine Aenderungen)

    Hoffe es ist machbar
    Vielen Dank
    Gruss
    Sophia
    Automatisch zusammengefügt:
    Achja noch eine Frage.
    Ist es möglich, dass ich PHP auf meiner Website benutze?
    Ich habe PHP5 installiert, aber schon der einfach Echo Befehl wird nicht ausgeführt bzw ich bekomme keine Ausgabe. :no_sad:

    Danke und Liebe Grüße
    Sophia

    Einmal editiert, zuletzt von Sophia (13. September 2016 um 13:55)

  • Das Problem ist, dass du im Python Script "gpio4:0" zurück gibst, im control.js aber "gpio4LOW" erwartest.

    Also beim klicken auf den Button wird "gpio4LOW" verschickt, web_bottle.py empfängt den command aber antwortet dann mit "gpio4:0" wofür es im control.js aber keine Behandlung für gibt.
    web_bottle.py müsste also "gpio4LOW:0" zurück schicken da dafür auch eine Abfrage im crontol.js vorhanden ist.

    Versuch aber mal nicht "gpio4LOW" und "gpio4HIGH" zu nutzen sondern nur "gpio4:0" bzw "gpio4:1" , also auch dementsprechend behandeln/verschicken. Das würde einiges an Code sparen ;)


    Wenn du das Python Script als Webserver nutzt kannst du kein PHP nutzen.
    Sofern du DEBUG im JavaScript aktiviert hast kannst du Ausgaben in der Browser-Console sehen: F12

    Üblicherweise importiert man ein anderes Python Script bzw dessen Funktionen und ruft diese dann auf.

  • Wie gesagt, importiere das andere Python Script ins web_bottle.py , schicke die Werte wie bei dem anderen über den websocket und rufe dann die entsprechenden Funktion aus dem importierten Script auf - dda ich nicht weiß wie das andere Script aussieht kann ich dazu nichts genaueres sagen ;)


  • Wie gesagt, importiere das andere Python Script ins web_bottle.py , schicke die Werte wie bei dem anderen über den websocket und rufe dann die entsprechenden Funktion aus dem importierten Script auf - dda ich nicht weiß wie das andere Script aussieht kann ich dazu nichts genaueres sagen ;)

    Ich verstehe das nicht ganz, bisher sende ich ja nur Kommandos, aber wie kann ich da jetzt die Werte mitschicken, die eingegeben wurden auf der Website?
    :blush:

  • In deiner Webseite nutzt du JavaScript zum ausführen von WebSocket_Send(). JavaScript läuft Client Seitig, wird also auf deinem PC ausgeführt und sendet dann über Netzwerk und WebSocket ans Python Script.

    Wenn du nun zum Beispiel einen Button in die Webseite einbaust mit dem du WebSocket_Send('bla:123') sendest, empfängt dass das web_bottle.py Script (weil dadrin der WebSocket Server läuft). Du brauchst dann also nur in der Funktion WebRequestHandler eine entsprechende Abfrage auf den command "bla" und als value wird dann ja "123" verfügbar.

    Nun hast du zum Beispiel ein weiteres Python Script " werte.py " und in diesem Script definierst du eine Funktion " verarbeiten":
    [code=php]
    def verarbeiten(werte):
    print "verarbeite: %s" % werte
    [/php]

    Dann gehst du im web_bottle.py Script, oben wo auch die anderen import Zeile sind, daher und importierst dieses Script:
    [code=php]import werte[/php]
    Und kannst dann an beliebiger Stelle die Funktion dieses Scripts ausführen:
    [code=php]werte.verarbeiten("123")[/php]
    Alternativ:
    [code=php]from werte import verarbeiten

    verarbeiten("123")[/php]
    Beziehungsweise da du ja eine Variable übergeben willst:
    [code=php]verarbeiten(value)[/php]

    Möchtest du dann wiederum auf der Webseite auch ein Rückgabewert der Funktion wieder empfangen schreibst du die Funktion etwas um:
    [code=php]
    def verarbeiten(werte):
    print "verarbeite: %s" % werte
    return "was auch immer"
    [/php]
    Und in der WebRequestHandler machst du dann zum Beispiel:
    [code=php]
    ### Parse request from webif
    #required format-> command:value
    def WebRequestHandler(requestlist):
    returnlist = ""
    for request in requestlist:
    request = request.strip()
    requestsplit = request.split(':')
    requestsplit.append("dummy")
    command = requestsplit[0]
    value = requestsplit[1]
    if value == "dummy":
    value = "0"

    if command == "localping":
    returnlist += "\n localping:ok"
    elif command == "LoadAVRnum":
    returnlist += "\n LoadAVRnum:"+open("/proc/loadavg").readline().split(" ")[:3][0]
    elif command == "Uptime":
    returnlist += "\n Uptime:"+str(getUptime()).split(".")[0]
    elif command == "RAMperc":
    returnlist += "\n RAMperc:"+str(getPiRAM())
    #returnlist += "\n RAMperc:"+str(psutil.phymem_usage().percent)
    elif command == "PiTEMP":
    returnlist += "\n PiTEMP:"+str(getPiTemperature())

    elif command == "bla":
    returnlist += "\n bla:"+str(verarbeiten(value))

    return returnlist
    [/php](gekürzt aufs nötigste)
    In der control.js bräuchtest du dann natürlich auch eine Behandlung von "bla"...

  • Danke für deine ausführliche Antwort :danke_ATDE:
    Ich bin leider bisher nicht dazugekommen es umzusetzen aber spätestens am Wochenende probiere ich es aus und hoffe ich bekomme es hin.
    Melde mich dann wieder :thumbs1: :)

  • Hallo :)
    ich habe mal wieder ein Problem.
    Ich komme schon ganz gut zurecht, habe jetzt aber leider ein neues Problem.
    Ich möchte gerne CAN Nachrichten per Knopfdruck auf der Website versenden.
    Ich benutze das PICAN2 Board. Von anderen Python Programmen funktioniert das einwandfrei.

    Jetzt habe ich folgenden Code eingefügt, der ausgeführt werden soll sobald man einen Knopf drückt.
    Er springt auch rein und das passt alles, aber er sendet nichts, da kommt nichts raus :neutral: und ich weiß beim besten Willen nicht wieso.
    Das funktioniert solang bis der Webserver aufgesetzt ist und dann nicht mehr.

    Hier mein Code der:


    Lasse ich ihn im selber Python Skript ausführen bevor der Webserver aufgesetzt wurde funktioniert alles, danach nicht mehr.
    Also nach der Meldung :

    [font="serif"]Starting Child Thread for WebSocket_Server
    [/font]
    [font="serif"]Bottle v0.12.7 server starting up (using WSGIRefServer())...[/font]
    [font="serif"]Listening on http://0.0.0.0:8080/[/font]
    [font="serif"]Hit Ctrl-C to quit.[/font]

    [font="serif"]Ich versteh einfach nicht warum. [/font]

    [font="serif"]Ich hoffe es gibt dafür eine Lösung[/font]

    [font="serif"]Liebe Grüße[/font]
    [font="serif"]Sophia :helpnew: [/font]

  • Wenn du web_bottle.py startest gibts da keine Interaktionen mehr ala CTL-C ... Bzw wenn dann beendest du das gesamte Script, was aber eigentlich nicht sein sollte.

    Du drückst auf der Webseite einen Button.. Dieser sendet über WebSocket einen String "canCOMM" ans web_bottle.py welches wiederum über die Funktion WebRequestHandler eine Aktion ausführen soll. Soweit richtig?

    Es reicht, ein mal den CAN Bus zu initialisieren (bring up).
    Du tust das aber jedes mal wenn "canCOMM" übermittelt wurde. Das machen die Example Scripts, wie man es fürs PICAN2 Board beim Hersteller findet, auch nur ein mal.
    Allerdings würde es auch schon reichen den durch os.system ausgeführten Befehl (ohne sudo) einfach nur in /etc/rc.local einzutragen. Dadurch wird dann bei jedem System Start ein "can0" Device erzeugt und kein Script brauch sich mehr um die Initialisierung kümmern... Oder du lässt das web_bottle.py Script vorher prüfen ob das Device existiert und nur wenn nicht wird os.system ausgeführt.

    Ein weiterer Fehler ist besagte 'Press CTL-C to exit' Sache, das bringt derart sowieso nichts - wozu auch? Der Bediener sieht nur die Webseite und kann in der Konsole nicht STRG+C drücken.

    Deine Quelle scheint das hier gewesen zu sein: https://github.com/skpang/PiCAN-P…mple_tx_test.py .... TX bedeutet quasi Transmit also Senden. RX bedeutet quasi Receive also Empfangen.
    Interessant wäre es nun aber auch ob du von deinem CAN Device mehrere Zeilen zurück auf die Webseite haben möchtest - oder reicht nur die Antwort auf dein "send" ? Denn wenn du über den CAN Bus quasi alles empfangene auf der Webseite angezeigt haben willst musst du eine andere Herangehensweise vornehmen -> Push. Aber nicht blindes Push sondern schon kontrolliert. Es wäre dann einfacher wenn du ein mal ausführlich beschreibst was du eigentlich vor hast und was das spätere Ergebnis sein soll - wäre einfacher für alle Beteiligte :D

    Fürs PICAN2 Board ist auch das hier relevant: https://python-can.readthedocs.io/en/stable/inte…/socketcan.html


    Und gewöhne dir bitte an maximal 4 einzelne Leerzeichen für Eine Einrückung zu nutzen, nicht 18.

  • Ja das ergibt keinen Sinn, das habe ich aber noch nicht rausgenommen das CTL-C.
    Genau das sollte funktionieren ja.
    Erst einmal möchte ich einfach eine CAN Botschaft senden und die Antwort des Steuergeräts auf der Website angezeigt bekommen. Das sind sehr viele Nachrichten die dann angezeigt werden sollen.

    Habe jetzt noch ein paar Tests durchgeführt.
    Also es funkioniert solang bis der Server aktiv ist.
    Davor kann ich Nachrichten in der Shell oder in Python verschicken.
    Danach geht nichts mehr. Er bringt dann nach vielen 12 mal senden den Fehler, dass der Buffer voll ist. Es geht also nichts raus. Der gleiche Fehler kommt auch wenn ich kein Steuergerät am CAN Modul hängen habe und 12 mal etwas gesendet habe.
    Auch nachdem ich den Server dann wieder beendet habe geht das Senden nicht mehr. Dann muss ich den RPI neu starten dann geht es wieder bis ich eben wieder den Server starte.
    Sobald folgender Code einmal ausgeführt wurde geht da nichts mehr.
    :wallbash: :s =(


  • Bitte das vollständige web_bottle.py zeigen.


    Automatisch zusammengefügt:
    Mit Tornado statt Bottle funktioniert es auch nicht.

    Einmal editiert, zuletzt von Sophia (3. Oktober 2016 um 22:09)

  • Du machst es immer noch falsch, immer noch so wie ich es in Beitrag#14 bemängelt habe: Jedes mal wenn canCOMM über den WebSocket kommt führst du den os.system Befehl aus. Das musst du noch immer anders lösen => Ein mal beim starten des Scripts initialisieren, nicht jedes mal erneut.

    Bitte vergleiche Deinen Code mit diesem => http://codepad.org/vsk2JB46
    ...damit du verstehst worauf ich seit Beitrag#14 hinaus will

  • oh ja, das habe ich noch nicht rausgenommen gehabt, sorry. Das macht das ganze natürlich aufgeräumter, danke für den Hinweis.

    Nach einer gefühlten Ewigkeit konnte ich das Problem mit dem CAN Modul nun lösen.
    Das Problem war, dass ich den Interrupt Pin als Ausgang definiert habe und auf Null gesetzt habe. :wallbash: :wallbash: :wallbash: :wallbash: :@


    Das hätte ich auch früher merken können :shy:

  • Hallo :)
    ich mal wieder :)
    Ich habe ein Problem mit txt.-Dateien die ich zum Download anbieten will.
    Wo muss ich die denn ablegen damit das funktioniert?
    Bei mir kommt der Fehler:
    "Sorry, the requeswted URL 'http://localhost:8080/testest.txt' caused an error:
    Not found: '/testest.txt'"
    Die Datei liegt sowohl im static, templates als auch bei web_bottle.py.

    Dankeschön
    Gruß
    Sophia
    Automatisch zusammengefügt:
    Was ich erreichen will:
    Der Inhalt eines Textfeldes mit bestimmter ID soll auf Wunsch vom Benutzer, beim Betätigen eines Buttons, lokal als Textdatei abgespeichert werden können.
    Mir ist dazu nur eingefallen den Inhalt in eine Textdatei auf dem RPI zu schreiben mit Hilfe von Python, dann den Download zu starten und anschließend die Datei zu entfernen.

    Einmal editiert, zuletzt von Sophia (15. Oktober 2016 um 23:12)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!