NEWS
Daten per Serieller Schnittstelle übertragen
-
Hallo zusammen,
ich möchte einige Sachen per Serial in Node Red an meinen Arduino senden, der Code ist alt und fix, kann nicht geändert werden.
Ich kann sehr gut einen String senden LEDON oder LEDOFF.[ { "id": "61c5ee22.b88f1", "type": "tab", "label": "Flow 4", "disabled": false, "info": "" }, { "id": "2b3000e4.63106", "type": "inject", "z": "61c5ee22.b88f1", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "LEDON", "payloadType": "str", "x": 370, "y": 340, "wires": [ [ "168de73c.72f521", "5aa5836f.d0a01c" ] ] }, { "id": "3f6f6ec7.f8afda", "type": "inject", "z": "61c5ee22.b88f1", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "LEDON", "payloadType": "str", "x": 370, "y": 420, "wires": [ [ "168de73c.72f521", "5aa5836f.d0a01c" ] ] }, { "id": "168de73c.72f521", "type": "serial out", "z": "61c5ee22.b88f1", "name": "", "serial": "e13e4297edea67b8", "x": 620, "y": 300, "wires": [] }, { "id": "5aa5836f.d0a01c", "type": "debug", "z": "61c5ee22.b88f1", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "statusVal": "", "statusType": "auto", "x": 610, "y": 440, "wires": [] }, { "id": "e13e4297edea67b8", "type": "serial-port", "serialport": "/dev/ttyACM0", "serialbaud": "57600", "databits": "8", "parity": "none", "stopbits": "1", "waitfor": "", "dtr": "none", "rts": "none", "cts": "none", "dsr": "none", "newline": "\\n", "bin": "bin", "out": "char", "addchar": "\\n", "responsetimeout": "100" } ]
Im Debug Fenster steht dann:
msg.payload : string[5]
"LEDON"Das \n wir automatisch durch die Config der Serial geschickt und wird auch auf dem Arduino erwartet.
Auf diese Weise werden ein paar Funktionen ein und ausgeschaltet, so weit so gut.
Nun hänge ich seit Tagen (und Nächten) vor dem Problem, dass ich auch Werte übertragen will.
Ich bin mittlerweile verwirrt was ASCII BUFFER STRING OBJECT anbetrifft und habe auch viel versucht mit dem Buffer Maker.
Auf der Empfangsseite habe ich das mit den Werten die ich bekomme mittlerweile mit dem Buffer Parser im Griff.
Da kommt eine ASCII Kennung gefolgt von floats int boolean etc. das klappt!Auf der Arduino Seite sieht das für einfache Befehle so aus:
if (strcmp(command, "LEDON") == 0 && !ledon) { digitalWrite(LEDON_PIN, HIGH); ledon = true;
Passt, keine Probleme bis hier, dann aber:
else if (strcmp(substr, "MSS:") == 0) { byte a = command[4]; byte b = command[5]; bool x = command[6] != 0; mss.configure(a, b, x);
Byte A und B sind Zahlen zwischen 0 und 255 und x als bool.
Also sehe das eigentlich so aus: MSS: 19 188 true
mss.configure(a, b, x) sollte dass die Werte erhalten mss.configure(19, 188, true);Ich bekomme das aber nicht zum laufen.
Als String geht es nicht da sonst aus 19 eine 1 und eine 9 gemacht wird.
Packe ich das in ein Array ["MSS:",19,188,true] geht das nicht.
Nehme ich den Buffer Maker und mache daraus eine Buffer sehe ich im Debug auch die passenden Werte.
Wenn ich den Buffer Maker dann mit der Serial verbinde, kommt erstmal eine Warnung da \n nur für Strigs ist.
Nehme ich das Kreuz in der Config von der Serial raus, also dass automatisch \n gesendet wird, passiert nix.Um das zu testen habe ich LEDON als ASCII Inject > BufferMaker ( ASCII länge 5) > Debug und Serial.
Buffer sieht gut aus, Werte passen, aber gesendet wird nix.Ich blicke da echt nicht mehr durch
-
Also ich hab mal die serielle Node auf ein Testsystem übertragen - allerdings besitze ich keine serielle Schnittstelle, um das zu testen.
Grundsätzlich sagst Du ja, dass es mit reinen Strings funktioniert.
Die BufferNodes habe ich auch mal installiert, die habe ich auch auf dem Produktivsystem, da der Parser immer sehr gut zur Analyse von Puffern zu gebrauchen ist. Wobei der aufgrund seiner enormen Funktionalität nicht einfach zu verstehen ist.
Die serielle Node sagt ja, dass bei einem Buffer nichts angehängt werden muss.
Wenn Du einen buffer rausschickst, darfst Du aber in der seriellen Konfig nichts spezifizieren oder Du musst den Code Hex eingeben.
Die haben auch ein sehr komplexes Beispiel mit geschickt (mit der Node) mitgeschickt - das muss man nur noch verstehen.
Jedenfalls wird ein komplexes JS Objekt in den Puffer gepackt -
@bavarian Was ich allerdings nicht verstehe - wenn Du Strings verschickst - warum dann keine JSON Strings.
Wenn der JS Code hier frei sit mit dem strcmp - da können wir doch das ganze Array schicken und das auf der Empfängerseite anlysieren? -
@bavarian So ansonsten habe ich es jetzt mal so hingebracht, dass das Array in einen Puffer geschrieben wird.
Diese Meldung
bekommst Du von der serial out Node - wenn Du einen Buffer schreiben willst, weil Buffer und String sich nicht vertragen.\n ist ja das Zeilenvorschubzeichen. Wenn Du das unbedingt brauchst, damit was geschickt wird, dann kann man das HEX eintragen und dann gibt es auch die Fehlermeldung beim Buffer nicht mehr:
Hier der Flow - ich hab allerdings für den Bool auch den Type Byte genommen - anders mag das Teil nicht.
Als Type Bool den letzten Parameter im Array für die Buffer Node zu verwenden funktioniert anscheinend nur, wenn das insgesamt ein Array ist.
In der Hilfe zur Parser Node steht es dann auch wohl so drin, das hier auch ein Array ausgegeben wird.
Im Prinzip bekommt man den Puffer auch ohne buffer Node hin - man muss allerdings Strings getrennt vom übrigen Array behandeln:
Hier der Code der Function Node:
var buffArr = []; var topic = msg.payload.shift(); buffArr.push(Buffer.from(topic)); buffArr.push(Buffer.from(msg.payload)); msg.payload=Buffer.concat(buffArr); return msg;
-
Ich kann auf der Arduino Seite nichts ändern, nicht weil ich nicht will sondern weil es sonst zu einer anderen Software nicht mehr passt.
Das mit dem \n ist gelöst mit 0x10 kann ich die Strings senden und bekomme auch mit dem Buffer keine Meldung mehr
Leider sehen aber auch nur die Debug Meldungen gut aus, es geht nichts raus.
Da der Arduino verbaut ist, sehe ich die RX/TX LED nicht, also noch eine Arduino genomme, Programm drauf und LED's ansehen.
String mit 0x10 angehangen und LED blinkt auf.
Ansonsten bleibt die RX LED aus, Debug Message kommt aber Serial passiert nix.Ich denke bevor ich mit dem Inhalt der Nachrichten weiter mache die ich senden will, sollte ich erstmal sicherstellen, dass da
aus dem Buffer auch Seriell gesendet wird. -
@bavarian Probier mal statt 0x10, 0x0A ich hab da dezimal statt hex 10 dezimal 10 genommen, sorry.
Alternativ auch CR - habe ich auch gelesen - also 0x0D.
-
DAS war es !
Statt \n eben nicht leer lassen sonden 0x0a sendenIch hab es nun als im Inject als JSON ["MSS:",89,27,1] das klappt, nun wird das ja von mir per klick ausgelöst.
Der JSON Datenpunkt sieht ja genauso aus, ändert sich aber ein Wert im DP wird nicht automatisch gesendet.
Muss ich hierzu noch was beachten?
Irgendein trigger setzten, wenn sich was im DP ändert bitte senden? -
@bavarian Na statt der Inject Node nimmst Du doch eine iobroker In Node und wenn der Wert neu geschrieben wird, dann triggert die Node auch. Vielleicht hast Du in der iobroker In Node was ausgefiltert zum Beispiel ACK=true oder so.
Du musst halt jetzt den ganzen Flow nehmen - iobroker in- json Node die das in Objekt konvertiert und dann halt in den Buffer Maker oder function Node.
Wenn all Events in der iobroker In Node spezifiziert ist, dann wird auch gesendet, selbst wenn sich gar nichts ändert und der Wert nur neu geschrieben wird.
funktioniert bei mir einwandfrei - hier der gesamte Flow - nur das halt bei Dir hinten die serial Node dranhängt:
Du sendest ja nicht einzelne Werte im JSON - sondern immer den Datenpunkt und der enthält ja den kompletten JSON String.
-
-
@bavarian Na freut mich - zusammen bekommt man das meist hin - auch wenn ich kein Arduino Board habe.
Ich lerne ja auch immer - nächstes Mal weiss ich dass man 0x0a in die serielle Node eintragen muss, wenn man Buffer überträgt - ausserdem habe ich mich ja wieder etwas mit der Buffer Node und der JS Buffer Funktion heute auseinandergesetzt. Dieses Wissen ist mir ja Gewinn genug und deswegen mache ich so was ja auch gerne, weil es mein eigenes Wissen und die Erfahrung vergrößert.
-
Wäre es auf diese Weise auch möglich einen Fingerprint Reader (zfm 20/40/60 etc) zu integrieren?
-
@hansi1234 sagte in Daten per Serieller Schnittstelle übertragen:
Es scheint wohl Libaries für Arduino bzgl. fingerprint zu geben - aber das müssen dann wohl Leute mit so einem Board sagen und wie die Befehle aussehen müssen. Es scheint aber üblich zu sein über die serielle Schnittstelle mit dem Board zu kommunzieren. Gibt auch im Netz einige Beispiele wie Fingerprint Sensoren an so ein Arduino angeschlossen wurden.
Ich kann dazu leider nichts beitragen.