NEWS
[gelöst] Einbindung GCM-320plus Radioaktivitätssensor
-
Hi,
keine Ahnung, ob das auch hier rein gehört - ich möchte meine Lösung zur Einbindung des GCM-320plus mittels USB-serial Adapter teilen, die relativ smart und einfach funktioniert, ohne viel Schnickschnack.
- Schritt: Die Daten müssen mal bei /dev/ttyUSB0 reinkommen - falls es hier Fragen gibt, gerne her damit
- node-red-node-serialport nachinstallieren.
- Node-RED Flow schreiben - unten mein Flow-Export dazu
- Mit dem iobroker out Node schreibe ich jede Minute den aktuellen Wert in ein User-Objekt rein.
[ { "id": "da8354a725a790f4", "type": "serial in", "z": "f54c133271527d6a", "name": "GMC-320", "serial": "15ad7491d36bd43d", "x": 440, "y": 180, "wires": [ [ "cfbb2d86219dcc97" ] ] }, { "id": "cfbb2d86219dcc97", "type": "function", "z": "f54c133271527d6a", "name": "function 3", "func": "//@superflip - 2025-03-25\n\nif (msg.payload && Buffer.isBuffer(msg.payload) && msg.payload.length > 0) {\n //read Buffer and write to local variable\n let buffer = msg.payload;\n let cpm = buffer.readUInt8(0);\n\n // check, if counter already exists\n if (!context.counterCPM) {\n context.counterCPM = 0; // Initialisiere den Zähler\n //first buffer is sometimes set to 128\n if (cpm == 128) {\n cpm=0;\n }\n }\n\n // calculate time since last reset\n let currentTime = new Date().getTime();\n if (!context.lastResetTime) {\n context.lastResetTime = currentTime;\n }\n\n //add new value to counter\n context.counterCPM += cpm;\n\n // if 60s are over\n if (currentTime - context.lastResetTime >= 60000) {\n // write msg.payload.total for further processing\n msg.payload = { total: context.counterCPM};\n // reset counter\n context.counterCPM = 0;\n context.lastResetTime = currentTime;\n }\n\n} \n\nreturn msg;\n", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 600, "y": 180, "wires": [ [ "32b1cdc92efb52a3" ] ] }, { "id": "32b1cdc92efb52a3", "type": "switch", "z": "f54c133271527d6a", "name": "", "property": "payload.total", "propertyType": "msg", "rules": [ { "t": "nnull" } ], "checkall": "true", "repair": false, "outputs": 1, "x": 750, "y": 180, "wires": [ [ "1992efb23bb5d735" ] ] }, { "id": "7446ba3b5074a20c", "type": "ioBroker out", "z": "f54c133271527d6a", "name": "CPM schreiben", "topic": "0_userdata.0.aussen.klima.radioactivity", "ack": "true", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 1140, "y": 180, "wires": [] }, { "id": "1992efb23bb5d735", "type": "change", "z": "f54c133271527d6a", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload.total", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 930, "y": 180, "wires": [ [ "7446ba3b5074a20c" ] ] }, { "id": "15ad7491d36bd43d", "type": "serial-port", "name": "", "serialport": "/dev/ttyUSB0", "serialbaud": "115200", "databits": "8", "parity": "none", "stopbits": "1", "waitfor": "", "dtr": "none", "rts": "none", "cts": "none", "dsr": "none", "newline": "0x80", "bin": "bin", "out": "char", "addchar": "", "responsetimeout": "10000" } ]
Interessant finde ich auch, dass ich dieses Mal massiv die Hilfe von ChatGPT in Anspruch genommen habe und bei Fehlern dadurch immer wieder auf die richtigen Hinweise gekommen bin. Vorallem hat mich beeindruckt, dass ich ChatGPT ein PHP-Modul als Beispiel mitgeteilt habe und die KI mir die entsprechenden Einstellungen dafür in JS extrahiert hat, das war extrem hilfreich.