Jump to content

1-wire Bricklet via MQTT und mehrere angeschlossene Sensoren (ds18b20) ?


Recommended Posts

Geschrieben

Ich wĂŒrde gerne mehrere ds18b20 Temperatursensoren an einem 1-wire Bricklet betreiben und via MQTT (Mosquitto, Node-RED) auslesen (wohl gĂŒnstiger als mehrere PT100 oder Thermoelement-Bricklets).

Ich habe es relativ schnell geschafft, von einem einzelnen angeschlossenen Temperatursensor gĂŒltige Werte zu bekommen (auch dank der guten Beispiele hierfĂŒr).

Wenn ich jetzt aber mehrere auslesen möchte, muss ich den "identifier" von 0 auf den tatsÀchlichen Wert des jeweiligen auszulesenden Sensors setzen, um sie unterscheiden zu können (?). Ich sehe auch im BrickViewer nach einem Klick auf "SearchBus" die ID (ok hier als hex, muss ich in meinem Fall mit NodeRED noch nach dezimal konvertieren).. Ersetze ich in meinem Test-Flow den "identifier" von 0 auf diesen Wert, sind die ausgelesenen Temperaturwerte aber leider unsinnig.

Ich habe zur ÜberprĂŒfung, ob ich die korrekten Identifier verwende, versucht die identifier der Teilnehmer am Bus via MQTT auszulesen; dazu gibt es ja den MQTT request auf dem topic "tinkerforge/request/one_wire_bricklet/<meineID>/search_bus". Versuche ich das, kommt aber nichts zurĂŒck; ich bin relativ sicher, dass ich wenn was kĂ€me es mitbekommen wĂŒrde - "reset_bus" geht nĂ€mlich und es gibt eine sinnvolle Antwort; requeste ich z.B. als Test das topic "search-bus" (falsch geschrieben), bekomme ich auch eine Fehlermeldung.

Scheint mir ein Bug in der 1-Wire Firmware?

Hat jemand das schon einmal versucht?

Danke im Voraus

image.png.8e7573165ced0bb0f0f4f7f09525ff6d.png

Geschrieben

Danke fĂŒr die schnelle Antwort.

Also ich kann mit der oben angehÀngten Version der mqtt Bindings zumindest den identifier auslesen. Der ist tatsÀchlich anders als ich mir aus den BrickViewer-Ausgaben errechnet hatte.. komisch, aber ok..

Leider bin ich beim Auslesen der Temperaturen aber immer noch nicht erfolgreich - ich glaube, es liegt daran, dass die "Auflösung" des Zahlenformats (MQTT, vielleicht aber auch Node-RED) an einer Stelle zu gering ist (vielleicht nicht ganz prÀzise formuliert).

Der "identifier" ist: 72366772975674664 (Antwort auf search_bus kam als String Object (JSON)).

Gebe ich den Wert (als Zahl, nicht als String) in meinem Subflow ein, wird ĂŒber MQTT der identifier als Payload mit einer Zahl (kein JSON-String) vom Wert 72366772975674660 ĂŒbertragen.

Das kann ja eigentlich nicht gehen?

Ich habs als JSON String versucht, dann gibt das MQTT Binding aber die Fehlermeldung:

<ERROR> MQTT bindings: Call write_command of one_wire_bricklet N7s: Argument identifier was not of expected type int.

Ideen? Hoffe, ich habs prÀzise genug formuliert..

 

 

Geschrieben

Du hast vermutlich folgendes Problem: Die Identifier von search_bus sind 64-Bit-Zahlen, die die MQTT-Bindings auch ganz normal behandeln. Node-RED parst das JSON und wandelt dabei die Zahl in einen double um, mit dem Ganzzahlen nur bis 53 Bit korrekt darstellbar sind. Das passiert, weil in Javascript der Zahl-Typ immer double ist (es sei denn man benutzt BigInt, das ist aber recht neu).

Die Lösung dafĂŒr ist, Node-RED den Payload nicht parsen zu lassen, sondern hĂ€ndisch auf dem JSON-String zu arbeiten um dir die Zahlen rauszuziehen. Da mĂŒsstest du etwas Javascript schreiben und BigInt benutzen.

Damit das in Zukunft einfacher ist, werde ich in die MQTT-Bindings einen Javascript-KompatibilitÀtsmodus einbauen, der 64-Bit-Zahlen als Strings ausgibt, die man direkt in BigInt benutzen kann. Das wird aber voraussichtlich erst nÀchste Woche.

Geschrieben

Danke wiederum fĂŒr die schnelle Antwort.

Bin nicht sicher, ob ich richtig liege - vielleicht habe ich oben auch unklar formuliert.

Also ich kann definitiv den korrekten/kompletten Identifier vom Sensor aus dem Bricklet via MQTT auslesen. Ich empfange einen JSON String, kein JSON Objekt, deswegen stört die mangelnde Auflösung hier nicht - so sieht die Response Message aus in Node-RED:

image.png.8ffed8cf93019fc2c502d681e398effc.png 

Das Problem ist bei der anderen Richtung - also wenn ich Kommandos an das GerÀt mit dem entsprechenden Identifier SENDEN will.

Da muss ich anscheinend ein JSON-Objekt (Zahl) via MQTT senden; sende ich einen JSON-String wie in der Response ja auch gekommen war, dann kommt o.g. Fehlermeldung:

<ERROR> MQTT bindings: Call write_command of one_wire_bricklet N7s: Argument identifier was not of expected type int.

Sende ich stattdessen ein JSON Objekt mit dem Identifier als Zahl, dann wird die wegen mangelnder Genauigkeit verfĂ€lscht (sehe ich schon in Node-RED) und (das nehme ich an, habs nicht mit dem Oszi geprĂŒft, was wirklich auf dem 1-Wire anliegt) eben dort falsch gesendet.

Könntet ihr nicht einfach im MQTT Binding auch so einen JSON String akzeptieren? Vielleicht verstehe ich das aber auch falsch..

Ich kann ruhig ein paar Tage warten, bis das geht - wÀre ja eh schon super-schnell, vielen Dank. Mit Javascript Programmierung wollte ich eigentlich nicht anfangen,dann könnte ich ja gleich auf das MQTT verzichten..

Geschrieben

Ah das hatte ich tatsÀchlich genau falsch herum verstanden.

16 hours ago, cbachmann said:

Könntet ihr nicht einfach im MQTT Binding auch so einen JSON String akzeptieren?

Das sollte gehen. Ich pack es mal mit auf die Liste fĂŒr das nĂ€chste Release.

Geschrieben

Teste mal bitte die Version im Anhang. Du kannst damit jetzt Strings als Zahlen ĂŒbergeben (sogar mit z.b "0xCAFE", "0o777" und "0b1001" hexadezimal, oktal und binĂ€r).

Außerdem kannst du den Bindings das Argument "--int64-as-string" mitgeben, dann werden 64-Bit-Zahlen stattdessen als String in das JSON-Objekt eingefĂŒgt, damit du immer das JSON parsen kannst (und dann komfortabler damit arbeiten).

tinkerforge_mqtt_bindings_2_0_14_8f0ac4c1.zip

Geschrieben

Danke - damit geht es. Ich habe nicht alles ausprobiert, was Du geschrieben hast, sondern einfach nur den identifier als JSON string geschickt.

Leider kĂ€mpfe ich noch mit anderen Problemen - wenn das 1-Wire Bricklet angeschlossen ist, stĂŒrzt der komplette Brick-Stack ca. 1x am Tag ab; stecke ich ihn ab, geht es problemlos auch deutlich lĂ€nger. Meine Tests fahre ich gerade an einem zweiten Brick. Evt. gibt es einen Zusammenhang zu diesem Thema? Keine Ahnung..

Damit wÀre das hier beschriebene Problem aber gelöst.  Danke nochmal. Die anderen Dinge spÀter.

Geschrieben (bearbeitet)

Da hier auf meinen Thread verlinkt wurde, möchte ich mich kurz zu Wort melden.
Leider ist das Problem nach wie vor nicht gelöst, es ist aber schön wenn ich nicht der Einzige mit dem Problem bin.

Wie viele Sensoren verwendest du?

Welche KabellÀngen?

Ist es bei dir auch so, dass die LEDs vom Bricklet ausgehen oder werden "nur" keine Sensoren mehr gefunden?

bearbeitet von DoIT
Geschrieben

Nur 1 Sensor bisher.. KabellÀnge 50cm, glaube ich. Brick ist dann nach einigen Stunden komplett tot und braucht Reset, nicht nur das 1-Wire Bricklet.. ich muss zugeben, ich hatte Deinen Thread schon vor einiger Zeit gelesen - ich habe eben nochmal geschaut, ist bei mir wohl doch eine etwas andere Situation. Vielleicht sollte man den Link doch wieder entfernen. Ich habe erst wieder in ca. 1 Woche Zeit zum weiteren Experimentieren.

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