Jump to content

Python IF ELSE


Recommended Posts

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

Link to comment
Share on other sites

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.

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