[Python] Diskussion/Fragen: Webserver, Websocket und ein bisschen AJAX

  • Hallo Zusammen


    vielen Dank für die Antworten.


    das habe ich mir gedacht. allerdibhs existieren die Dateien und befinden sich auch im static ordner


    wenn ich den link im girebug asnklicke wird die Datei acu geöffnet.


    Der code ist eins zu eins jener von meingrafd.


    Gruss GL



    Gesendet von meinem SM-G935F mit Tapatalk

  • Naja, irgendwo musst Du einen Fehler gemacht haben - denn der Code funktioniert sowohl bei mir als auch bei anderen, nur du scheinst Probleme damit zu haben....
    Ich kann dir auch gerne ein Video zeigen - wenn man wirklich so vorgeht wie in der Anleitung beschrieben dann funktioniert's auch => http://raspberrypi.roxxs.org/web_tornado.avi ... Bei Position 0:03 siehst du die Verzeichnisstruktur. Anschließend prüfe ich den Inhalt der Unterverzeichnisse.. Alle erforderlichen Dateien sind vorhanden und auch befüllt.. 1:1 wie in der Anleitung beschrieben. Dann starte ich das Script und surfe meinen Pi auf Port 8080 an - so wie per Default im web_tornado.py eingestellt... Und siehe da, es funktioniert.


    Die Meldung bei dir lautet nur das er versucht die Datei zu öffnen aber eben nicht finden kann also fehlschlägt. Wenn er sie tatsächlich erfolgreich geöffnet hätte aber dann ein Fehler auftritt säh die Fehlermeldung anders aus.


    Ohne weitere Infos können wir dir da nicht helfen. Beispielsweise ein "ls -la" von dem Verzeichnis posten in dem deine web_tornado.py liegt (bitte in CODE)

  • Hallo Zusammen


    Nun hat es geklappt. Das video hat geholfen.


    Irgendwas hatte ich falsch verstanden. Mein "static" Ordner befand sich im "templates" Ordner.


    NUn klappt es.


    Vielen Dank :)

  • Guten Morgen,
    Ich habe mich strickt an Anleitung gehalten und bekomme vollgende Meldung siehe Bild
    Kann mir jemand weiterhelfen?
    [Blocked Image: https://uploads.tapatalk-cdn.com/20170603/e616ee044f46842bce77d1c9fae532a7.jpg]


    Vielleicht macht es auch Sinn bei mir wieder bei 0 anzufangen.
    Dafür würde ich gerne wissen wenn der pi später vollende Aufgaben übernehmen soll welche Sachen ich installieren bzw brauche.

    Code
    1. Relais an aus über Handy oder Webseite ( nur lokal)
    2. wen bis X Uhr nicht 2 std Relais 1 an dann für Rest laufen
    3. Relais 2 bei Temperatur Differenz 2 er Eingänge ein
    4. Sperre 1 gegen 2

    nicht das ich mir den Pi zu Mülle da ich Anfänger bin [emoji848]

    Edited once, last by B4unty ().

  • Da du keinen Shebang gesetzt hast musst du die Datei dem Interpreter übergeben.
    Da du "./web_tornado.py" eingibst zum ausführen versucht er es mit bash zu verarbeiten aber das wird freilich nichts - unterschiedliche Syntax.


    Du hast 2 Möglichkeiten:


    1)

    Code
    python web_tornado.py


    2)
    web_tornado.py bearbeiten und ganz oben in die erste Zeile den Shebang einfügen:

    Code
    #!/usr/bin/python


    erst anschließend direkt ausführen:

    Code
    ./web_tornado.py




    PS: In der Anleitung steht übrigens nirgends das man es mit " ./ " ausführen soll, da steht nur "ausführen" oder "Führt nun ein Python Script eurer Wahl (bottle oder tornado) aus".
    Aber vor allem: "Im derzeitigen Zustand der Python Scripts wie ich sie gleich zeige spielt es eigentlich noch keine Rolle ob man sie mit python2 oder python3 ausführt.". Deshalb gibts auch kein Shebang in den Vorlagen.

  • Hallo!
    Vielen Dank für diese umfassende Anleitung.

    Mit meinen PC kann ich ohne Probleme eine Verbindung herstellen, nur leider klappt das nicht mit meinem IPhone.

    Hat da irgendjemand eine Idee, woran das liegen könnte?

    Ich bekomme in der Konsole immer folgende Meldung:


    New WebSocket Client connected

    WebSocekt closed 1006 Going away


    Gruß

  • Hallo Meigrafd,

    vielen Dank für deine Vorstellung zu JSON als Websocket Alternative!

    Ich probiere gerade das richtig zu verstehen was du das gemacht hast.

    Mein RASPICAR möchte entsprechend über Web steuern und JSON über für die Datenübertragung benutzen.

    Einen Servo kann ich per Knopfdruck von der Seite jetzt in Position fahren lassen.

    Diesen Positionswert würde ich gerne via Regler auf der HTML Seite bestimmen. (Die Antriebsgeschwindigkeit soll später ebenfalls auf diese Weise eingestellt werden).


    Die Python Datei besteht im wesentlichen aus deiner Vorgabe mit Bottle, ich poste hier nur die Änderungen damit es übersichtlicher ist.


    from __future__ import print_function

    import os.path

    import bottle

    import json

    from datetime import timedelta

    from random import randrange

    import RPi.GPIO as GPIO

    import time

    import os

    import svtor

    import threading

    import config

    from RPIO import PWM


    PIN_OUT_1 = 8

    PIN_OUT_2 = 10

    PIN_RECHTS = 12

    PIN_LINKS = 11

    PIN_SERVO_UNTEN = 13

    PIN_SERVO_OBEN = 15


    GPIO.setmode(GPIO.BOARD)

    GPIO.setup(PIN_OUT_1, GPIO.OUT)

    GPIO.setup(PIN_OUT_2, GPIO.OUT)

    GPIO.setup(PIN_RECHTS, GPIO.OUT)

    GPIO.setup(PIN_LINKS, GPIO.OUT)

    GPIO.setup(PIN_SERVO_OBEN, GPIO.OUT)

    GPIO.setup(PIN_SERVO_UNTEN, GPIO.OUT)


    DEBUG = 1

    servo_unten = PWM.Servo()

    servo_oben = PWM.Servo()


    def servo_unten_func():

    servo_unten.set_servo(PIN_SERVO_UNTEN, rangepwm)

    time.sleep(.5)

    servo_unten.stop_servo(PIN_SERVO_UNTEN)


    @bottle.route('/data/')

    def TelemetryHandler():

    printD("Telemetry Request.")

    bottle.response.content_type = 'application/json'

    data = {}

    data["PiTEMP"] = getPiTemperature()

    data["PiRAM"] = getPiRAM()

    data["servo_untenlinks"] = servo_unten_func()

    rangepwm = data["MotorSpeed"]

    return json.dumps(data)


    @bottle.route('/cmd/<command>')

    def CommandHandler(command):

    response = ''

    printD("Command Request: {}".format(command))

    if command == 'PiTEMP':

    response = getPiTemperature()

    elif command == 'PiRAM':

    response = getPiRAM()

    elif command == 'servo_untenlinks':

    response = servo_unten_func()

    elif command == 'exit':

    response = beenden()

    printD("response: %s"% response)

    return str(response)


    Hier die HTML Datei, die control.js habe ich nicht angefasst.


    <!DOCTYPE html>

    <html>

    <head>

    <script>

    var DEBUG = {{ debug }};

    </script>

    <script src="/static/jquery-3.3.1.min.js" type="text/javascript"></script>

    <script src="/static/control.js" type="text/javascript"></script>

    </head>

    <body>

    Test: {{ test }}

    <br/>

    <input type="button" value="RAM" onClick="Send('PiRAM')" />

    <span id="PiRAM"></span>

    <br/> <input type="button" value="CPU Temperatur" onClick="Send('PiTEMP')" />

    <span id="PiTEMP"></span> &deg;C

    <br/>

    <br/> <input type="button" value="Servo unten links" onClick="Send('servo_untenlinks')" />

    <span id=MotorSpeed></span>

    <br/>

    <br/> <input type="button" value="Exit" onClick="Send('exit')" />

    <span id="Exit"></span>

    <br/>

    <p><div id="Log" style="text-align:left; width:100%;">&nbsp;</div></p>

    <form oninput="numerisch.value=auswertung.value">

    <input type="range" name="auswertung" min="100" max="2000" value="500">

    PWM: <output name="numerisch">500</output>

    </form>

    </body>

    </html>


    Beim Versuch rangepwm an die Funktion zu übergeben, bekomme ich die Meldung das diese global nicht deklariert ist. So kann es also nicht funktionieren.

    Wie kann ich richtig auf die JSON Daten zugreifen, innerhalb einer anderen Funktion?

    Die Daten scheinen ja nur innerhalb dieser bottle funktion nutzbar zu sein, zwar kann ich andere Funktionen von dort aus aufrufen, aber die Daten nicht bidirektional verwenden.


    Wie würdest du das machen?

    Danke und Gruß Tenor

  • tenor da sich meigrafd hier schon länger nicht mehr hat blicken lassen, wirst du bei einer direkten Frage an Ihn wohl keine Antwort bekommen. Bitte stelle deine Frage erneut in einen neuen Thread und achte dabei auf folgendes:


    • Such das passende Subforum raus
    • Formatiere deinen Code auch als solchen:
      Python
      Python-Code
    • Poste vollständige Fehlermeldungen
    • Vermeide schwammige Ausdrücke wie "über Web senden" (:no_sad:)
    • Stelle die Frage allgemein, nicht an meigrafd gerichtet.


    :danke_ATDE: an dich und noisefloor!