NEWS
Rasp2 serial überwachen, per mqtt an iobroker übertragen.
-
Hallo, ich komme hier absolut nicht weiter....
Ich habe iobroker in einer VM in Proxmox. Ausserhalb will ich jetzt Funksensoren abfragen, deren Empfänger seine Daten im Interval per serieller Schnittstelle überträgt.
Diesen seriellen eingang möchte ich mittels Node Red überwachen und eingehende Daten per Mqtt an den iobroker übertragen.
Ich hatte es zumindest schon geschafft nen Timestamp aus Node Red an den iob zu senden, Kommunikation ist also da. Die Strings auf der Seriellen Schnittstelle kommen generell auch an. Nun fehlt es mir im Kopf wie ich das nun verkuddel das mir die Daten automatisch per mqtt gesendet werden.
könnt ihr mir hier evtl. weiter helfen?
-
@beliar_666 Nun wo ist das Problem - Du hast doch in NodeRed auch mqtt Nodes. Grundsätzlich kannst Du Daten aus NodeRed direkt an den iob schicken (mittels iobroker Out Nodes) oder über mqtt Nodes an einen mqtt Broker.
Wenn Du die gewünschten Daten auch noch in NodeRed bekommst - dann sollte es doch kein Problem sein einen Flow von IN zu OUT zu basteln.
-
@mickym genau da liegt ja das Problem. wie überwache ich die serielle Schnittstelle? Mit Serial in passiert eben nichts. Und vor allem soll er übertragen sobald seriell etwas herein kommt.
Für jemanden der sich mit Node Red super auskennt mag das ganz simpel sein, aber für einen Noob ist das erstmal ne gewaltige Hausnummer.
Aus Node Red an iob per mqtt klappte ja schon, nur wie nun die seriellen Daten in den Flow bekommen.... -
Nun entweder gibts einen Adapter im iobroker, der Dir die Daten auslesen kann und in entsprechende Datenpunkte schreibt, oder Du verwendest dafür eigens geschriebene NodeRed Nodes wie so was:
https://flows.nodered.org/node/node-red-node-serialport
@beliar_666 sagte in Rasp2 serial überwachen, per mqtt an iobroker übertragen.:
Mit Serial in passiert eben nichts.
Das heißt Du hast diese Nodes schon installiert? - Nun dann musst Du ggf. schauen, ob die serielle Schnittstelle überhaupt frei ist oder entsprechende angesprochen werden kann.
So wie ich sehe - kann man mit der InNode entsprechende serielle Schnittstellen erkennen lassen - muss diese dann aber noch konfigurieren
Das heißt die serial-port Node muss händisch konfiguriert sein und die serial in Node bezieht sich auf diese.
So interpretiere ich den Orgnialtext:
Input
Reads data from a local serial port.Clicking on the search icon will attempt to autodetect serial ports attached to the device, however you many need to manually specify it. COM1, /dev/ttyUSB0, etc
-
@mickym Danke! Aaaalso, soweit habe ich das nun:
Daten werden seriell erfasst und landen nun per Mqtt im Iobroker. Das klappt nun schon mal.
Aaaber, nun hat mein Datenpunkt keinen eigenen Ordner sondern liegt direkt in mqtt.0. wie bekomme ich das nun in einen Unterordner.
Und dann wäre da noch eine kosmetische Frage: Ich habe 2 verschiedene Datensätze "1 v=2968&c=26&t=2052&h=4400&f=1&sy=1&rssi=-890&fo=1647&be=0" und "2 v=3186&c=11&t=3584&h=1850&f=1&sy=0&rssi=-1015&fo=3601&be=2" Die muss ich eh noch parsen, aber wäre es auch irgendwie möglich die schon von vorn herein in unterschiedliche Datenpunkte zu schreiben? Die Ziffern am Anfang sind jeweils die Kennungen der Sender (1 und 2).
-
@beliar_666 Mach ein Objekt mit Array draus - und dann nutzt Du meinen Subflow bzw. Datennode.
Die legt Dir die Struktur nicht im mqtt sondern im iobroker an. das macht aber auch mehr Sinn als über mqtt in iobroker.
Ich mach das mal schnell für Deine beiden Beispielstrings bevor Du wieder Strings manipulierst.
Hier der Flow:
-
@mickym Danke, aber entweder stehe ich grad wieder auf dem Schlauch, oder wir haben etwas aneinander vorbei geredet.
Mein Node Red läuft ausserhalb vom IoBroker auf einem seperaten Pi, der sonst nichts mit IoBroker zu tun hat.
Den Funkempfänger kann ich so ohne weiteres nämlich nicht an die VM in der IoBroker läuft anbinden.Und wenn ich das jetzt richtig interpretiere dann ist dein Flow für die Node Red Instanz in IOBroker, oder?
-
@beliar_666 sagte in Rasp2 serial überwachen, per mqtt an iobroker übertragen.:
Und wenn ich das jetzt richtig interpretiere dann ist dein Flow für die Node Red Instanz in IOBroker, oder?
JA - war es! - aber hab ihn nun geändert, sodass er auch auf einem Standalone Node-Red laufen müsste.
So habe den NodeRed Flow etwas abgeändert und die iob Pfade in mqtt Pfade gewandelt:
Damit musst Du nur noch statt der Debug Node eine mqtt Node dran hängen. Die Ordnerstruktur gibst Du in der msg.top ein - bevor der Subflow gestartet wird.
Falls Du nicht alle Objekte brauchst - kannst Du ja auch nach der JOIN Node direkt auf die Werte zugreifen. Nach der JOIN NOde hast Du fertige JAVA-Objekte über die zum Beispiel payload.fo auf den einzelnen Wert zugreifst.
-
@mickym Ok, im Großen und Ganzen schaut das plausibel aus, aber wie teile ich nun meine Abfrage auf einem seriellen Port, der mir beide Strings liefert auf, das ich 2 getrennte Zweige habe?
-
@beliar_666 Du brauchst ja vielleicht keine 2 Zweige ich habe keine Ahnung was Du mit Datensatz 1 oder 2 meinst und wie sich die Unterscheiden. Ich weiß doch auch nicht was aus Deinen seriellen Nodes rauskommt und wie Du die Datensätze auseinanderhälst. Du hast das doch geschrieben. Geht ja auch ein Datensatz bzw. Ast. Wenn Du nur 1 Ast nimmst, dann siehtst Du ja, dass damit immer wenn alle 9 Parameter voll sind - eine Nachricht generiert wird.
Ich habe Dir im Prinzip eine Vorgehensweise gezeigt, wie man diese Strings über ein Objekt handhabbar machst. Die Details musst Du halt implementieren.
-
@mickym 1 Serieller Node der einmal den Datensatz 1
1 v=2968&c=26&t=2052&h=4400&f=1&sy=1&rssi=-890&fo=1647&be=0
und einmal Datensatz 2
2 v=3186&c=11&t=3584&h=1850&f=1&sy=0&rssi=-1015&fo=3601&be=2raus gibt. Je nach dem von welchem Sensor dann das Signal kommt steht wie dort abgebildet vorne dran eine 1 oder eine 2, das sind die Kennungen der Funksensoren. Alles was danach steht sind die Werte wie Akku, Temp, Feuchtigkeit etc...
Dachte das hatte ich oben schon klar genug formuliert. Also 1 Serieller Empfänger, der 2 Signale liefert, die ich getrennt haben möchte.
Der Ansatz mit den 2 Zweigen ist somit eigentlich gar nicht verkehrt, nur wie bekomme ich aus eben diesem einen Node 2 getrennte Zweige... -
@beliar_666 Nun ich dachte Du hast das Prinzip des Flows verstanden .
Dann hängst Du einfach diese Change mit der Switch Node vorne dran.
Hier die beiden Nodes mit der switch Node:
Du kannst das auch in einer anderen Eigenschaft mitschleppen und dann die Zahl in msg.top unterbringen - dann langt auch ein Ast. Dann braucht man nicht für jeden Sensor einen Ast machen.
-
Nein ao komme ich nicht weiter. Bei mir kommen hinter Switch keine Daten an. Davor aber schon.
-
@beliar_666 OK - ich kann den Flow nicht mehr zurück importieren - weil die Importfunktion ein Problem mit den regulären Ausdrücken hat. In Zukunft bitte den Export in </> Code Tags.
Aber ich habe trotzdem gesehen, wo das Problem ist. In der Switch Node steht msg.top da muss aber stehen msg.topic.
Wenn die Strings so sind, wie Du sie unten gepostet hast - dann die Change und Switch Node wie folgt konfigurieren - hierdie Screenshots - erstmal gesamt - ich habe natürlich wieder die Inject Nodes anstelle der seriellen Node hingehängt um den Input zu simulieren:
So die erste Change Node - da wird der Input scheitern schaut so aus. Die musst Du halt aus dem Screenshot nun selbst abbilden.
Achte darauf dass Du am Anfang beim Ändern auf reguläre Ausdrücke gestellt hast .* und dann kannst Du sowohl beim topic oder payload den gleichen regulären Ausdruck verwenden:
(\d)\s(.*)
Das msg.topic ist dann $1 und msg.payload ist $2.
Die switch Node muss so aussehen:
Achte auf Typ und das nach msg.topic unterschieden wird - wie in der Change Node zuvor definiert:
-
@mickym sagte in Rasp2 serial überwachen, per mqtt an iobroker übertragen.:
Also nach Change teilt er mir die 2 auf, siehe Screenshot. Aber der Switch blockt wieder. Nachg dem Switch bleibt die Ausgabe wieder leer.
-
@beliar_666 Ja passt doch - der switch teilt das dann auf die beiden Äste. ggf. muss man am Schluss noch die Zeilenschaltung entfernen. - Du könntest den regulären Ausdruck nochmals wie folgt ändern
(\d)\s(.*)\s
Mach halt mal einen Screenshot des switch hast du msg.top gegen msg.topic geändert wie gesagt?
-
-
@beliar_666 Nun vielleicht ist da irgendein Steuerzeichen drin, dass ich nicht sehe.
Dann mach mal in dem Switch statt == 1 ==> enthält 1 bzw. enthält 2
-
@beliar_666 Andernfalls zeig mal den Screenshot dieser Debug-Nodes mit dem vollständigen Nachrichtenobjekt und klappe bitte alle Daten aus (Pfeil nach unten)
-
@mickym Genau das war es so wie es ausschaut kommen jetzt Daten hinterm Switch an.
Aber nun kam mir grad noch etwas in den Sinn, wenn jetzt weitere Sender hinzu kommen, die dann als Kennung 0, 3, 4, 5, etc. haben, wie binde ich die dann in den change ein? Oder geht das dann gar nicht?