NEWS
UDP empfangen und auswerten
-
Hi, ich befasse mich seit kurzem mit IoBroker, um langsam mal den Wildwuchs in geordnete Bahnen zu bekommen.
Ich habe im Haus verschiedene Geräte, die kommunizieren per udp broadcast mit selbst geschriebenem Protokoll. Z.B. sendet einer #23M19.5< das heisst dann, die Variable 23 hat den Wert 19,5
Das wird dann geparst, von dem Gerät, das den Wert verwendet, z.B. Display für die Aussentemperatur, und ein anderes Gerät schickt den Wert auf Thingspeak.
Nun will ich die werte in IoBroker reinbekommen, finde aber keinen "Adapter" der udp annimmt und dann z.B. über js parst und zur Verfügung stellt. Wie kann ich sowas angehen?
Viele Grüsse vom Newbie aus Spanien -
@gutty
Den Multicast-Adapter probiert? -
@paul53 Nein, weil "Have a uniform API available based on multicast communication and JSON formatted data transmission"
und ich momentan am implementierten Protokoll nichts ändern will/kann. Aber für zukünftige Sachen käme der wohl in Frage
-
Wenn Du Node-Red nutzt, da gibts per Default UDP Nodes.
-
@gutty
Man kann in der Javascript-Instanz udp-packet als zusätzliches NPM-Modul installieren. -
@paul53 sagte in UDP empfangen und auswerten:
@gutty
Man kann in der Javascript-Instanz udp-packet als zusätzliches NPM-Modul installieren.Na wenn er eh schon Node-Red nutzt dann wäre es halt eine zusätzliches Modul was geladen werden muss.
-
@mickym nein, node-Red benutze ich (noch?) nicht. werds mir anschauen. Wie gesagt, ich bin noch sehr neu im IoBroker.
Danke für die Infos
-
@gutty sagte in UDP empfangen und auswerten:
node-Red benutze ich (noch?) nicht.
Ein Fehler.
- Adapter installieren und auf gehts.
-
@mickym Nun, ich hab mich inzwischen etwas mehr mit befasst. Es war zu kompliziert gedacht. In Javascript direkt geht es am einfachsten:
const dgram = require('dgram'); const server = dgram.createSocket('udp4'); server.on('listening', function () { const address = server.address(); }); server.on('message', function (message, remote) { const text = message.toString(); var regex = /#03M(-?\d+\.\d+)</; var match = text.match(regex); if (match) { const zahl = Number(match[1]); setState('0_userdata.0.Druck'/*Druck*/, zahl, true); } regex = /#43M(-?\d+\.\d+)</; match = text.match(regex); if (match) { const zahl = Number(match[1]); setState('0_userdata.0.TempSonne', zahl); } regex = /#42M(-?\d+\.\d+)</; match = text.match(regex); if (match) { const zahl = Number(match[1]); setState('0_userdata.0.TempSchatten', zahl); } const numArray = [getState('0_userdata.0.ESP_Dach.Temp1'/*Temp1*/).val, getState('0_userdata.0.ESP_Dach.Temp2'/*Temp2*/).val, getState('0_userdata.0.ESP_Dach.Temp3'/*Temp3*/).val, getState('0_userdata.0.TempSchatten'/*TempSchatten*/).val, getState('0_userdata.0.TempSonne'/*TempSonne*/).val]; const lowestNum = Math.min(...numArray); const MaxNum = Math.max(...numArray); setState('0_userdata.0.NiedriegstTemp'/*NiedriegstTemp*/, lowestNum); setState('0_userdata.0.HoechstTemp'/*HoechstTemp*/, MaxNum); }); server.bind(6001);
Ein Grossteil davon stammt von ChatGPT, von Javascript habe ich noch so gut wie keine Ahnung.
-
@gutty sagte in UDP empfangen und auswerten:
von Javascript habe ich noch so gut wie keine Ahnung.
Na deswegen habe ich Dir ja Node Red empfohlen, wenn Du nicht codieren willst.
Aber ich will niemand zu seinem Glück zwingen. chatGPT kann das sicher besser.
-
@mickym naja, etwas codieren kann ich schon, Arduino C halt. Deswegen ist mir Code grundsätzlich lieber als Blöcke zusammen klicken.