Seite 1 von 1
def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 13:13
von BlueSmoke
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
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 13:27
von Sirius3
@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
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 14:03
von BlueSmoke
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?
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 14:27
von 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()
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 14:56
von BlueSmoke
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
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 15:15
von 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.
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 15:25
von BlueSmoke
Danke für den Input, ich teste es.
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 18:53
von harryberlin
Interessante Sache hier.
Wo gibts das OBD Modul?
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 20:04
von BlueSmoke
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.
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 20:15
von harryberlin
sorry, ich meinte das python modul.
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 20:25
von 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
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 20:28
von harryberlin
@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..."
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 20:38
von 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.
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 20:44
von harryberlin
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.
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 20:54
von 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.

Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 21:01
von harryberlin
hab sogar mind. zwei mal geklickt.
"pip install obd" ist also eindeutig die API? soso
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 21:57
von 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.
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 22:13
von harryberlin
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?
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 22:49
von 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.
Re: def funktion: in Variable schreiben
Verfasst: Dienstag 4. Oktober 2016, 23:00
von harryberlin
kann dir gern mein browserverlauf schicken, um das gegenteil zu beweisen, was du mir unterstellst.
und schluss jetzt. muss nicht weiter kommentiert werden.