Jump to content

DoIT

Members
  • Gesamte Inhalte

    39
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von DoIT

  1. OK dann stimmen die angezeigten CRC Werte also. Würde es für meine Funktion dann überhaupt Sinn machen den CRC Wert zu berechnen wenn dies eh schon das Bricklet erledigt? Werden readings im Brickviewer verworfen wenn der CRC nicht korrekt ist? Sobald ich in meinem Programm fehlerhafte Werte bekomme also etwa nach 12h ist es so das ich im Brickviewer bei Search Bus keine Sensoren mehr finde. Abhilfe das wieder Sensoren gefunden werden ist ein Reset im Brickviewer oder aber das ab und anstecken vom Bricklet selbst was ja auch ein Reset ist ein Reset Bus hilft nichts. Über meine Programm bekomme ich dann aber für einige Sensoren noch die Werte geliefert. Das Lesen der Sensoren sieht bei mir so aus und wird pro Onewire Bricklet durchgeführt. Aktuell ist aber nur eines angeschlossen. for i in self.onewire: i.reset_bus() # setzt den Bus zurück searched = i.search_bus() if not confeach: for x in searched[0]: i.write_command(x, 68) # CONVERT T (start temperature conversion) time.sleep(1) # Wait for conversion to finish for x in searched[0]: if confeach: # Das wird nur ausgeführt wenn es einen oder mehrere Sensoren gibt die neu sind oder neu am bus i.write_command(x, 78) # WRITE SCRATCHPAD i.write(0) # ALARM H (unused) i.write(0) # ALARM L (unused) i.write(127) # CONFIGURATION: 12-bit mode i.write_command(x, 68) # CONVERT T (start temperature conversion) time.sleep(0.75) # Wait for conversion to finish i.write_command(x, 190) # READ SCRATCHPAD t_low = i.read().data t_high = i.read().data temperature = t_low | (t_high << 8) if temperature > 1 << 12: temperature -= 1 << 16 temperature = temperature / 16.0 # Das ist nötig damit der Wert stimmt crc = hex(x)[2:4] family = hex(x)[-2:] address = hex(x)[(2 + len(crc)):(len(hex(x)) - len(family))]
  2. Danke für deine Antwort. Ist das dann ein Fehler im Brickelt selbst da ja der CRC so nicht stimmt oder? Es reicht sein Softwarereset aus um wieder richtige Werte zu bekommen. Ein und Ausstecken vom Bricklet ist nicht nötig. Ist es möglich das einer oder merhere Sensoren da Probleme machen? Wobei es ja nach einem Brickletreset wieder funktioniert. Nach einigen Stunden erscheinen dann eben auch diese Geistersensoren auf dem Bus welche einen neue Adresse haben und den Temperaturwert von -0,1C und die echten Sensoren sind nicht mehr am Bus ersichtlich. Wie könnte man einen eventuell defekten Sensor finden? Und was genau macht der Brickletreset mit dem Bus?
  3. Hast du eine Idee was ich versuchen könnte? Oder wo das Problem liegen könnte? Vielen Dank.
  4. Danke für deine Antwort. Der Screenshot ist aufgenommen wo die werte passen. Also nach einem Reset vom Bricklet. Auf das Ergebnis was du schreibst bin ich auch gekommen. Ich verstehe es aber nicht. Der CRC Wert wird ja vom Sensor gesendet oder wird der im Brickviewer berechnet?
  5. Hallo, ich habe folgendes Problem. Ich bin dabei einen Temperaturlogger zu erstellen welcher auf DS18B20 aufbaut. Ich lese aktuell 18 Sensoren vom Typ DS18B20 über Onewire ein. Grundsätzlich funktioniert das ganze. Ich bekomme Temperaturen und schreibe diese in eine Datenbank. Das Problem was ich habe das nach etwa 12h (manchmal mehr, manchmal auch weniger Zeit) sich das Onewire Brickelt so verhält das es entweder gar keine Sensoren mehr findet oder Zombis liefert. Bedeutet neue Sensoradressen mit den Messwerten -0,1C. Sobald ich das Onewire Bricklet Resete ist wieder für einige Stunden ruhe und die Sensoren funktionieren alle und liefern passende Messwerte. Bei der Bustopologie habe ich auf eine verteilten Stern gesetzt. Ich habe drei Unterverteiler wo jeweils ca. 6 Sensoren angeschloßen sind. Zusätzlich habe ich dort jeweils einen 10k Pullup verwendet um den Bus zu stabilisieren. Als Spannungsversorgung verwende ich die internen 5V vom Onewire Bricklet. Gemessen mit einem Multimeter bricht die Spannung nicht ein. Es ist für mich nicht schlimm fals ich das Onewire Modul öfters mal Reseten muss. Ich möchte nur gerne verstehen woher der Fehler kommt? Aktuell Resete ich das Modul ca. alle 2h um sicher keine falschen Messwerte zu protokollieren. Ich habe gelesen das die Sensoren auch einen CRC haben zum prüfen der Werte. Ehrlich gesagt habe ich das einfach nicht verstanden wie ich das anzuwenden habe. Als Beispiel Habe ich hier einen Screenshot der aktuellen Sensoren angefügt. Es gelingt mir aber nicht den CRC über die angeführte Adresse zu berechnen. Auf dieser Seite kann man CRC berechnen lassen: https://crccalc.com/ Jedoch komme ich nie auf den hier angeführten CRC egal was ich angebe. Wie wäre das umzusetzen? Oder gibt es andere Möglichkeiten die Zuverlässigkeit zu erhöhen? Danke für eure Hilfe. Gruß
  6. Moin, danke für deine Antwort, komme leider erst jetzt dazu deine Antwort umzusetzen. Ist es ein Problem wenn ich die Registrierung von Callbacks für ein Modul mehrfach ausführe? Wird dann der Callback mehrfach ausgeführt? Danke.
  7. Hallo, ich versuche gerade mehrere IO16 Module mit angeschloßenen Tastern auszuwerten, dazu möchte ich Callbacks verweden. Wenn ich bei den Callbacks bei jedem Modul also die selbe Funktion angebe bekomme ich in der Funktion ja nicht mit von welchem Modul jetzt der Aufruf gekommen ist oder? Mein Workaround wäre jetzt gewesen für jedes Modul eine eigene Fuction zu schreiben welche im Grunde die Callbackfuntion mit der UID nochmals aufruft. So kann ich das Modul identifizieren. Meine Frage geht das auch anders oder habe ich wiedermal etwas übersehen? Grüße Markus
  8. Danke für deine Antwort :-) Ja das ist eine super Idee. Eine Frage hätte ich da jetzt aber noch. Verstehe ich das richtig das diese Regelen zu jedem Zeitpunkt ausgeführt werden können und das Ergebnis dann von den aktuellen Zuständen der Sensoren und Parameter abhängt? Sobald eine Änderung passiert werden alle Regelen nacheinander abgearbeitet wobei eben die letzte Regel im grunde die Entscheidungshoheit hat. Das bedeutet ich definiere einen Abfragezyklus für alle Sensoren bzw. Eingänge. Und dannach wird dieses Regelset aufgerufen. Ich muss aber beim erstellen dieses Regeln aufpassen das sich diese möglichst nicht gegenseitig aushebeln. Darauf habe ich noch gar nicht gedacht. Das hat natürlich den Vorteil das die Regeln "dümmer" werden können und nicht warten müssen bis etwas passiert. Habe ich das so richtig verstanden? Danke. Gruß Markus
  9. Ich würde mich über eine kurze Rückmeldung sehr freuen. Vielleicht auch über die Bestätigung das es hier nichts gibt außer alles selbst zu machen. :-)
  10. Hallo zusammen, ich bin gerade dabei ein aufwendigeres und umfangreiches Projekt mit den Tinkerforge Modulen in Python umzusetzen. Es geht um eine Anlagensteuerung/Prozesssteuerung. Wobei hier viele Temperatursensoren ausgewertet und verarbeitet werden müssen. Aktuell sind es ca. 30 Sensoren, welche aber durchaus noch mehr werden können. So wäre 100 Sensoren auch möglich. Abhängig von den Temperaturwerten oder anderen Ereignissen sollen Aktionen passieren(Pumpen, Motoren, Ventile, Kompressoren, LEDs). Es müssen auch diverse Parameter in das System immer wieder eingegeben und aktualisiert werden. Bin nun soweit alle Sensoren mithilfe eines ORM(peewee) in eine Datenbank zu legen und die Werte entsprechend auszuwerten. Nun stehe ich aber gerade vor der Überlegung wie ich diese für mich komplexe Struktur umsetzen soll. Die Parameter sollen natürlich auch in die Datenbank. Folgende Struktur hätte ich mir aktuell überlegt: Tinkerforge LCD mit einer Menüstruktur die über Haupt und Unterpunkte verfügt und über einen Drehencoder angesteuert werden soll. So eine Art Orderstruktur in der die Sensorwerte als auch die Parameter geändert werden können. Ich habe zwar gesehen, dass es ein Menü für das Display gibt aber ich denke nicht das ich dieses auf meinen Fall adaptieren könnte? Dann benötige ich eine Arte Modus (Anlagenzustand) Struktur also in welcher sich die Anlage gerade befindet. Es dürfen z.B. gewisse Ventile oder Motoren nur dann angesteuert werden, wenn z.B. Sensoren einen gewissen Wert nicht überschritten haben. Das Ganze kann manuell gesteuert werden oder soll vom User über Regeln möglich sein. Beispiel. Sensor 0 > 30C° und Sensor 14 < 50°C and Systemmodus = “no Errors” Dann Schalte Motor1 ein bis Sensor 0 < 10°C Jetzt muss natürlich berücksichtig werden, wenn z.B. in der Zwischenzeit ein Error passiert das diese Regel abgebrochen werden sollte. Jetzt wäre es natürlich möglich das Ganze in If else in python direkt abzubilden jedoch wäre das für den User nur schwer möglich selber Regeln zu definieren. Einen für mich derart kompliziertes verknüpftes aber dennoch dynamisches System habe ich noch nie benötigt. Jetzt habe ich versucht zu suchen ob es hier bereits etwas gibt auf dem ich Aufbauen könnte. Bzw. was mir die Arbeit erleichtert, aber nichts wirklich gefunden. Meine Frage daher, hatte jemand schonmal so ein Problem und wie hat er es gelöst. Oder eine Idee wie ich das ganzen angehen sollte? Vielleicht auch Tipps? Was ist von meiner Struktur zu halten? Ich hoffe ich habe mein Problem verständlich dargestellt. Wenn nicht bitte ich um eine kurze Rückmeldung dann möchte ich es gerne nochmals Versuchen. Danke für eure Hilfe. Grüße Markus
  11. Hallo, ich habe mal eine Verständnisfrage, vielleicht stehe ich auch nur auf dem Schlauch 😅 Im Beispiel von hier: https://www.tinkerforge.com/en/doc/Tutorials/Tutorial_Rugged/Tutorial.html wird das LCD immer nur über einen Callback aufgerufen welcher z.B. von einem Sensor oder Taster ausgelöst wurde. Und dann wird geprüft ob das Objekt für das LCD nicht None ist. Also es wurde schomal etwas zugewiesen. Was ist aber wenn das LCD schon mal angesteckt war aktuell aber nicht. Also das Objekt einen Wert hat. Hier würde es doch zu einem Laufzeitfehler kommen oder? Gleiches Thema. Wie verhält sich das ganze wenn ich Ausgänge Schalten möchte die zwar schonmal angesteckt waren jedoch (Das Objeckt somit einen Wert hat) aktuell nicht mehr verbunden sind? Wie sollte man dies am besten lösen? Gibt es eine Prüfung ob das Objekt noch angeschloßen ist und reagiert? So eine Art Ping? Eine weiter Frage wäre noch. Ich möchte außerhalb dieser Klasse die Objekte z.B. das LCD ansprechen. Wie kann ich nun sicherstellen das die Nachricht am LCD angekommen ist bzw. es zu keinem Laufzeitfehler kommt ohne jedesmal den Aufruf des Objektes in einen try catch anweisung zu packen. Denn es kann ja sein das das Display zum Beispiel noch gar nicht verbunden war. Bzw. aktuell nicht verbunden ist. Ich hoffe mich verständlich ausgedrückt zu haben. 😀 Ich würde mich über Vorschläge oder Beispiele freuen. Danke für eure Hilfe. Grüße
  12. Hallo, ich versuche jetzt schon länger eine CRC Prüfung der DS18B20 umzusetzen. Scheitere aber daran. Mein Code funktioniert zwar aber es ergeben sich meistens die Falschen CRC Werte. Hat das vielleicht schomal jemand umgesetzt für die DS18B20 Sensoren? Bzw. wie stellt ihr sicher das die richtigen Werte ankommen? Hier mal ein Codeausschnitt Achtung es wird die lib crc8 benötigt. hash = crc8.crc8() string = address # Onewire Modul Adresse in HEX stringoutput = '' for q in range(0, -12, -2): stringoutput = '/x' + string[-2:] + stringoutput string = string[:-2] print(stringoutput.encode('utf-8')) hash.update(stringoutput.encode('utf-8')) print(hash.hexdigest()) print(crc) Output wäre dann sowas: b'/x4/x16/x63/x9d/x1e/xff' 24 8c b'/x4/x16/x62/x4d/x71/xff' b5 58 b'/x4/x16/x62/x2b/x63/xff' 3e 3e Es werden 3 Sensoren geprüft jedoch nur beim letzten stimmt auch der CRC zusammen. Würde mich über jede Hilfe/ Tipps freuen :-)
  13. Vielen vielen danke. Das war das Problem. Da habe ich jetzt lange gesucht und immer an der falschen Stelle gesucht! Problem erledigt! Danke!😃
  14. Hallo Zusammen, ich Versuche eine Python Methode zu schreiben welche über einen eigenen Thread DS18B20 Temperatursensoren ausließt und in eine globale Variable schreibt. Der Code funktioniert auch wenn ich ihn nicht in einen Thread auslagere Vielleicht kann mir jemand sagen was ich falsch mache? Hier der Code: import time import threading from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_one_wire import BrickletOneWire HOST = "localhost" PORT = 4223 tempsensors = [ {"sensor": 0, "address": "123", "found": False, "temperature": 0.0, "identifier": 0, "deviceobject": None}, \ {"sensor": 1, "address": "123", "found": False, "temperature": 0.0, "identifier": 0, "deviceobject": None}, \ {"sensor": 2, "address": "3456", "found": False, "temperature": 0.0, "identifier": 0, "deviceobject": None}, \ ] # Hier sollen alle Sensoren die bekannt sind und verwendet werden aufgeführt sein. Achtung das muss händisch erledigt werden tempsensorsnew = [] # Hier sollen alle Sensoren Automatisch eingetragen werden welche noch nicht in die Liste aufgenommen wurden class Rugged: def __init__(self): self.onewire = [] # Liste erzeugen wo die Onewire geräte eingefügt werden self.__threadonewire = threading.Thread(target=self.__getonewire) self.ipcon = IPConnection() # Create IP Connection self.ipcon.register_callback(IPConnection.CALLBACK_ENUMERATE, self.cb_enumerate) # Register Callback self.ipcon.register_callback(IPConnection.CALLBACK_CONNECTED, self.cb_connected) # Register Callback self.ipcon.connect(HOST, PORT) self.ipcon.enumerate() def cb_enumerate(self, uid, connected_uid, position, hardware_version, firmware_version, device_identifier, enumeration_type): global onewire if enumeration_type == IPConnection.ENUMERATION_TYPE_CONNECTED or enumeration_type == IPConnection.ENUMERATION_TYPE_AVAILABLE: if device_identifier == BrickletOneWire.DEVICE_IDENTIFIER: if not self.onewire: self.onewire = [BrickletOneWire(uid, self.ipcon)] time.sleep(0.5) else: for i in self.onewire: if i.get_identity() == uid: break # Wenn das Onewire Modul schon als Object in der Liste ist wird abgebrochen self.onewire.append(BrickletOneWire(uid, self.ipcon)) time.sleep(0.5) if not self.__threadonewire.is_alive(): self.__threadonewire.start() #self.__getonewire() # Wenn die funktion direkt anstatt des Threads ausgeführt wird funktioniert es def cb_connected(self, connected_reason): # Enumerate devices again. If we reconnected, the Bricks/Bricklets # may have been offline and the configuration may be lost. # In this case we don't care for the reason of the connection self.ipcon.enumerate() def __getonewire(self): global tempsensors global tempsensorsnew while True: print(tempsensors) print(tempsensorsnew) for i in self.onewire: i.reset_bus() # setzt den Bus zurück searched = i.search_bus() i.write(78) # WRITE SCRATCHPAD i.write(0) # ALARM H (unused) i.write(0) # ALARM L (unused) i.write(127) # CONFIGURATION: 12-bit mode i.write(68) # CONVERT T (start temperature conversion) time.sleep(1) # Wait for conversion to finish for x in searched[0]: i.write_command(x, 190) # READ SCRATCHPAD t_low = i.read().data t_high = i.read().data temperature = t_low | (t_high << 8) if temperature > 1 << 12: temperature -= 1 << 16 temperature = temperature / 16.0 crc = hex(x)[2:4] family = hex(x)[-2:] address = hex(x)[(2 + len(crc)):(len(hex(x)) - len(family))] #print("Family: " + hex(x)[-2:]) #print("CRC: " + hex(x)[2:4]) #print("Address: " + address.upper()) sensorfound = False for g in tempsensors: if g["address"].upper() == address.upper(): sensorfound = True g["found"] = True g["identifier"] = x g["deviceobject"] = i g["temperature"] = temperature break else: sensorfound = False if not sensorfound: for g in tempsensorsnew: if g["address"].upper() == address.upper(): sensorfound = True g["temperature"] = temperature break else: sensorfound = False if not sensorfound: tempsensorsnew.append({"sensornew": len(tempsensorsnew), "address": address, "temperature": temperature, "identifier": x, "deviceobject": i}) if __name__ == "__main__": Rugged() input('Press key to exit\n') Danke für eure Hilfe. Folgender Fehler kommt: Exception in thread Thread-1: Traceback (most recent call last): File "C:\Program Files (x86)\Python38-32\lib\threading.py", line 932, in _bootstrap_inner self.run() File "C:\Program Files (x86)\Python38-32\lib\threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "C:/...Control.py", line 74, in __getonewire searched = i.search_bus() File "C:\...Control\venv\lib\site-packages\tinkerforge\bricklet_one_wire.py", line 329, in search_bus ret = self.search_bus_low_level() File "C:\...Control\venv\lib\site-packages\tinkerforge\bricklet_one_wire.py", line 122, in search_bus_low_level return SearchBusLowLevel(*self.ipcon.send_request(self, BrickletOneWire.FUNCTION_SEARCH_BUS_LOW_LEVEL, (), '', 'H H 7Q B')) File "C:\...Control\venv\lib\site-packages\tinkerforge\ip_connection.py", line 1220, 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)
×
×
  • Neu erstellen...