Frohes Fest,
ich habe das mit ein bisschen rumprobieren ohne modbus hinbekommen. Kurz zusammengefasst mit NMEA forwarding im Teltonika RUTX50 und im VanPI nur mit NodeRed und den Paletten die es eh schon gab, TCP in und NMEA.
Lang bzw. komplette Anleitung:
Im Router habe ich unter Services → GPS → NMEA forwarding aktiviert.
Bei den NMEA sentences habe ich lediglich GPGGA aktiviert:
Dann habe ich in NodeRed eine tcp in Node genutzt und auf Listen 8500 gestellt. Der Port war der Default beim Teltonika, geht aber auch jeder andere. 8500 könnte mit der 2nd Node Red Instance kollidieren, sofern man die aktiviert hat.
Dann hab ich mir aus dem Connections Flow einfach die Filter GPGGA Funktion geklaut und die beiden Nodes die danach kommen, NMEA und Set Variables.
[{"id":"91d071a3482c2afc","type":"group","z":"1e6ef8f9be1549aa","name":"GPS","style":{"label":true},"nodes":["bef94a48cc8ac545","c6c775612405a49b","6dcaf91a393607aa","21665260d560f605"],"x":54,"y":119,"w":752,"h":82},{"id":"bef94a48cc8ac545","type":"tcp in","z":"1e6ef8f9be1549aa","g":"91d071a3482c2afc","name":"","server":"server","host":"","port":"8500","datamode":"stream","datatype":"utf8","newline":"\\n","topic":"","trim":false,"base64":false,"tls":"","x":140,"y":160,"wires":[["21665260d560f605"]]},{"id":"c6c775612405a49b","type":"nmea","z":"1e6ef8f9be1549aa","g":"91d071a3482c2afc","name":"","property":"payload","outputProperty":"payload","x":530,"y":160,"wires":[["6dcaf91a393607aa"]]},{"id":"6dcaf91a393607aa","type":"function","z":"1e6ef8f9be1549aa","g":"91d071a3482c2afc","name":"set variables","func":"if (msg.payload.hasOwnProperty(\"sentence\")) {\n flow.set(\"usb_gps\", true)\n}\nelse {\n flow.set(\"usb_gps\", false)\n}\nif (msg.payload.hasOwnProperty(\"sentence\") && msg.payload.lat != \"\") {\n global.set(\"latitude\", msg.payload.lat);\n global.set(\"longitude\", msg.payload.lon);\n global.set(\"gps_updated\", new Date()); // date needed to show when the last valid gps data has arrived (in smartphone app)\n return msg\n}\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":710,"y":160,"wires":[[]]},{"id":"21665260d560f605","type":"function","z":"1e6ef8f9be1549aa","g":"91d071a3482c2afc","name":"filter&validate gpgga","func":"function isGgaSentenceValid(ggaSentence) {\n // Check if the sentence starts with '$' and ends with a valid checksum\n if (ggaSentence.startsWith('$')) {\n const sentenceParts = ggaSentence.split('*');\n\n // Ensure there are two parts (NMEA sentence and checksum)\n if (sentenceParts.length === 2) {\n const nmeaSentence = sentenceParts[0].substring(1); // Exclude the leading '$'\n const checksum = sentenceParts[1].trim();\n\n // Calculate the checksum and compare with the provided checksum\n const calculatedChecksum = calculateChecksum(nmeaSentence);\n return calculatedChecksum === checksum;\n }\n }\n\n return false;\n}\n\nfunction calculateChecksum(sentence) {\n let checksum = 0;\n\n // XOR each character between '$' and '*'\n for (let i = 0; i < sentence.length; i++) {\n if (sentence[i] === '*') {\n break;\n }\n checksum ^= sentence.charCodeAt(i);\n }\n\n // Ensure the checksum is two characters long\n return checksum.toString(16).toUpperCase().padStart(2, '0');\n}\n\nif (msg.payload.includes(\"$GPGGA\")) {\n // Example GGA sentence\n msg.payload = msg.payload.trim()\n const ggaSentence = msg.payload\n\n // Check if the GGA sentence is valid\n const isValid = isGgaSentenceValid(ggaSentence);\n\n if (isValid) {\n return msg;\n } else {\n return null\n }\n}\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":340,"y":160,"wires":[["c6c775612405a49b"]]}]
Funktioniert. Im Webinterface vom VanPi sehe ich zwar keine Karte (cannot get /ui/map), aber in der App gehts und im WebIF sehe ich ich auch die Latitude und Longitude. Das ganze ist mit einer frisch installierten 2.0.4 getestet. Aut dem RUTX50 läuft RUTX_R_00.07.11.3.
VG Maurice