Jump to content

[Python] UID ermitteln und in globale variable ablegen


Recommended Posts

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.

Unbenannt.jpg.4eb17ce2f5d202e74d1d30c90c3db2b9.jpg

Link to comment
Share on other sites

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".

Link to comment
Share on other sites

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.

 

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...