def funktion: in Variable schreiben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BlueSmoke
User
Beiträge: 5
Registriert: Dienstag 4. Oktober 2016, 12:53

Halli Hallo

Ich habe ein kleines Projekt, in welchem ich über dem OBD Port meines Autos die Umdrehungen anzeigen lassen möchte.
Das simple Script funktioniert tadellos.

Code: Alles auswählen

from obd import OBDStatus
import obd
import time

obd.logger.setLevel(obd.logging.DEBUG)

connection = obd.Async(portstr="/dev/ttyUSB0")

# a callback that prints every new value to the console
def new_rpm(r):
    print r.value

connection.watch(obd.commands.RPM, callback=new_rpm)


if connection.status() == OBDStatus.CAR_CONNECTED:
        print("Auto verbunden")

connection.start()

time.sleep(60)

connection.stop()
Das Ergebnis wird permanent im Terminal ausgegeben.
Nun möchte ich das Ergebnis gerne in eine Variable schreiben um es zu einem späteren Zeitpunkt auszugeben oder weiter zu leiten.
Genau daran hapert es. Meine Idee war:

Code: Alles auswählen

from obd import OBDStatus
import obd
import time

#obd.logger.setLevel(obd.logging.DEBUG)

connection = obd.Async(portstr="/dev/ttyUSB0")

# a callback that prints every new value to the console
def new_rpm(r):
    return r.value

if connection.status() == OBDStatus.CAR_CONNECTED:
        print("Auto verbunden")

connection.start()

print new_rpm

time.sleep(60)

connection.stop()
Dabei erhalte ich als Ausgabe: "<function new_rpm at 0x7f8a88d86f50>". Eine korrekte Ausgabe wäre z.B. 850
Verstehe ich das Prinzip von "return" nicht ganz, oder liegt es an der Art und Weise wie ich die Funktion definiere?

Gruss Bluesmoke
Zuletzt geändert von Anonymous am Dienstag 4. Oktober 2016, 13:16, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 18225
Registriert: Sonntag 21. Oktober 2012, 17:20

@BlueSmoke: return gibt einen Wert an den Aufrufer der Funktion zurück. Bei einem Callback ist das irgendeine Funktion im Hintergrund, die mit dem Rückgabewert nichts anfangen kann. Wenn Du die Werte direkt abfragen willst, ist die Asynchrone Abfrage ungünstig. Nimm einfach den direkten Weg:

Code: Alles auswählen

import obd

connection = obd.OBD()
response = connection.query(obd.commands.RPM)
print response.value
BlueSmoke
User
Beiträge: 5
Registriert: Dienstag 4. Oktober 2016, 12:53

Hoi Sirius3
Besten Dank für deine schnelle Antwort. Wenn ich den Befehl dauernd aktualisieren möchte, würde das bei mir so aussehen

Code: Alles auswählen

import obd

import time

obd.logger.setLevel(obd.logging.DEBUG)

connection = obd.OBD(portstr="/dev/ttyUSB0") # auto-connects to USB or RF port

while(True):


        cmd = obd.commands.RPM # select an OBD command (sensor)

        response = connection.query(cmd, force=True) # send the command

        print(response) # "2410 RPM"

        time.sleep(1)
Wenn ich nun einen zweiten Wert abrufen möchte, ist die Verbindung dann nicht schon blockiert?
Zuletzt geändert von Anonymous am Dienstag 4. Oktober 2016, 14:21, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@BlueSmoke: Wenn Du das ständig ausgeben möchtest, dann wäre eine asynchrone Lösung mit einer Rückruffunktion besser. Das hattest Du ja am Anfang schon mal:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import time
import obd
 

def on_rpm_change(response):
    print(response.value)


def main():
    connection = obd.Async(portstr='/dev/ttyUSB0')
    connection.watch(obd.commands.RPM, callback=on_rpm_change)
    connection.start()
    time.sleep(60)
    connection.stop()


if __name__ == '__main__':
    main()
BlueSmoke
User
Beiträge: 5
Registriert: Dienstag 4. Oktober 2016, 12:53

Danke BlackJack. Ich möchte den zurück gegebenen Wert gerne in eine Variable zwischenspeichern um ihn später in einer Grafik zu verwenden.
Momentan ist die "Grafik" ein Textfeld in Pygame.

Gruss
BlackJack

@BlueSmoke: In dem Fall würde ich in der Rückruffunktion ein benutzerdefiniertes Pygame-Ereignis erzeugen, das man dann in der Hauptschleife die die Pygame-Ereignisse abarbeitet entsprechend behandeln kann und das den Wert enthält.
BlueSmoke
User
Beiträge: 5
Registriert: Dienstag 4. Oktober 2016, 12:53

Danke für den Input, ich teste es.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

Interessante Sache hier.
Wo gibts das OBD Modul?
empty Sig
BlueSmoke
User
Beiträge: 5
Registriert: Dienstag 4. Oktober 2016, 12:53

Ich habe es hier geholt http://productivenetwork.ch/sommerstore ... 2-diagnose
Bei der Bluetooth Variante hatte ich ein Problem mit der Stabilität der Verbindung.
Die USB Variante läuft sehr gut bei mir.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

sorry, ich meinte das python modul.
empty Sig
BlackJack

Es gibt da dieses Ding das Internet heisst, und da gibt's so Seiten wo man Suchbegriffe eingeben kann: https://duckduckgo.com/?q=python+obd&ia=about
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

@BJ:
ich weiß selber dass es INet gibt, aber es gibt nicht nur eine obd python lösung. deswegen darf mir die frage bitte gewährt sein!
wer mich kennt, weiß dass ich google oder co vorher bemühe.
außer du bist scharf auf threads "hab mir obd im inet gezogen, aber funktioniert nicht wie in dem thread..."
empty Sig
BlackJack

@harryberlin: Also *das* `obd`-Package scheint ziemlich einsam an der Spitze der Suchergebnisse zu stehen wenn man nach „python obd“ sucht. Und dann kannst Du ja schauen ob es die hier gezeigte API hat.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

welche API ist es denn hier im Thread?
wenn die sinnlose diskussion geklärt ist, bitte aus dem thread löschen.
ich werde ihn höflich per pn fragen.
empty Sig
BlackJack

@harryberlin: Du könntest auch einfach mal auf den Link klicken den ich geposted habe, dann wüsstest Du die Antwort auf Deine Frage schon längst. :roll:
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

hab sogar mind. zwei mal geklickt.
"pip install obd" ist also eindeutig die API? soso
empty Sig
BlackJack

@harryberlin: Nein, das ist das Kommando um das Package zu installieren. Darüber steht die Beschreibung zum Package und darunter ist ein Link zum Eintrag im „Python Package Index“.

Wenn man dem Link folgt wird an dem dort gezeigten Beispiel unter der Überschrift „Basic Usage“ sichtbar, dass es sich sehr wahrscheinlich um das gesuchte Package handelt. Und wenn man dem Link bei der nächsten Überschrift („Documentation“) folgt, sieht man dort gleich auf der ersten Seite welche Module es in dem Package gibt. Und siehe da, da sind Module dabei die hier im Thema in den Quelltexten importiert wurden. Das jetzt ein anderes Package zufälligerweise genau die gleichen Modulnamen verwendet ist dann doch sehr unwahrscheinlich.

Ich habe das Gefühl Du stellst Dich hier gerade absichtlich dumm an, weil Du eingeschnappt bist die Antwort nicht direkt zu bekommen, sondern ”nur” Hilfe zur Selbsthilfe mit ein bisschen Arbeit Deinerseits. Falls Du nicht eingeschnappt bist, dann ist es Dir vielleicht peinlich das man die Antwort so leicht hätte selbst finden können, und versuchst das jetzt extra schwer aussehen zu lassen.

Versuch das doch mal positiv zu sehen: DuckDuckGo ist eine Suchmaschine die wenn die Suchbegriffe „python“ enthalten, auch automatisch im Python Package Index sucht und Treffer dort prominent, gesondert hervorgehoben gleich an erster Stelle listet. Falls Du das nicht wusstest, hast Du was neues, nützliches gelernt.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

hab jetzt nur bis "dumm" gelesen, weils irgendwann auch reicht.
ja ich bin eingeschnappt, weil ich mit google nicht umgehen kann. ach, hab wohl doch paar wörter weiter gelesen....
dein beitrag auf eine suchmaschine zu verweisen, zumindest bei mir, war überflüssig. komm bitte, das ist doch kindergarten.
ich hab ganz normal gefragt und hätte vermutlich auch die gewünschte antwort bekommen.
und anderen usern hätte es vllt. sogar auch geholfen.

Ich hab hier zwar nix zu melden, jedoch muss ich immer wieder feststellen, dass unstimmigkeiten mit dir in aufsatz-schlachten enden.
Und ja, du kannst es dir leisten.
bitte den ganzen diskussions-schmarn löschen, das sprengt leider den thread.

btw: ich lass mich gerne belehren? aber muss man dazu immer sinnlose diskussionen führen, die nicht mal "dumme" oder falsch formulierte fragen erlauben?
empty Sig
BlackJack

@harryberlin: Die Antwort wird anderen Lesern helfen. Denn ich *habe* die Frage beantwortet. Da kann man auf den Link klicken und bekommt den Package-Namen, eine kurze Beschreibung, und einen Link zum Eintrag im Package-Index zu genau dem gesuchten Modul. Man muss *nicht* erst lange in einer Ergebnisliste suchen. Das steht gleich oben, deutlich sichtbar abgegrenzt zu den normalen Suchmaschinenergebnissen dort.

Du willst aber anscheinend nicht lesen und verstehen, oder absichtlich falsch. Du hast nur bis ”dumm” gelesen? Nur das Wort und nicht den Kontext‽ Und dann gleich wieder eingeschnappt. Warum? Weil ich *nicht* denke dass Du dumm bist? Denn das steht da. Genau wie Du wahrscheinlich schon beim Link auf die Suchmaschine eingeschnappt bist, ohne dem mal tatsächlich zu folgen und 10 Sekunden das Ergebnis anzuschauen.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

kann dir gern mein browserverlauf schicken, um das gegenteil zu beweisen, was du mir unterstellst.
und schluss jetzt. muss nicht weiter kommentiert werden.
empty Sig
Antworten