berndi Geschrieben June 30, 2020 at 11:39 Geschrieben June 30, 2020 at 11:39 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 Zitieren
berndi Geschrieben June 30, 2020 at 11:55 Autor Geschrieben June 30, 2020 at 11:55 kleiner fauxpass: natürlich habe ich zwei Master im Stapel Zitieren
rtrbt Geschrieben June 30, 2020 at 13:29 Geschrieben June 30, 2020 at 13:29 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 Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.