Jump to content
View in the app

A better way to browse. Learn more.

Tinkerunity

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[Python] UID ermitteln und in globale variable ablegen

Featured Replies

Geschrieben

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

Geschrieben

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

Geschrieben
  • Autor

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.

 

 

Geschrieben

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

Join the conversation

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

Gast
Reply to this topic...

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.