Jump to content

Recommended Posts

Geschrieben

Hallo

Ich habe hier einen stack mit Spannungsbrick unten drunter, einem Master, vier temperatur brickletts 2.0 und einem ptc bricklett. Angeschlossen über USB an einen Raspi 3.

Die Temperaturen frage ich alle min eine Minute max vier Minuten ab.

Python Abfrage:

Zitat
def t_d_ist(usr, pwd, hst, dtbs, HOST, PORT): # Def T d holen und in Datei schreiben
UID = "HZ8" # Change XYZ to the UID of your Temperature Bricklet 2.0
if __name__ == "__main__":
ipcon = IPConnection() # Create IP connection
t = BrickletTemperatureV2(UID, ipcon) # Create device object
ipcon.connect(HOST, PORT) # Connect to brickd
# Don't use device before ipcon is connected
sleep(1)
temperature = t.get_temperature()/100 # Get current temperature
sqlgive = "UPDATE `cooling` SET `t_d_ist`= '%s' WHERE 1" %temperature# Zählerstand schreiben
maria.db_give(usr, pwd, hst, dtbs, sqlgive)#Daten in DB schreiben(usr=User, pwd=Passwort, hst=Host, dtbs=Datenbank, sql=SQL-Code)
ipcon.disconnect() # Verbindung zum brick schließen
return temperature # Temperatur zurückgeben

So weit so gut.

Ganz außen rundrum habe ich eine Routine, die das fängt und das script neu startet.

In ganz verschiedenen Abständen, mal einer am Tag, mal 10 in der Minute kommt dann das:

Zitat

Traceback (most recent call last):
  File "/var/www/html/cooling/cooling.py", line 776, in <module>
    main_fkt(host, port)                        # Aufruf Hauptprogramm
  File "/var/www/html/cooling/cooling.py", line 738, in main_fkt
    defrost(host, port)                 # Steuerung Gefrierschrank
  File "/var/www/html/cooling/cooling.py", line 339, in defrost
    evaptemp = int(t_evaporator_ist(host, port)) # aktuelle Verdampfertemperatur holen
  File "/var/www/html/cooling/cooling.py", line 317, in t_evaporator_ist
    temperature = ptc.get_temperature()/100
  File "/var/www/html/cooling/tinkerforge/bricklet_ptc_v2.py", line 146, in get_temperature
    return self.ipcon.send_request(self, BrickletPTCV2.FUNCTION_GET_TEMPERATURE, (), '', 'i')
  File "/var/www/html/cooling/tinkerforge/ip_connection.py", line 1219, in send_request
    raise Error(Error.TIMEOUT, msg, suppress_context=True)
tinkerforge.ip_connection.Error: Did not receive response for function 1 in time (-1)

Das kann ich nicht absichtlich erzeugen und es sind, gut gemischt, alle fünf brickletts davon befallen.

Alle Teile und Kabel sind -zig mal geprüft und getauscht.

Spannung und Strom sind im Überfluß vorhanden.

Und: seit ich das    sleep(1)      drin habe ist es seltener geworden und die vielen kurz hintereinander sind nicht mehr so oft. 

Im Netz habe ich nichts zu dem Thema gefunden und bei Euch werden immer nur die bindings allgemein beschrieben. Da steht drin : nicht benutzen bevor verbunden aber wann ist verbunden?

Die Sache ist jetzt mehr lästig als störend aber Fehlermeldungen sind ja zum beseitigen da.

Gruß berndi

Geschrieben

Moin,

1 hour ago, berndi said:

Im Netz habe ich nichts zu dem Thema gefunden und bei Euch werden immer nur die bindings allgemein beschrieben. Da steht drin : nicht benutzen bevor verbunden aber wann ist verbunden?

ipcon.connect blockiert bis entweder die Verbindung aufgebaut ist oder ein Fehler auftritt.

Folgende Dinge fallen mir am Code auf:

  • Das "if __name__ == "__main__":" kannst du dir an der Stelle sparen, du bist da ja schon mitten im Programm.
  • Wenn du dir die IPConnection weiter außen hältst, musst du nicht jedes Mal eine neue Verbindung aufbauen, wenn du einen Temperaturwert abfragen willst
  • get_temperature() kann (wie fast alle anderen Funktionen der Bricks/Bricklets auch) Timeouts erzeugen, wenn aus irgendeinem Grund die Abfrage länger als (falls nicht umkonfiguriert) 2,5 Sekunden dauert. Je nachdem was sonst noch auf dem System passiert, kann das durchaus passieren. Am besten ist es, wenn du den Fehler fängst und behandelst, im einfachsten Fall probierst du es einfach nochmal, bis z.b. 5 Versuche nicht geklappt haben. Das kann z.b. so aussehen:
    from tinkerforge.ip_connection import Error
    
    # 3 Versuche, danach geben wir auf
    for i in range(3):
      try:
        temp = thermocouple.get_temperature()
        # Wenn der Aufruf geklappt hat, verlasse die Schleife
        break
      except Error as e:
        if e.value != Error.TIMEOUT:
          # Wenn der Fehler kein Timeout war wird er zum Aufrufer weitergegeben.
          raise e
    else:
      # Das else einer for-Schleife wird ausgeführt, wenn kein break in der Schleife getroffen wurde
      # Das heißt in diesem Fall, dass alle 3 Versuche Timeouts erzeugt haben
      print("Konnte Temperatur nicht abfragen")

    Damit du das nicht bei jedem Aufruf machen musst, kannst du dir das wie folgt in eine Funktion packen:
     

    from tinkerforge.ip_connection import Error
    
    def attempt_n_times(fn, name, attempts):
      for i in range(attempts):
        try:
          return fn()
        except Error as e:
          if e.value != Error.TIMEOUT:      
            raise e
      print("Konnte {} nicht ausführen: {} Timeouts".format(name, attempts))
      return None
    
    temp = attempt_n_times(thermocouple.get_temperature, "Temperaturabfrage", 3)
    
    attempt_n_times(lambda: thermocouple.set_configuration(16, 3, 0), "Thermocouple-Konfiguration", 3)

    Achtung: Das sind Codebeispiele für das Thermocouple Bricklet, das musst du noch auf das Temperature 2.0 oder PTC 2.0 Bricklet anpassen. Du scheinst ja beide zu benutzen.

Warum die Timeouts bei dir manchmal gehäuft auftreten ist mir spontan nicht klar. Eventuell stört dein TK-Schrank die Signale?

Gruß,
Erik

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

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...