https://github.com/9H5G/SteelSeries-Canvas
and my instrumentation node:
[{"id":"7d86b62a.703bf8","type":"serial in","z":"332c51b4.221c3e","name":"","serial":"dccf3159.48fe5","x":109,"y":177,"wires":[["e6a5e4f3.c92b08","c0beae78.24ccb","406dd6fa.495758","df9b82d1.7be03","c1d439a6.ead4f8","241518fc.6fa128","171223ff.8e825c","608e8a58.58cdc4","8ac6f874.721638","8a969ff6.950da"]]},{"id":"e6a5e4f3.c92b08","type":"function","z":"332c51b4.221c3e","name":"","func":"var index = msg.payload.indexOf(\"MWV\");\n\nif (index >0){\n\nvar split = msg.payload.split(\",\");\nmsg.ave = Number(split[3]);\nmsg.value = Number(split[1]);\nreturn msg;\n \n}\n","outputs":1,"noerr":0,"x":275,"y":171,"wires":[["711c93e8.76c74c"]]},{"id":"711c93e8.76c74c","type":"ui_template","z":"332c51b4.221c3e","group":"ccd5bb6e.50fd28","name":"Wind","order":2,"width":"6","height":"6","format":"<script src=\"/myjs/tween-min.js\"></script>\n<script src=\"/myjs/steelseries-2-min.js\"></script>\n<script>\nvar windDir1;\n (function(scope){ \n scope.$watch('msg', function(msg) {\n if (typeof(msg.value) != \"undefined\") windDir1.setValueAnimatedLatest(msg.value);\n if (typeof(msg.ave) != \"undefined\") windDir1.setValueAnimatedAverage(msg.ave);\n });\n })(scope);\n\n var sections = [steelseries.Section(10, 45, 'rgba(220, 0, 0, 0.3)'),\n steelseries.Section(45, 150, 'rgba(0, 220, 0, 0.3)'),\n steelseries.Section(315, 350, 'rgba(220, 0, 0, 0.3)'),\n steelseries.Section(210, 315, 'rgba(0, 220, 0, 0.3)')]\n\n // Define one area\n //areas = [steelseries.Section(0, 45, 'rgba(220, 0, 0, 0.3)')],\n\n windDir1 = new steelseries.WindDirection('canvasWindDir2', {\n size: 292,\n section: sections,\n lcdVisible: true,\n titleString: \"Wind Direction\",\n degreeScaleHalf: true,\n pointSymbolsVisible: false,\n lcdTitleStrings: ['Latest', 'Speed'],\n windspeed: true\n });\n \n windDir1.setFrameDesign(steelseries.FrameDesign.BLACK_METAL);\n windDir1.setBackgroundColor(steelseries.BackgroundColor.LIGHT_GRAY);\n windDir1.setPointerTypeAverage(steelseries.PointerType.TYPE17);\n windDir1.setPointerType(steelseries.PointerType.TYPE1);\n \n //windDir1.setLcdColor(steelseries.LcdColor.BLUE);\n \n</script>\n\n <canvas id=\"canvasWindDir2\" width=\"292\" height=\"292\"></canvas>\n","storeOutMessages":false,"fwdInMessages":true,"x":518,"y":159,"wires":[["bebd6202.6a8db"]]},{"id":"17e0e59.2a7dd1a","type":"ui_template","z":"332c51b4.221c3e","group":"ccd5bb6e.50fd28","name":"DepthMulti","order":3,"width":"6","height":"2","format":"<script src=\"/myjs/tween-min.js\"></script>\n<script src=\"/myjs/steelseries-min.js\"></script>\n<script>\nvar multi2;\n (function(scope){ \n scope.$watch('msg', function(msg) {\n if (typeof(msg.value) != \"undefined\") multi2.setValue(msg.value);\n });\n })(scope);\n\n // Define one area\n areas = [steelseries.Section(0, 45, 'rgba(220, 0, 0, 0.3)')],\n\n multi2 = new steelseries.DisplayMulti('canvasMulti2', {\n width: 200,\n height: 75,\n unitString: \"M\",\n unitStringVisible: true,\n headerString: \"Depth\",\n headerStringVisible: true,\n detailString: \"detail: \",\n detailStringVisible: false,\n linkOldValue: false,\n oldValue: 99.9\n\n });\n \n multi2.setFrameDesign(steelseries.FrameDesign.BLACK_METAL);\n multi2.setBackgroundColor(steelseries.BackgroundColor.LIGHT_GRAY);\n\n</script>\n\n <canvas id=\"canvasMulti2\" width=\"200\" height=\"80\"></canvas>\n\n","storeOutMessages":true,"fwdInMessages":false,"x":535,"y":115,"wires":[[]]},{"id":"c0beae78.24ccb","type":"function","z":"332c51b4.221c3e","name":"","func":"var index = msg.payload.indexOf(\"DBT\");\n\nif (index >0){\n\nvar split = msg.payload.split(\",\");\nif (split[0].indexOf(\"DBT\")){\n var metres = split[3];\n\n msg.payload = Number(metres);\n msg.value = msg.payload;\n }\nreturn msg;\n \n}\n","outputs":1,"noerr":0,"x":277,"y":120,"wires":[["8dd12b53.8cf798"]]},{"id":"85f4863.1ce8078","type":"ui_template","z":"332c51b4.221c3e","group":"ccd5bb6e.50fd28","name":"Position","order":4,"width":"6","height":"1","format":"<script src=\"/myjs/tween-min.js\"></script>\n<script src=\"/myjs/steelseries-min.js\"></script>\n<script>\nvar multi3;\n (function(scope){ \n scope.$watch('msg', function(msg) {\n if (typeof(msg.value) != \"undefined\") multi3.setValue(msg.value);\n });\n })(scope);\n\n // Define one area\n areas = [steelseries.Section(0, 45, 'rgba(220, 0, 0, 0.3)')],\n\n multi3 = new steelseries.DisplaySingle('canvasMulti3', {\n width: 400,\n height: 32,\n //value: \"<Auto-scrolling: true>\",\n autoScroll: true,\n valuesNumeric: false\n\n\n });\n \n //multi3.setFrameDesign(steelseries.FrameDesign.BLACK_METAL);\n //multi3.setBackgroundColor(steelseries.BackgroundColor.LIGHT_GRAY);\n\n</script>\n\n <canvas id=\"canvasMulti3\" width=\"400\" height=\"34\"></canvas>\n\n","storeOutMessages":true,"fwdInMessages":false,"x":526,"y":218,"wires":[[]]},{"id":"406dd6fa.495758","type":"function","z":"332c51b4.221c3e","name":"Position","func":"var index = msg.payload.indexOf(\"IIRMC\");\n\nif (index >0){\n\n var split = msg.payload.split(\",\");\n msg.value = split[4]+\" \"+split[3]+\" \"+split[6]+\" \"+split[5]+\" \";\n return msg; \n \n}\n","outputs":1,"noerr":0,"x":283,"y":220,"wires":[["85f4863.1ce8078"]]},{"id":"602bf408.97b5ac","type":"ui_template","z":"332c51b4.221c3e","group":"ccd5bb6e.50fd28","name":"DTWaypoint","order":5,"width":"6","height":"1","format":"<script src=\"/myjs/tween-min.js\"></script>\n<script src=\"/myjs/steelseries-min.js\"></script>\n<script>\nvar multi4;\n (function(scope){ \n scope.$watch('msg', function(msg) {\n if (typeof(msg.value) != \"undefined\") multi4.setValue(msg.value);\n });\n })(scope);\n\n // Define one area\n areas = [steelseries.Section(0, 45, 'rgba(220, 0, 0, 0.3)')],\n\n multi4 = new steelseries.DisplaySingle('canvasMulti4', {\n width: 400,\n height: 32,\n //value: \"<Auto-scrolling: true>\",\n autoScroll: true,\n valuesNumeric: false\n\n\n });\n \n //multi3.setFrameDesign(steelseries.FrameDesign.BLACK_METAL);\n //multi3.setBackgroundColor(steelseries.BackgroundColor.LIGHT_GRAY);\n\n</script>\n\n <canvas id=\"canvasMulti4\" width=\"400\" height=\"34\"></canvas>\n\n","storeOutMessages":true,"fwdInMessages":true,"x":536,"y":275,"wires":[[]]},{"id":"df9b82d1.7be03","type":"function","z":"332c51b4.221c3e","name":"","func":"var index = msg.payload.indexOf(\"ECRMB\");\n\nif (index ==3){\n\n var split = msg.payload.split(\",\");\n msg.value = split[5]+\" : \"+split[11]+\" T \"+split[10]+\" NM \";\n return msg; \n \n}\n","outputs":1,"noerr":0,"x":281,"y":284,"wires":[["602bf408.97b5ac"]]},{"id":"c1d439a6.ead4f8","type":"function","z":"332c51b4.221c3e","name":"","func":"var index = msg.payload.indexOf(\"IIRMC\");\n\nif (index >0){\n\n var split = msg.payload.split(\",\");\n msg.value = \"COG: \"+split[8]+\"T SOG: \"+split[7]+\" KT\";\n return msg; \n \n}\n","outputs":1,"noerr":0,"x":274,"y":338,"wires":[["35334659.9b009a"]]},{"id":"35334659.9b009a","type":"ui_template","z":"332c51b4.221c3e","group":"ccd5bb6e.50fd28","name":"COGSOG","order":6,"width":"6","height":"1","format":"<script src=\"/myjs/tween-min.js\"></script>\n<script src=\"/myjs/steelseries-min.js\"></script>\n<script>\nvar multi5;\n (function(scope){ \n scope.$watch('msg', function(msg) {\n if (typeof(msg.value) != \"undefined\") multi5.setValue(msg.value);\n });\n })(scope);\n\n // Define one area\n areas = [steelseries.Section(0, 45, 'rgba(220, 0, 0, 0.3)')],\n\n multi5 = new steelseries.DisplaySingle('canvasMulti5', {\n width: 400,\n height: 32,\n //value: \"<Auto-scrolling: true>\",\n autoScroll: true,\n valuesNumeric: false\n\n\n });\n \n //multi3.setFrameDesign(steelseries.FrameDesign.BLACK_METAL);\n //multi3.setBackgroundColor(steelseries.BackgroundColor.LIGHT_GRAY);\n\n</script>\n\n <canvas id=\"canvasMulti5\" width=\"400\" height=\"34\"></canvas>\n\n","storeOutMessages":true,"fwdInMessages":false,"x":527,"y":334,"wires":[[]]},{"id":"241518fc.6fa128","type":"function","z":"332c51b4.221c3e","name":"","func":"var index = msg.payload.indexOf(\"IIMTW\");\nif (index>0){\n var split = msg.payload.split(\",\");\n var index2 = msg.payload.indexOf(\"C*\");\n if (index2 > 0){\n msg.payload = Number(split[1]).toFixed(2);\n count = 0;\n return msg; \n }\n \n}\n","outputs":1,"noerr":0,"x":276,"y":384,"wires":[["38a0363d.32078a"]]},{"id":"171223ff.8e825c","type":"function","z":"332c51b4.221c3e","name":"","func":"var index = msg.payload.indexOf(\"IIVHW\");\n\nif (index >0){\n\n var split = msg.payload.split(\",\");\n msg.value = split[3]+\" \"+split[4];\n return msg; \n \n}\n","outputs":1,"noerr":0,"x":277,"y":429,"wires":[["87b6ade0.f64b8"]]},{"id":"87b6ade0.f64b8","type":"ui_template","z":"332c51b4.221c3e","group":"ccd5bb6e.50fd28","name":"Heading","order":7,"width":"6","height":"1","format":"<script src=\"/myjs/tween-min.js\"></script>\n<script src=\"/myjs/steelseries-min.js\"></script>\n<script>\nvar multi6;\n (function(scope){ \n scope.$watch('msg', function(msg) {\n if (typeof(msg.value) != \"undefined\") multi6.setValue(msg.value);\n });\n })(scope);\n\n // Define one area\n //areas = [steelseries.Section(0, 45, 'rgba(220, 0, 0, 0.3)')],\n\n multi6 = new steelseries.DisplaySingle('canvasMulti6', {\n width: 400,\n height: 32,\n //value: \"<Auto-scrolling: true>\",\n autoScroll: true,\n valuesNumeric: false\n\n\n });\n \n //multi3.setFrameDesign(steelseries.FrameDesign.BLACK_METAL);\n //multi3.setBackgroundColor(steelseries.BackgroundColor.LIGHT_GRAY);\n\n</script>\n\n <canvas id=\"canvasMulti6\" width=\"400\" height=\"34\"></canvas>\n\n","storeOutMessages":true,"fwdInMessages":false,"x":443,"y":433,"wires":[[]]},{"id":"93313255.6cdbc","type":"ui_chart","z":"332c51b4.221c3e","name":"Depth","group":"ccd5bb6e.50fd28","order":10,"width":"6","height":"4","label":"Depth","chartType":"line","legend":"false","xformat":"HH:mm","interpolate":"bezier","nodata":"","ymin":"","ymax":"","removeOlder":"6","removeOlderPoints":"","removeOlderUnit":"3600","cutout":"","colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"x":740,"y":47,"wires":[[],[]]},{"id":"e15175f0.e37c68","type":"ui_chart","z":"332c51b4.221c3e","name":"Wind Speed","group":"ccd5bb6e.50fd28","order":9,"width":"6","height":"4","label":"Wind Speed","chartType":"line","legend":"false","xformat":"HH:mm","interpolate":"linear","nodata":"","ymin":"","ymax":"","removeOlder":"6","removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"x":728,"y":198,"wires":[[],[]]},{"id":"83867953.abdef8","type":"function","z":"332c51b4.221c3e","name":"","func":"msg.payload = msg.ave;\nreturn msg;","outputs":1,"noerr":0,"x":704,"y":268,"wires":[["e15175f0.e37c68"]]},{"id":"bebd6202.6a8db","type":"delay","z":"332c51b4.221c3e","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":723,"y":337,"wires":[["83867953.abdef8"]]},{"id":"d7cf4a81.02e7e8","type":"delay","z":"332c51b4.221c3e","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"5","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":557,"y":48,"wires":[["93313255.6cdbc"]]},{"id":"a2d2eda2.37408","type":"delay","z":"332c51b4.221c3e","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"10","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":564,"y":386,"wires":[["3d1330d5.50817"]]},{"id":"8dd12b53.8cf798","type":"smooth","z":"332c51b4.221c3e","name":"","action":"mean","count":"60","round":"2","x":365,"y":64,"wires":[["17e0e59.2a7dd1a","d7cf4a81.02e7e8"]]},{"id":"38a0363d.32078a","type":"smooth","z":"332c51b4.221c3e","name":"","action":"mean","count":"600","round":"1","x":409,"y":386,"wires":[["a2d2eda2.37408"]]},{"id":"608e8a58.58cdc4","type":"udp out","z":"332c51b4.221c3e","name":"","addr":"192.168.43.255","iface":"","port":"2394","ipv":"udp4","outport":"2394","base64":false,"multicast":"broad","x":166.71434020996094,"y":54.31744384765625,"wires":[]},{"id":"3d1330d5.50817","type":"mqtt out","z":"332c51b4.221c3e","name":"","topic":"nav/watertemp","qos":"","retain":"","broker":"fb7a84b7.6b8518","x":745,"y":404,"wires":[]},{"id":"da41542c.f974e8","type":"function","z":"332c51b4.221c3e","name":"Save to DB","func":"var sql = \"\";\nvar d = new Date();\nvar epoch = d.getTime();\nvar outputs = [];\n\nif (msg.payload !== \"\"){\n\n sql = \"INSERT INTO NMEA (nmea) \" +\n \"VALUES ('\"+msg.payload+\"')\";\n outputs.push({topicql}); \n \n \n// Update the status with current timestamp\nvar now = new Date();\nvar yyyy = now.getFullYear();\nvar mm = now.getMonth() < 9 ? \"0\" + (now.getMonth() + 1) : (now.getMonth() + 1); // getMonth() is zero-based\nvar dd = now.getDate() < 10 ? \"0\" + now.getDate() : now.getDate();\nvar hh = now.getHours() < 10 ? \"0\" + now.getHours() : now.getHours();\nvar mmm = now.getMinutes() < 10 ? \"0\" + now.getMinutes() : now.getMinutes();\nvar ss = now.getSeconds() < 10 ? \"0\" + now.getSeconds() : now.getSeconds();\nnode.status({fill:\"blue\",shape:\"ring\",text:\"Last update: \"+dd + \".\" + mm + \".\" + yyyy + \" \" + hh + \":\" + mmm + \":\" + ss}); \n\nreturn [ outputs ];\n}","outputs":1,"noerr":0,"x":540,"y":672,"wires":[["a87ddc32.54d9d"]]},{"id":"a87ddc32.54d9d","type":"sqlite","z":"332c51b4.221c3e","mydb":"4b22966c.c97b68","name":"Voyage DB","x":694,"y":670,"wires":[[]]},{"id":"cdec4f99.2cde8","type":"delay","z":"332c51b4.221c3e","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":110,"y":580,"wires":[["72f8302c.54be9","e903051d.29f518","d83b1f2a.da9b9"]]},{"id":"e903051d.29f518","type":"function","z":"332c51b4.221c3e","name":"DDMM->DD.dddd","func":"var index = msg.payload.indexOf(\"IIRMC\");\n\nif (index >0){\n var split = msg.payload.split(\",\");\n if(split[7]!=\"0.0\"){\n \n var split = msg.payload.split(\",\");\n //msg.value = split[4]+\" \"+split[3]+\" \"+split[6]+\" \"+split[5]+\" \";\n\n // Convert ddmm.mmmm to degrees decimal\n var deg = split[3].toString().slice(0,2);\n var min = split[3].toString().slice(2)/60;\n var d = parseFloat(deg) + parseFloat(min);\n\n // Convert dddmm.mmmm to degrees decimal\n var deg = split[5].toString().slice(0,3);\n var min = split[5].toString().slice(3)/60;\n var e = parseFloat(deg) + parseFloat(min); \n\n if (split[4]=='S'){\n d = d*-1;\n }\n if (split[6]=='W'){\n e = e*-1;\n }\n \n msg.payload = split[0]+\"|\"+split[1]+\"|\"+split[2]+\"|\"+d.toFixed(6) + \"|\" + e.toFixed(6)+\"|\"+split[7]+\"|\"+split[9]+\"|\"+split[10]+\"|\"+split[11];\n // node.status({fill:\"blue\",shape:\"ring\",text:\"Last update: \"+msg.payload+\" \"+split[6]});\n return (msg);\n \n }else{\n \n msg.payload =\"\";\n \n }\n \n}\n","outputs":1,"noerr":0,"x":350,"y":660,"wires":[["da41542c.f974e8"]]},{"id":"8a969ff6.950da","type":"debug","z":"332c51b4.221c3e","name":"","active":false,"console":"false","complete":"false","x":670,"y":580,"wires":[]},{"id":"72f8302c.54be9","type":"function","z":"332c51b4.221c3e","name":"DDMM->DD.dddd","func":" var index = msg.payload.indexOf(\"IIRMC\");\n\nif (index >0){\n var split = msg.payload.split(\",\");\n if(split[7]!=\"0.0\"){\n\n // Convert ddmm.mmmm to degrees decimal\n var deg = split[3].toString().slice(0,2);\n var min = split[3].toString().slice(2)/60;\n var lat = parseFloat(deg) + parseFloat(min);\n\n // Convert dddmm.mmmm to degrees decimal\n var deg = split[5].toString().slice(0,3);\n var min = split[5].toString().slice(3)/60;\n var lon = parseFloat(deg) + parseFloat(min); \n \n var speed = split[7];//.toString();\n\n if (split[4]=='S'){\n lat = lat*-1;\n }\n if (split[6]=='W'){\n lon = lon*-1;\n }\n\n msg.payload = { name:\"ag\", lat:lat, lon:lon, icon: \"ship\",speed: speed*5, bearing: split[8]};\n return (msg);\n \n }else{\n \n msg.payload =\"\";\n \n }\n}\n\n\n","outputs":1,"noerr":0,"x":319,"y":479,"wires":[["b16f3800.a78718","8a969ff6.950da"]]},{"id":"b16f3800.a78718","type":"worldmap","z":"332c51b4.221c3e","name":"","lat":"","lon":"","zoom":"","cluster":"","maxage":"","usermenu":"show","panit":"true","x":654,"y":525,"wires":[]},{"id":"fc8293a8.60302","type":"function","z":"332c51b4.221c3e","name":"","func":"var map = msg.payload;\nmsg.payload={ command:{layer:map, icon: \"ship\",lat:-21.685,lon:45.1568,zoom:17} };\nreturn msg;","outputs":1,"noerr":0,"x":432,"y":522,"wires":[["b16f3800.a78718"]]},{"id":"da5eae2c.dc9ce","type":"ui_dropdown","z":"332c51b4.221c3e","name":"","label":"Map","group":"ccd5bb6e.50fd28","order":11,"width":"1","height":"1","passthru":true,"options":[{"label":"Satellite","value":"Esri Satellite","type":"str"},{"label":"OSM","value":"OSM","type":"str"}],"payload":"","topic":"","x":291,"y":524,"wires":[["fc8293a8.60302"]]},{"id":"16238767.8bd539","type":"function","z":"332c51b4.221c3e","name":"","func":"//var int ;\nlat = 25.049350;\nlon = -77.505733;\n//rssi = msg.payload.rssi;\n//dist = msg.payload.dist;\n//color= \"aqua\";\n//iconColor =msg.payload.color;\nlayer= \"test\";\ncommand = {zoom :13};\ntime = new Date().toString();\n//var ID=ID+1;\nmsg.payload ={name:time,lat,lon,layer,command};\nreturn msg;","outputs":1,"noerr":0,"x":432,"y":578,"wires":[["b16f3800.a78718","8a969ff6.950da"]]},{"id":"5a973319.26be7c","type":"inject","z":"332c51b4.221c3e","name":"","topic":"","payload":"","payloadType":"str","repeat":"","crontab":"","once":false,"x":310,"y":560,"wires":[["16238767.8bd539"]]},{"id":"9c10ef06.ac267","type":"function","z":"332c51b4.221c3e","name":"Draw track","func":" var index = msg.payload.indexOf(\"IIRMC\");\n\nif (index >0){\n var split = msg.payload.split(\",\");\n if(split[7]!=\"0.0\"){\n\n // Convert ddmm.mmmm to degrees decimal\n var deg = split[3].toString().slice(0,2);\n var min = split[3].toString().slice(2)/60;\n var lat = parseFloat(deg) + parseFloat(min);\n\n // Convert dddmm.mmmm to degrees decimal\n var deg = split[5].toString().slice(0,3);\n var min = split[5].toString().slice(3)/60;\n var lon = parseFloat(deg) + parseFloat(min); \n \n var speed = split[7];//.toString();\n\n if (split[4]=='S'){\n lat = lat*-1;\n }\n if (split[6]=='W'){\n lon = lon*-1;\n }\n // msg.payload = { command:{layer:\"Esri Satellite\",lat:0,lon:0,zoom:10} };\n// msg.payload = { command:{layer: \"Ezri Satellite\", name:\"ag\",speed: speed, bearing: split[8], lat:lat, lon:lon, icon: \"ship\"}}\n\n//color= \"aqua\";\n//iconColor =msg.payload.color;\nlayer= \"ag\";\ncommand =\"\";\n//command = {zoom :15};\ntime = new Date().toString();\n//var ID=ID+1;\nmsg.payload ={name:time,lat,lon, layer, command, iconColor:\"BlueViolet\" };\nreturn (msg);\n }else{\n msg.payload =\"\";\n }\n}\n\n\n","outputs":1,"noerr":0,"x":470,"y":620,"wires":[["b16f3800.a78718","8a969ff6.950da"]]},{"id":"8ac6f874.721638","type":"function","z":"332c51b4.221c3e","name":"","func":" var index = msg.payload.indexOf(\"IIRMC\");\n\nif (msg.payload.indexOf(\"IIRMC\")>0){\n \nreturn msg;\n}","outputs":1,"noerr":0,"x":100,"y":400,"wires":[["cdec4f99.2cde8"]]},{"id":"d83b1f2a.da9b9","type":"delay","z":"332c51b4.221c3e","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"10","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":298,"y":615,"wires":[["9c10ef06.ac267"]]},{"id":"dccf3159.48fe5","type":"serial-port","z":"","serialport":"/dev/ttyUSB0","serialbaud":"38400","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":false},{"id":"ccd5bb6e.50fd28","type":"ui_group","z":"","name":"","tab":"da2a5792.57b258","order":1,"disp":false,"width":"12"},{"id":"fb7a84b7.6b8518","type":"mqtt-broker","z":"","broker":"127.0.0.1","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""},{"id":"4b22966c.c97b68","type":"sqlitedb","z":"","db":"/mnt/usb_1//sqlite/nodered/voyagedata"},{"id":"da2a5792.57b258","type":"ui_tab","z":"","name":"Instruments","icon":"dashboard","order":1}]
I'm not using Openplotter yet but I've been watching for a while. I'm getting ready to run a copy and do some 'research' over the summer. Hopefully I'll be able to contribute more at that time. P.S. The embedded map is just for fun and a bit flaky - if you can improve on it, please post.
and my instrumentation node:
[{"id":"7d86b62a.703bf8","type":"serial in","z":"332c51b4.221c3e","name":"","serial":"dccf3159.48fe5","x":109,"y":177,"wires":[["e6a5e4f3.c92b08","c0beae78.24ccb","406dd6fa.495758","df9b82d1.7be03","c1d439a6.ead4f8","241518fc.6fa128","171223ff.8e825c","608e8a58.58cdc4","8ac6f874.721638","8a969ff6.950da"]]},{"id":"e6a5e4f3.c92b08","type":"function","z":"332c51b4.221c3e","name":"","func":"var index = msg.payload.indexOf(\"MWV\");\n\nif (index >0){\n\nvar split = msg.payload.split(\",\");\nmsg.ave = Number(split[3]);\nmsg.value = Number(split[1]);\nreturn msg;\n \n}\n","outputs":1,"noerr":0,"x":275,"y":171,"wires":[["711c93e8.76c74c"]]},{"id":"711c93e8.76c74c","type":"ui_template","z":"332c51b4.221c3e","group":"ccd5bb6e.50fd28","name":"Wind","order":2,"width":"6","height":"6","format":"<script src=\"/myjs/tween-min.js\"></script>\n<script src=\"/myjs/steelseries-2-min.js\"></script>\n<script>\nvar windDir1;\n (function(scope){ \n scope.$watch('msg', function(msg) {\n if (typeof(msg.value) != \"undefined\") windDir1.setValueAnimatedLatest(msg.value);\n if (typeof(msg.ave) != \"undefined\") windDir1.setValueAnimatedAverage(msg.ave);\n });\n })(scope);\n\n var sections = [steelseries.Section(10, 45, 'rgba(220, 0, 0, 0.3)'),\n steelseries.Section(45, 150, 'rgba(0, 220, 0, 0.3)'),\n steelseries.Section(315, 350, 'rgba(220, 0, 0, 0.3)'),\n steelseries.Section(210, 315, 'rgba(0, 220, 0, 0.3)')]\n\n // Define one area\n //areas = [steelseries.Section(0, 45, 'rgba(220, 0, 0, 0.3)')],\n\n windDir1 = new steelseries.WindDirection('canvasWindDir2', {\n size: 292,\n section: sections,\n lcdVisible: true,\n titleString: \"Wind Direction\",\n degreeScaleHalf: true,\n pointSymbolsVisible: false,\n lcdTitleStrings: ['Latest', 'Speed'],\n windspeed: true\n });\n \n windDir1.setFrameDesign(steelseries.FrameDesign.BLACK_METAL);\n windDir1.setBackgroundColor(steelseries.BackgroundColor.LIGHT_GRAY);\n windDir1.setPointerTypeAverage(steelseries.PointerType.TYPE17);\n windDir1.setPointerType(steelseries.PointerType.TYPE1);\n \n //windDir1.setLcdColor(steelseries.LcdColor.BLUE);\n \n</script>\n\n <canvas id=\"canvasWindDir2\" width=\"292\" height=\"292\"></canvas>\n","storeOutMessages":false,"fwdInMessages":true,"x":518,"y":159,"wires":[["bebd6202.6a8db"]]},{"id":"17e0e59.2a7dd1a","type":"ui_template","z":"332c51b4.221c3e","group":"ccd5bb6e.50fd28","name":"DepthMulti","order":3,"width":"6","height":"2","format":"<script src=\"/myjs/tween-min.js\"></script>\n<script src=\"/myjs/steelseries-min.js\"></script>\n<script>\nvar multi2;\n (function(scope){ \n scope.$watch('msg', function(msg) {\n if (typeof(msg.value) != \"undefined\") multi2.setValue(msg.value);\n });\n })(scope);\n\n // Define one area\n areas = [steelseries.Section(0, 45, 'rgba(220, 0, 0, 0.3)')],\n\n multi2 = new steelseries.DisplayMulti('canvasMulti2', {\n width: 200,\n height: 75,\n unitString: \"M\",\n unitStringVisible: true,\n headerString: \"Depth\",\n headerStringVisible: true,\n detailString: \"detail: \",\n detailStringVisible: false,\n linkOldValue: false,\n oldValue: 99.9\n\n });\n \n multi2.setFrameDesign(steelseries.FrameDesign.BLACK_METAL);\n multi2.setBackgroundColor(steelseries.BackgroundColor.LIGHT_GRAY);\n\n</script>\n\n <canvas id=\"canvasMulti2\" width=\"200\" height=\"80\"></canvas>\n\n","storeOutMessages":true,"fwdInMessages":false,"x":535,"y":115,"wires":[[]]},{"id":"c0beae78.24ccb","type":"function","z":"332c51b4.221c3e","name":"","func":"var index = msg.payload.indexOf(\"DBT\");\n\nif (index >0){\n\nvar split = msg.payload.split(\",\");\nif (split[0].indexOf(\"DBT\")){\n var metres = split[3];\n\n msg.payload = Number(metres);\n msg.value = msg.payload;\n }\nreturn msg;\n \n}\n","outputs":1,"noerr":0,"x":277,"y":120,"wires":[["8dd12b53.8cf798"]]},{"id":"85f4863.1ce8078","type":"ui_template","z":"332c51b4.221c3e","group":"ccd5bb6e.50fd28","name":"Position","order":4,"width":"6","height":"1","format":"<script src=\"/myjs/tween-min.js\"></script>\n<script src=\"/myjs/steelseries-min.js\"></script>\n<script>\nvar multi3;\n (function(scope){ \n scope.$watch('msg', function(msg) {\n if (typeof(msg.value) != \"undefined\") multi3.setValue(msg.value);\n });\n })(scope);\n\n // Define one area\n areas = [steelseries.Section(0, 45, 'rgba(220, 0, 0, 0.3)')],\n\n multi3 = new steelseries.DisplaySingle('canvasMulti3', {\n width: 400,\n height: 32,\n //value: \"<Auto-scrolling: true>\",\n autoScroll: true,\n valuesNumeric: false\n\n\n });\n \n //multi3.setFrameDesign(steelseries.FrameDesign.BLACK_METAL);\n //multi3.setBackgroundColor(steelseries.BackgroundColor.LIGHT_GRAY);\n\n</script>\n\n <canvas id=\"canvasMulti3\" width=\"400\" height=\"34\"></canvas>\n\n","storeOutMessages":true,"fwdInMessages":false,"x":526,"y":218,"wires":[[]]},{"id":"406dd6fa.495758","type":"function","z":"332c51b4.221c3e","name":"Position","func":"var index = msg.payload.indexOf(\"IIRMC\");\n\nif (index >0){\n\n var split = msg.payload.split(\",\");\n msg.value = split[4]+\" \"+split[3]+\" \"+split[6]+\" \"+split[5]+\" \";\n return msg; \n \n}\n","outputs":1,"noerr":0,"x":283,"y":220,"wires":[["85f4863.1ce8078"]]},{"id":"602bf408.97b5ac","type":"ui_template","z":"332c51b4.221c3e","group":"ccd5bb6e.50fd28","name":"DTWaypoint","order":5,"width":"6","height":"1","format":"<script src=\"/myjs/tween-min.js\"></script>\n<script src=\"/myjs/steelseries-min.js\"></script>\n<script>\nvar multi4;\n (function(scope){ \n scope.$watch('msg', function(msg) {\n if (typeof(msg.value) != \"undefined\") multi4.setValue(msg.value);\n });\n })(scope);\n\n // Define one area\n areas = [steelseries.Section(0, 45, 'rgba(220, 0, 0, 0.3)')],\n\n multi4 = new steelseries.DisplaySingle('canvasMulti4', {\n width: 400,\n height: 32,\n //value: \"<Auto-scrolling: true>\",\n autoScroll: true,\n valuesNumeric: false\n\n\n });\n \n //multi3.setFrameDesign(steelseries.FrameDesign.BLACK_METAL);\n //multi3.setBackgroundColor(steelseries.BackgroundColor.LIGHT_GRAY);\n\n</script>\n\n <canvas id=\"canvasMulti4\" width=\"400\" height=\"34\"></canvas>\n\n","storeOutMessages":true,"fwdInMessages":true,"x":536,"y":275,"wires":[[]]},{"id":"df9b82d1.7be03","type":"function","z":"332c51b4.221c3e","name":"","func":"var index = msg.payload.indexOf(\"ECRMB\");\n\nif (index ==3){\n\n var split = msg.payload.split(\",\");\n msg.value = split[5]+\" : \"+split[11]+\" T \"+split[10]+\" NM \";\n return msg; \n \n}\n","outputs":1,"noerr":0,"x":281,"y":284,"wires":[["602bf408.97b5ac"]]},{"id":"c1d439a6.ead4f8","type":"function","z":"332c51b4.221c3e","name":"","func":"var index = msg.payload.indexOf(\"IIRMC\");\n\nif (index >0){\n\n var split = msg.payload.split(\",\");\n msg.value = \"COG: \"+split[8]+\"T SOG: \"+split[7]+\" KT\";\n return msg; \n \n}\n","outputs":1,"noerr":0,"x":274,"y":338,"wires":[["35334659.9b009a"]]},{"id":"35334659.9b009a","type":"ui_template","z":"332c51b4.221c3e","group":"ccd5bb6e.50fd28","name":"COGSOG","order":6,"width":"6","height":"1","format":"<script src=\"/myjs/tween-min.js\"></script>\n<script src=\"/myjs/steelseries-min.js\"></script>\n<script>\nvar multi5;\n (function(scope){ \n scope.$watch('msg', function(msg) {\n if (typeof(msg.value) != \"undefined\") multi5.setValue(msg.value);\n });\n })(scope);\n\n // Define one area\n areas = [steelseries.Section(0, 45, 'rgba(220, 0, 0, 0.3)')],\n\n multi5 = new steelseries.DisplaySingle('canvasMulti5', {\n width: 400,\n height: 32,\n //value: \"<Auto-scrolling: true>\",\n autoScroll: true,\n valuesNumeric: false\n\n\n });\n \n //multi3.setFrameDesign(steelseries.FrameDesign.BLACK_METAL);\n //multi3.setBackgroundColor(steelseries.BackgroundColor.LIGHT_GRAY);\n\n</script>\n\n <canvas id=\"canvasMulti5\" width=\"400\" height=\"34\"></canvas>\n\n","storeOutMessages":true,"fwdInMessages":false,"x":527,"y":334,"wires":[[]]},{"id":"241518fc.6fa128","type":"function","z":"332c51b4.221c3e","name":"","func":"var index = msg.payload.indexOf(\"IIMTW\");\nif (index>0){\n var split = msg.payload.split(\",\");\n var index2 = msg.payload.indexOf(\"C*\");\n if (index2 > 0){\n msg.payload = Number(split[1]).toFixed(2);\n count = 0;\n return msg; \n }\n \n}\n","outputs":1,"noerr":0,"x":276,"y":384,"wires":[["38a0363d.32078a"]]},{"id":"171223ff.8e825c","type":"function","z":"332c51b4.221c3e","name":"","func":"var index = msg.payload.indexOf(\"IIVHW\");\n\nif (index >0){\n\n var split = msg.payload.split(\",\");\n msg.value = split[3]+\" \"+split[4];\n return msg; \n \n}\n","outputs":1,"noerr":0,"x":277,"y":429,"wires":[["87b6ade0.f64b8"]]},{"id":"87b6ade0.f64b8","type":"ui_template","z":"332c51b4.221c3e","group":"ccd5bb6e.50fd28","name":"Heading","order":7,"width":"6","height":"1","format":"<script src=\"/myjs/tween-min.js\"></script>\n<script src=\"/myjs/steelseries-min.js\"></script>\n<script>\nvar multi6;\n (function(scope){ \n scope.$watch('msg', function(msg) {\n if (typeof(msg.value) != \"undefined\") multi6.setValue(msg.value);\n });\n })(scope);\n\n // Define one area\n //areas = [steelseries.Section(0, 45, 'rgba(220, 0, 0, 0.3)')],\n\n multi6 = new steelseries.DisplaySingle('canvasMulti6', {\n width: 400,\n height: 32,\n //value: \"<Auto-scrolling: true>\",\n autoScroll: true,\n valuesNumeric: false\n\n\n });\n \n //multi3.setFrameDesign(steelseries.FrameDesign.BLACK_METAL);\n //multi3.setBackgroundColor(steelseries.BackgroundColor.LIGHT_GRAY);\n\n</script>\n\n <canvas id=\"canvasMulti6\" width=\"400\" height=\"34\"></canvas>\n\n","storeOutMessages":true,"fwdInMessages":false,"x":443,"y":433,"wires":[[]]},{"id":"93313255.6cdbc","type":"ui_chart","z":"332c51b4.221c3e","name":"Depth","group":"ccd5bb6e.50fd28","order":10,"width":"6","height":"4","label":"Depth","chartType":"line","legend":"false","xformat":"HH:mm","interpolate":"bezier","nodata":"","ymin":"","ymax":"","removeOlder":"6","removeOlderPoints":"","removeOlderUnit":"3600","cutout":"","colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"x":740,"y":47,"wires":[[],[]]},{"id":"e15175f0.e37c68","type":"ui_chart","z":"332c51b4.221c3e","name":"Wind Speed","group":"ccd5bb6e.50fd28","order":9,"width":"6","height":"4","label":"Wind Speed","chartType":"line","legend":"false","xformat":"HH:mm","interpolate":"linear","nodata":"","ymin":"","ymax":"","removeOlder":"6","removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"x":728,"y":198,"wires":[[],[]]},{"id":"83867953.abdef8","type":"function","z":"332c51b4.221c3e","name":"","func":"msg.payload = msg.ave;\nreturn msg;","outputs":1,"noerr":0,"x":704,"y":268,"wires":[["e15175f0.e37c68"]]},{"id":"bebd6202.6a8db","type":"delay","z":"332c51b4.221c3e","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":723,"y":337,"wires":[["83867953.abdef8"]]},{"id":"d7cf4a81.02e7e8","type":"delay","z":"332c51b4.221c3e","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"5","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":557,"y":48,"wires":[["93313255.6cdbc"]]},{"id":"a2d2eda2.37408","type":"delay","z":"332c51b4.221c3e","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"10","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":564,"y":386,"wires":[["3d1330d5.50817"]]},{"id":"8dd12b53.8cf798","type":"smooth","z":"332c51b4.221c3e","name":"","action":"mean","count":"60","round":"2","x":365,"y":64,"wires":[["17e0e59.2a7dd1a","d7cf4a81.02e7e8"]]},{"id":"38a0363d.32078a","type":"smooth","z":"332c51b4.221c3e","name":"","action":"mean","count":"600","round":"1","x":409,"y":386,"wires":[["a2d2eda2.37408"]]},{"id":"608e8a58.58cdc4","type":"udp out","z":"332c51b4.221c3e","name":"","addr":"192.168.43.255","iface":"","port":"2394","ipv":"udp4","outport":"2394","base64":false,"multicast":"broad","x":166.71434020996094,"y":54.31744384765625,"wires":[]},{"id":"3d1330d5.50817","type":"mqtt out","z":"332c51b4.221c3e","name":"","topic":"nav/watertemp","qos":"","retain":"","broker":"fb7a84b7.6b8518","x":745,"y":404,"wires":[]},{"id":"da41542c.f974e8","type":"function","z":"332c51b4.221c3e","name":"Save to DB","func":"var sql = \"\";\nvar d = new Date();\nvar epoch = d.getTime();\nvar outputs = [];\n\nif (msg.payload !== \"\"){\n\n sql = \"INSERT INTO NMEA (nmea) \" +\n \"VALUES ('\"+msg.payload+\"')\";\n outputs.push({topicql}); \n \n \n// Update the status with current timestamp\nvar now = new Date();\nvar yyyy = now.getFullYear();\nvar mm = now.getMonth() < 9 ? \"0\" + (now.getMonth() + 1) : (now.getMonth() + 1); // getMonth() is zero-based\nvar dd = now.getDate() < 10 ? \"0\" + now.getDate() : now.getDate();\nvar hh = now.getHours() < 10 ? \"0\" + now.getHours() : now.getHours();\nvar mmm = now.getMinutes() < 10 ? \"0\" + now.getMinutes() : now.getMinutes();\nvar ss = now.getSeconds() < 10 ? \"0\" + now.getSeconds() : now.getSeconds();\nnode.status({fill:\"blue\",shape:\"ring\",text:\"Last update: \"+dd + \".\" + mm + \".\" + yyyy + \" \" + hh + \":\" + mmm + \":\" + ss}); \n\nreturn [ outputs ];\n}","outputs":1,"noerr":0,"x":540,"y":672,"wires":[["a87ddc32.54d9d"]]},{"id":"a87ddc32.54d9d","type":"sqlite","z":"332c51b4.221c3e","mydb":"4b22966c.c97b68","name":"Voyage DB","x":694,"y":670,"wires":[[]]},{"id":"cdec4f99.2cde8","type":"delay","z":"332c51b4.221c3e","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":110,"y":580,"wires":[["72f8302c.54be9","e903051d.29f518","d83b1f2a.da9b9"]]},{"id":"e903051d.29f518","type":"function","z":"332c51b4.221c3e","name":"DDMM->DD.dddd","func":"var index = msg.payload.indexOf(\"IIRMC\");\n\nif (index >0){\n var split = msg.payload.split(\",\");\n if(split[7]!=\"0.0\"){\n \n var split = msg.payload.split(\",\");\n //msg.value = split[4]+\" \"+split[3]+\" \"+split[6]+\" \"+split[5]+\" \";\n\n // Convert ddmm.mmmm to degrees decimal\n var deg = split[3].toString().slice(0,2);\n var min = split[3].toString().slice(2)/60;\n var d = parseFloat(deg) + parseFloat(min);\n\n // Convert dddmm.mmmm to degrees decimal\n var deg = split[5].toString().slice(0,3);\n var min = split[5].toString().slice(3)/60;\n var e = parseFloat(deg) + parseFloat(min); \n\n if (split[4]=='S'){\n d = d*-1;\n }\n if (split[6]=='W'){\n e = e*-1;\n }\n \n msg.payload = split[0]+\"|\"+split[1]+\"|\"+split[2]+\"|\"+d.toFixed(6) + \"|\" + e.toFixed(6)+\"|\"+split[7]+\"|\"+split[9]+\"|\"+split[10]+\"|\"+split[11];\n // node.status({fill:\"blue\",shape:\"ring\",text:\"Last update: \"+msg.payload+\" \"+split[6]});\n return (msg);\n \n }else{\n \n msg.payload =\"\";\n \n }\n \n}\n","outputs":1,"noerr":0,"x":350,"y":660,"wires":[["da41542c.f974e8"]]},{"id":"8a969ff6.950da","type":"debug","z":"332c51b4.221c3e","name":"","active":false,"console":"false","complete":"false","x":670,"y":580,"wires":[]},{"id":"72f8302c.54be9","type":"function","z":"332c51b4.221c3e","name":"DDMM->DD.dddd","func":" var index = msg.payload.indexOf(\"IIRMC\");\n\nif (index >0){\n var split = msg.payload.split(\",\");\n if(split[7]!=\"0.0\"){\n\n // Convert ddmm.mmmm to degrees decimal\n var deg = split[3].toString().slice(0,2);\n var min = split[3].toString().slice(2)/60;\n var lat = parseFloat(deg) + parseFloat(min);\n\n // Convert dddmm.mmmm to degrees decimal\n var deg = split[5].toString().slice(0,3);\n var min = split[5].toString().slice(3)/60;\n var lon = parseFloat(deg) + parseFloat(min); \n \n var speed = split[7];//.toString();\n\n if (split[4]=='S'){\n lat = lat*-1;\n }\n if (split[6]=='W'){\n lon = lon*-1;\n }\n\n msg.payload = { name:\"ag\", lat:lat, lon:lon, icon: \"ship\",speed: speed*5, bearing: split[8]};\n return (msg);\n \n }else{\n \n msg.payload =\"\";\n \n }\n}\n\n\n","outputs":1,"noerr":0,"x":319,"y":479,"wires":[["b16f3800.a78718","8a969ff6.950da"]]},{"id":"b16f3800.a78718","type":"worldmap","z":"332c51b4.221c3e","name":"","lat":"","lon":"","zoom":"","cluster":"","maxage":"","usermenu":"show","panit":"true","x":654,"y":525,"wires":[]},{"id":"fc8293a8.60302","type":"function","z":"332c51b4.221c3e","name":"","func":"var map = msg.payload;\nmsg.payload={ command:{layer:map, icon: \"ship\",lat:-21.685,lon:45.1568,zoom:17} };\nreturn msg;","outputs":1,"noerr":0,"x":432,"y":522,"wires":[["b16f3800.a78718"]]},{"id":"da5eae2c.dc9ce","type":"ui_dropdown","z":"332c51b4.221c3e","name":"","label":"Map","group":"ccd5bb6e.50fd28","order":11,"width":"1","height":"1","passthru":true,"options":[{"label":"Satellite","value":"Esri Satellite","type":"str"},{"label":"OSM","value":"OSM","type":"str"}],"payload":"","topic":"","x":291,"y":524,"wires":[["fc8293a8.60302"]]},{"id":"16238767.8bd539","type":"function","z":"332c51b4.221c3e","name":"","func":"//var int ;\nlat = 25.049350;\nlon = -77.505733;\n//rssi = msg.payload.rssi;\n//dist = msg.payload.dist;\n//color= \"aqua\";\n//iconColor =msg.payload.color;\nlayer= \"test\";\ncommand = {zoom :13};\ntime = new Date().toString();\n//var ID=ID+1;\nmsg.payload ={name:time,lat,lon,layer,command};\nreturn msg;","outputs":1,"noerr":0,"x":432,"y":578,"wires":[["b16f3800.a78718","8a969ff6.950da"]]},{"id":"5a973319.26be7c","type":"inject","z":"332c51b4.221c3e","name":"","topic":"","payload":"","payloadType":"str","repeat":"","crontab":"","once":false,"x":310,"y":560,"wires":[["16238767.8bd539"]]},{"id":"9c10ef06.ac267","type":"function","z":"332c51b4.221c3e","name":"Draw track","func":" var index = msg.payload.indexOf(\"IIRMC\");\n\nif (index >0){\n var split = msg.payload.split(\",\");\n if(split[7]!=\"0.0\"){\n\n // Convert ddmm.mmmm to degrees decimal\n var deg = split[3].toString().slice(0,2);\n var min = split[3].toString().slice(2)/60;\n var lat = parseFloat(deg) + parseFloat(min);\n\n // Convert dddmm.mmmm to degrees decimal\n var deg = split[5].toString().slice(0,3);\n var min = split[5].toString().slice(3)/60;\n var lon = parseFloat(deg) + parseFloat(min); \n \n var speed = split[7];//.toString();\n\n if (split[4]=='S'){\n lat = lat*-1;\n }\n if (split[6]=='W'){\n lon = lon*-1;\n }\n // msg.payload = { command:{layer:\"Esri Satellite\",lat:0,lon:0,zoom:10} };\n// msg.payload = { command:{layer: \"Ezri Satellite\", name:\"ag\",speed: speed, bearing: split[8], lat:lat, lon:lon, icon: \"ship\"}}\n\n//color= \"aqua\";\n//iconColor =msg.payload.color;\nlayer= \"ag\";\ncommand =\"\";\n//command = {zoom :15};\ntime = new Date().toString();\n//var ID=ID+1;\nmsg.payload ={name:time,lat,lon, layer, command, iconColor:\"BlueViolet\" };\nreturn (msg);\n }else{\n msg.payload =\"\";\n }\n}\n\n\n","outputs":1,"noerr":0,"x":470,"y":620,"wires":[["b16f3800.a78718","8a969ff6.950da"]]},{"id":"8ac6f874.721638","type":"function","z":"332c51b4.221c3e","name":"","func":" var index = msg.payload.indexOf(\"IIRMC\");\n\nif (msg.payload.indexOf(\"IIRMC\")>0){\n \nreturn msg;\n}","outputs":1,"noerr":0,"x":100,"y":400,"wires":[["cdec4f99.2cde8"]]},{"id":"d83b1f2a.da9b9","type":"delay","z":"332c51b4.221c3e","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"10","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":298,"y":615,"wires":[["9c10ef06.ac267"]]},{"id":"dccf3159.48fe5","type":"serial-port","z":"","serialport":"/dev/ttyUSB0","serialbaud":"38400","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":false},{"id":"ccd5bb6e.50fd28","type":"ui_group","z":"","name":"","tab":"da2a5792.57b258","order":1,"disp":false,"width":"12"},{"id":"fb7a84b7.6b8518","type":"mqtt-broker","z":"","broker":"127.0.0.1","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""},{"id":"4b22966c.c97b68","type":"sqlitedb","z":"","db":"/mnt/usb_1//sqlite/nodered/voyagedata"},{"id":"da2a5792.57b258","type":"ui_tab","z":"","name":"Instruments","icon":"dashboard","order":1}]
I'm not using Openplotter yet but I've been watching for a while. I'm getting ready to run a copy and do some 'research' over the summer. Hopefully I'll be able to contribute more at that time. P.S. The embedded map is just for fun and a bit flaky - if you can improve on it, please post.