JSON Datenübergabe

  • Hallo,

    ein Problem habe ich leider noch mit meiner Bottle, die Daten werden erfolgreich übergeben, kommen im Python Programm auch korrekt an, dort kann ich sie aber nicht richtig weg schreiben...

    Die Daten werden im JSON Data geschrieben, auf dieses Array möchte ich jetzt von anderen Funktionen aus drauf zugreifen. Wenn ich die Daten direkt in einer Funktion übergebe, dann geht es (kann ich so aber im Programm nicht für alle Funktionen gebrauchen). Die Daten bleiben nur Lokal in der TelemetrieHandler2 Funktion.

    Hier die relevanten Teile des Programms:


    Hier der Konsolen Output:


    Wie man sehen kann, wird pwm_antrieb im oberen teil auf 6 gesetzt. (Die Zeile print (json.dumps(data, indent=4)) im TelemetrieHandler2)

    Unten ist Ausgabe aus der Funktion pwm_hauptantrieb. Die Funktion nutzt den Wert der globalen Variable der Abgleich mit dem JSON funktioniert nicht.


    Wie kann ich das am besten realiesieren?

  • Lies dich mal zu Namespace es in Python ein. Mit dem global Statement geht es, ist aber sehr unschön. Deine Datenstruktur hat in Python mit JSON nichts zu tun, auch wenn du das sehr hartnäckig behauptest... Es ist ein dict mit str, list als key, value. Warum hast du die Namen eigentlich doppelt drin, als Key und in der Liste? :conf:

  • Meigrafd hatte ja geschrieben das es einfacher wäre wenn man die ID gleich dem ersten Wert setzt. Ich habe halt auf sein Beispiel aufgesetzt.

    Ich google nicht gerade wenig zum Thema, die JSON deklarationen sehen da so aus... keine Ahnung was ich da übersehe :/


    Normalerweise würde ich die TelemetrieHandler2 von einer anderen Funktion aufrufen und den Wert den ich haben möchte als Return zurück geben, klappt aber bei der Bottle so leider nicht..

    Ich stehe da gerade etwas auf dem Schlauch.

  • Hallo,


    ich bin mir nicht sicher, ob ich dein Problem versteht - aber der Code ist auch ziemlich wirr...


    Die Funktion `pwm_hauptantrieb()` ist mit Sicherheit falsch.

    Erst ist `Antrieb_thread` eine Instanz von `Thread.threding`, dann wird es direkt mit einer Instanz eines GPIOs überschrieben - damit ist es kein Thread mehr.

    Und selbst von `Antrieb_thread` ein Thread wäre macht das so keinen Sinn, weil du den Thread startest, 2 Sekunden wartest und Thread stopps -> dann bau den Thred direkt so, dass es nur 2 Sekunden läuft, weil dann blockierst du die Funktion `pwm_hauptantrieb()` nicht mit dem `sleep(2)`.


    _Was_ soll TelemetryHandler2 zurück geben? Text oder JSON? JSON kann Bottle sehr einfach über `return SOMETHING` wobei `SOMETHING` ein Dict sein muss -> das wandelt Bottle automatisch in JSON.


    Die Struktur von `data` macht wenig Sinn - du hast eine Liste, welche aus drei 1-elementigen Dicts besteht... Warum nicht ein Dict mit drei Schlüssel-Werte-Paaren?


    Die Funktion, die an eine Route gebunden ist, wird beim Aufruf der URL der Route durchlaufen und danach ist "alles" weg. Das einzige, was du "bekommst" ist das, was du per `return` an den aufrufenden Client zurück lieferst. Wenn du in irgendeiner Form Daten aus dem Aufruf der Route brauchst, muss du sie entweder persistent machen (Datenbank, Datei, ...) oder alternativ an einen parallel laufenden Worker-Thread oder Prozess übergeben, der die Daten verarbeitet. `global` ist _keine_ Lösung, vergiß am besten, dass es `global` gibt.


    Was ist eigentlich das Ziel des ganzen` Das du eine REST-Schnittstelle zum Steuern von Servos oder was auch immer hast?


    Gruß, noisefloor

  • Die Verwendung der Variablen ist lokal!


    Um auf die globalen Variablen pwm_servo_unten, pwm_servo_oben, , pwm_antrieb_var in der Funktion 'TelemetryHandler2' usw. zu referenzieren, musst du sie quasi importieren (mit global xyz...)


    Siehe auch https://www.python-kurs.eu/python3_global_lokal.php

  • Besten Dank!

    ich bin noch nicht sonderlich weit mit dem Projekt. Der Thread Teil funktioniert soweit erst einmal (ich hatte diesen in einem anderen Programm schon einmal verwendet und dann hier übernommen. Also längst nicht fertig und der sleep kommt da wieder raus, zum testen reicht mir das aber.

    Ich teste halt noch sehr viel und kann somit ein Programm noch nicht von Anfang an durch planen.

    Mein Problem ist halt auf die JSON Daten wie auf eine Art Datenbank zuzugreifen.


    Ich bin gelernter Energieelektroniker, Programmieren klappt zwar ganz gut, aber mit der Objektorientierten hapert es noch etwas,,, bin aber fleißig am lernen ;)


    Das ganze wird ein Rasp Auto das ich dann noch mit Sensoren etc. erweitern werde. Steuerung und Ausgabe erfolgt übers Web. Ist aber alles noch im Testmodus.

    Einmal editiert, zuletzt von tenor ()

  • Code
    1. jsondata = '{"servo_untenlinks": "400", "servo_rechts": "400", "pwm_antrieb": "50"}'
    2. json_obj = json.loads(jsondata)
    3. print (json_obj["servo_untenlinks"])

    ich lege das dict an und konvertiere es zum JSON.


    In der Funktion die die Daten empfangen soll, konvertiere ich das dict zu JSON.



    Wenn das Kommando pwm_antrieb kommt, will ich den Wert des JSON Eintrags pwm_antrieb der funktion übergeben. Zum testen gebe ich den Wert mit print einfach aus.


    Bekomme dann folgende Meldung:

    Command Request: pwm_antrieb

    Traceback (most recent call last):

    File "/usr/lib/python2.7/dist-packages/bottle.py", line 862, in _handle

    return route.call(**args)

    File "/usr/lib/python2.7/dist-packages/bottle.py", line 1740, in wrapper

    rv = callback(*a, **ka)

    File "web_bottle.py", line 118, in CommandHandler

    response = print(jsondata["pwm_antrieb"])

    TypeError: string indices must be integers, not str


    Richtig wäre wohl print (json_obj["pwm_antrieb"])

    Aber die Daten von dem Objekt bleiben unverändert. Es wird 50 ausgegeben wie sie ganz oben initialisiert wurde.

    Stattdessen sollte das Objekt ja durch die Telemetrie Handler aktuallisiert werden.

    Bei Telemetrie Handler musste ich ja ein neues JSON erstellen,

    wie kann ich das "globale" JSON mit dem aus der Telemetrie Handler abgleichen?


    Besten Dank!

  • ok, hatte mich vertan, habe es von einem Beispiel "To convert JSON to a Python dict"

    unabhängig von der Begrifflichkeit noch einen Tipp?