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.

Featured Replies

Geschrieben

Servus Zusammen

 

Ich habe einen kleinen Programmcode gebastelt.

Nun habe ich gemerkt, dass das ganze Skript abgebrochen wird, sobald ein Sensor fehlt (z.B. wegen Wackelkontakt oder irgendwelchen Defekten).

Das soll mir natürlich nicht passieren. Nun war meine Idee, eine if-Abfrage zu machen, ob die Bricklets anzusprechen sind, oder nicht. Aber wie mache ich das genau?

Ich programmiere in Python und kann mir gerade nicht vorstellen, was für eine Bedingung mit dem IF abgefragt werden soll.

Hier der Code:

#!/usr/bin/env python
# -*- coding: utf-8 -*-  

HOST = "localhost"
PORT = 4223
UID_master = "######"
UID_dist = "###"
UID_temp = "###"
UID_current ="###"

from tinkerforge.ip_connection import IPConnection
from tinkerforge.brick_master import Master
from tinkerforge.bricklet_temperature import Temperature
from tinkerforge.bricklet_distance_ir import DistanceIR
from tinkerforge.bricklet_voltage_current import VoltageCurrent

if __name__ == "__main__":
ipcon = IPConnection() # Create IP connection
master = Master(UID_master, ipcon) # Create device object
temp = Temperature(UID_temp, ipcon)	
dist = DistanceIR(UID_dist, ipcon) # Create device object	
vc = VoltageCurrent(UID_current, ipcon)

ipcon.connect(HOST, PORT) # Connect to brickd

# Don't use device before ipcon is connected

# Get voltage and current from stack (in mV/mA)
voltage = master.get_stack_voltage()/1000.0
current = master.get_stack_current()/1000.0
chip_temp = master.get_chip_temperature()/10.0
# Get Temperature from Temp-Bricklet
temperature = temp.get_temperature()/100.0 
# Get Current and Voltage from Bricklet
bricklet_current = vc.get_current()/1000.0
bricklet_voltage = vc.get_voltage()/1000.0
print(voltage)

ipcon.disconnect()

 

Danke für hilfreiche Kommentare,

Lukas

Geschrieben

In diesem Programm erst zu fragen ob ein Brick(let) wirklich da ist, wobei dein Programm eigentlich davon ausgeht das es da ist, ist eigentlich nicht typisch Python. Typischer wäre es einfach die Getter aufzurufen und die Exception zu behandeln, die möglicherweise auftreten kann. Also z.B. so:

 

try:
    voltage = master.get_stack_voltage()/1000.0
except Exception as e:
    print "get_stack_voltage() failed", str(e)

 

Statt erst zu prüfen ob das Brick(let) vielleicht nicht da ist (wobei is_device_available() nicht in der Form existiert und nur der Verdeutlichung dient):

 

if is_device_available(master):
    voltage = master.get_stack_voltage()/1000.0

 

Wenn davon auszugehen ist, dass meistens oder immer nicht alle Bricklets die dein Programm erwartet vorhanden sind, dann kann es sinnvoll sein zu erst per Enumerate zu erfragen was angeschlossen ist. Dann muss nur einmal kurz gewartet werden, statt bei jedem Aufruf einen möglichen Timeout abwarten zu müssen wenn ein erwartetes Brick(let) nicht vorhanden ist.

 

Hier ein Beispiel, dass per Enumerate die Liste der bekannten UIDs aufbaut und aktuell hält (ungetestet):

 

available_uids = set()

def cb_enumerate(uid, connected_uid, position, hardware_version, firmware_version, device_identifier, enumeration_type):
    if enumeration_type == IPConnection.ENUMERATION_TYPE_DISCONNECTED:
        available_uids.remove(uid)
    else:
        available_uids.add(uid)

if __name__ == "__main__":
    ipcon = IPConnection()
    ipcon.connect(HOST, PORT)
    ipcon.register_callback(IPConnection.CALLBACK_ENUMERATE, cb_enumerate)
    ipcon.enumerate()

    time.sleep(1) # wait a moment for enumerate callbacks

    print available_uids

    ipcon.disconnect()

 

Du kannst jetzt prüfen ob deine erwartete UID in available_uids ist und dann entsprechend handeln.

 

Dies kann aber nicht alle Fälle abdecken. Wenn dein Programm z.B. mittendrin die Verbindung zum Stack verliert werden die Funktionen der Brick(let) Objekte immer noch Exceptions werfen. Du kommst also um Fehlerbehandlung für ein robustes Programm nicht herum.

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.