fdrews Geschrieben September 18, 2013 at 13:28 Geschrieben September 18, 2013 at 13:28 Hallo Tinkergemeinde. Es geht um vollgendes. Ich würde gerne über die Callbacks die uid auslesen und in einer globalen variable ablegen lassen. Das auslesen an sich ist kein Problem aber irgendwie scheinen die Callbacks nicht rechtzeitig durchzulaufen. Vielleicht habt ihr eine Idee. Die Ausgabe habe ich einfach mal angehangen. #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 UID_Barometer = None UID_Humidity = None UID_AmbientLight = None from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_barometer import Barometer def my_testcallback(uid, connected_uid, position, hardware_version, firmware_version, device_identifier, enumeration_type): if device_identifier == 221: global UID_Barometer UID_Barometer = uid print('test: ' + UID_Barometer) elif device_identifier == 27: UID_Humidity = uid print('test: ' + UID_Humidity) elif device_identifier == 21: UID_AmbientLight = uid print('test: ' + UID_AmbientLight) if __name__ == "__main__": ipcon = IPConnection() ipcon.connect(HOST, PORT) ipcon.register_callback(IPConnection.CALLBACK_ENUMERATE, my_testcallback) ipcon.enumerate() print('test2: ' + str(UID_Barometer)) print('test2: ' + str(UID_AmbientLight)) print('test2: ' + str(UID_Humidity)) #b = Barometer(UID_Barometer, ipcon) # die uid`s brauch ich um die bricklets anzusprechen #air_pressure = b.get_air_pressure()/1000.0 #print('Air Pressure: ' + str(air_pressure) + ' mbar') #altitude = b.get_altitude()/100.0 #print('Altitude: ' + str(altitude) + ' m') input('Press any key to exit\n') ipcon.disconnect() Vielen Dank schon mal im vorraus für die Hilfe. Zitieren
AuronX Geschrieben September 18, 2013 at 14:27 Geschrieben September 18, 2013 at 14:27 Der Aufruf von enumerate blockiert nicht! Das heißt enumerate läuft durch und parallel zu dem was du dann noch schreibst werden irgendwann die callbacks ausgeführt. Das Problem ist dass du nicht sicher sagen kannst wie lange es dauert bis alle Antworten aufs Enumerate angekommen sind. Wenn du sicher gehen willst, dann musst du nach "enumerate()" mindestens 2500ms warten. Das ist meiner Erinnerung nach der Standard-Timeout, alles was länger zum Antworten braucht gilt gemeinhin als "nicht rechtzeitig". Zitieren
fdrews Geschrieben September 18, 2013 at 15:02 Autor Geschrieben September 18, 2013 at 15:02 Also einfach nach enumerate() nen time.sleep von 2.5 Sekunden wenn ich dich richtig verstanden habe? Das funktioniert soweit. Vielen Dank. Hast du vielleicht eine andere Idee wie man das besser realisieren kann. Aktuell muss man ja die UID`s hart coden. Wenn man jetzt z.B. den Luftdruck messen möchte. Ich würde natürlich gerne auslesen die UIDs und dann übergeben so dass man nicht die UID fest rein schreiben muss. Zitieren
AuronX Geschrieben September 18, 2013 at 17:14 Geschrieben September 18, 2013 at 17:14 Statt im Callback die UIDs in einer globalen Variable zu speichern und im Hauptprogramm alles auszugeben könntest du auch im Callback alles ausgeben. In der einfachsten Form geht das so (ich mach jetzt nur wildes copy & paste in deinem code hier im forum; NICHT GETESTET): #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 UID_Barometer = None UID_Humidity = None UID_AmbientLight = None from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_barometer import Barometer def my_testcallback(uid, connected_uid, position, hardware_version, firmware_version, device_identifier, enumeration_type): if device_identifier == 221: #b = Barometer(UID_Barometer, ipcon) # die uid`s brauch ich um die bricklets anzusprechen #air_pressure = b.get_air_pressure()/1000.0 #print('Air Pressure: ' + str(air_pressure) + ' mbar') elif device_identifier == 27: # hier wie beim barometer elif device_identifier == 21: # hier wie beim barometer if __name__ == "__main__": ipcon = IPConnection() ipcon.connect(HOST, PORT) ipcon.register_callback(IPConnection.CALLBACK_ENUMERATE, my_testcallback) ipcon.enumerate() print('test2: ' + str(UID_Barometer)) print('test2: ' + str(UID_AmbientLight)) print('test2: ' + str(UID_Humidity)) input('Press any key to exit\n') ipcon.disconnect() Ansonsten kannst du dir mal den Code von der Wetterstation anschauen. Da passiert im wesentlichen das folgende: Hauptprogram - registriert enum-callback - ruft ihn auf enum-callback - erstellt temporär ein device - registriert je nach device die callbacks (temperatur/luftdruck/wasauchimmer) jeder dieser callbacks - gibt aktuellen wert aus / tut dinge damit Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.