Here is my flow for wind monitoring which may be of interest - some of the compass rose is unashamedly plagiarised from others! I think it fits in quite well with other standard gauges.
Arduino translates wind speed, direction etc. from Davis Instruments anemometer and sends via MQTT.
Only slight snag which I haven't solved is erratic behaviour of the compass needle when wind is light and coming from due north.
[{"id":"2dc5586d.f156e","type":"mqtt in","z":"18554eb.6ab9c31","name":"","topic":"wind/MPH","qos":"2","broker":"5f0a4eca.22adb","x":240,"y":650,"wires":[["5b747c02.dc324c","5fd31646.ee702","f155f5f8.b6eb98"]]},{"id":"5b747c02.dc324c","type":"smooth","z":"18554eb.6ab9c31","name":"Max gust","property":"payload","action":"max","count":"23000","round":"0","mult":"single","x":660,"y":710,"wires":[["7d35dead.d830f"]]},{"id":"5fd31646.ee702","type":"smooth","z":"18554eb.6ab9c31","name":"Short term gust","property":"payload","action":"max","count":"20","round":"0","mult":"single","x":660,"y":781,"wires":[["5ff6bd3b.417194"]]},{"id":"e78348c3.20ef8","type":"mqtt in","z":"18554eb.6ab9c31","name":"Wind Direction","topic":"wind/direction","qos":"2","broker":"5f0a4eca.22adb","x":140,"y":561,"wires":[["c00b4506.66ab7"]]},{"id":"c00b4506.66ab7","type":"function","z":"18554eb.6ab9c31","name":"Change payload to degrees:payload","func":"var msg = {\n payload: {\n degrees: msg.payload\n }\n}\nreturn msg;","outputs":1,"noerr":0,"x":390,"y":561,"wires":[["ad14f1c.63bc71"]]},{"id":"3406c9b8.831766","type":"mqtt in","z":"18554eb.6ab9c31","name":"Beaufort","topic":"Force/Beaufort","qos":"2","broker":"5f0a4eca.22adb","x":140,"y":461,"wires":[["392b9cd8.44ac4c"]]},{"id":"bcee69d9.05de58","type":"function","z":"18554eb.6ab9c31","name":"Change payload to msg.Beaufort","func":"var msg = {\n payload: {\n Beaufort: msg.payload\n }\n}\nreturn msg;","outputs":1,"noerr":0,"x":400,"y":521,"wires":[["ad14f1c.63bc71"]]},{"id":"ad14f1c.63bc71","type":"join","z":"18554eb.6ab9c31","name":"Combine Beaufort and Dir","mode":"custom","build":"merged","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":true,"timeout":"1","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":720,"y":541,"wires":[["d606d45c.3cf448"]]},{"id":"392b9cd8.44ac4c","type":"change","z":"18554eb.6ab9c31","name":"Calm to CALM","rules":[{"t":"change","p":"payload","pt":"msg","from":"Calm","fromt":"str","to":"CALM","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":360,"y":460,"wires":[["bcee69d9.05de58"]]},{"id":"7d35dead.d830f","type":"ui_text","z":"18554eb.6ab9c31","group":"6549c513.6a736c","order":5,"width":3,"height":2,"name":"Max gust","label":" <font size=\"+1\">MAX GUST (24H)","format":" <font size=\"+1\">{{msg.payload}}mph","layout":"row-center","x":1020,"y":710,"wires":[]},{"id":"f155f5f8.b6eb98","type":"ui_gauge","z":"18554eb.6ab9c31","name":"Wind speed","group":"2609568d.f58f42","order":3,"width":6,"height":5,"gtype":"gage","title":"WIND SPEED","label":"MPH","format":"{{value|number:0}} ","min":0,"max":"60","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":1010,"y":650,"wires":[]},{"id":"5ff6bd3b.417194","type":"ui_gauge","z":"18554eb.6ab9c31","name":"Gusts","group":"6549c513.6a736c","order":4,"width":3,"height":3,"gtype":"gage","title":"GUST","label":"MPH","format":"{{value|number:0}} ","min":0,"max":"60","colors":["#00ffff","#00ffff","#00ffff"],"seg1":"","seg2":"","x":1030,"y":781,"wires":[]},{"id":"d606d45c.3cf448","type":"ui_template","z":"18554eb.6ab9c31","group":"2609568d.f58f42","name":"Definitive compass rose","order":2,"width":6,"height":6,"format":"<!--\npass msg.payload.degrees, msg.payload.speed, msg.payload.speed_unit\n-->\n<link href=\"https://fonts.googleapis.com/css?family=Abel\" rel=\"stylesheet\"> \n\n\n\n<script>\n\n\n\n// Derive Beaufort from incoming message\n (function(scope){\n scope.$watch('msg', function(msg) {\n if(typeof(msg) === \"object\"){\n \n var Beau = msg.payload.Beaufort;\n \n scope.Beaufort = Beau;\n \n \n if(msg.payload.Beaufort === \"CALM\"){\n scope.color = \"rgb(40,40,40)\";\n }else{\n scope.color = \"rgb(200,0,0)\";\n }\n \n \n \n \n }\n \t});\n \t\n \t\n \t \n \t\n \t\n \t\n \t\n \t\n })(scope);\n\n\n\n // Hacks to improve the layout and make it scale - not sure this works!!!\n $(document).ready(function(){\n setTimeout(function () {\n // Remove the auto scrolling from the parent node\n $(\".compass_container\").parent().css(\"overflow\",\"hidden\");\n \n // Adjust the color to match the theme base color by looking up the toolbar header background color;\n //$(\".compass_container .triangle\").css(\"border-bottom-color\",$(\"md-toolbar\").css(\"background-color\"));\n // Abandoned in favour of colour\n //$(\".compass_container .compass_headerCENTERBLOB\").css(\"border-color\",$(\"md-toolbar\").css(\"background-color\"));\n // Scale the compass into the box that it's being rendered in\n // This CSS hack helps make sure the line & font size scales appropriately\n // Based on the node's grid size\n $(\".compass_container\").each(function(k,v){\n var scaleWidth = $(v).parent().width() / $(v).width()/2;\n var scaleHeight = $(v).parent().height() / $(v).height()/2;\n \n var translateX = ($(v).width() - $(v).parent().width());\n var translateY = ($(v).height() - $(v).parent().height());\n \n $(v).css(\"transform\",\"translate(-\"+translateX+\"px,-\"+translateY+\"px) scale(\"+scaleWidth+\",\"+scaleHeight+\") \");\n });\n \n $(\".compass_container\").css(\"display\",\"block\"); // Unhide it now that it's resized\n }, 1000);\n });\n</script>\n \n<style>\n \n \n /*@import url(https://fonts.googleapis.com/css?family=Dosis:200,400,500,600);*/\n \n .compass_container{\n display: none;\n position: absolute;\n top: 55px;\n left: 60px;\n border: 5px solid rgb(230,230,230);\n margin: 0px;\n width: 200px;\n height: 200px;\n border-radius: 50%;\n font-family: 'Abel', sans-serif;\n font-size: 80px;\n \n background-color: #202020;\n }\n \n \n .compass_container .fancy_border{\n position: absolute;\n width: 155%;\n height: 155%;\n left:-62px;\n top: -58px;\n border: 1px solid rgb(100,100,100);\n border-radius: 3%;\n position: absolute;\n \n }\n \n \n \n \n \n \n \n \n .compass_container .compass_headerN{\n font-weight: bold;\n position: absolute;\n text-align: center;\n width: 100%;\n font-size: 50%;\n top: -62px\n }\n \n .compass_container .compass_headerW{\n font-weight: bold;\n position: absolute;\n \n width: 100%;\n font-size: 50%;\n left: -55px;\n top: 75px;\n }\n \n .compass_container .compass_headerS{\n font-weight: bold;\n position: absolute;\n text-align: center;\n width: 100%;\n font-size: 50%;\n top: 205px\n }\n \n .compass_container .compass_headerE{\n font-weight: bold;\n position: absolute;\n \n width: 100%;\n font-size: 50%;\n left: 220px;\n top: 75px\n }\n \n .compass_container .compass_headerNW{\n font-weight: bold;\n position: absolute;\n \n width: 100%;\n font-size: 30%;\n left: -20px;\n top: 0px\n }\n \n .compass_container .compass_headerNE{\n font-weight: bold;\n position: absolute;\n \n width: 100%;\n font-size: 30%;\n left: 190px;\n top: 0px;\n }\n \n .compass_container .compass_headerSW{\n font-weight: bold;\n position: absolute;\n \n width: 100%;\n font-size: 30%;\n left: -20px;\n top: 175px;\n }\n \n \n \n .compass_container .compass_headerSE{\n font-weight: bold;\n position: absolute;\n \n width: 100%;\n font-size: 30%;\n left: 190px;\n top: 175px;\n }\n \n \n \n \n .compass_container .compass_headerCENTERBLOB{\n border: 2px solid transparent;\n border-radius: 50%;\n background-color: solid green;/*nothing!*/\n z-index: 2;\n position: absolute;\n height: 30%;\n width: 30%;\n left: 68px;\n top: 68px;\n \n }\n \n \n .compass_container .compass_headerCENTERTEXT{\n border: 2px solid rgb(230,230,230);\n border-radius: 50%;\n background-color: solid green; /*doesnt do anything!*/\n font-size: 30%;\n font-weight: bold;\n position: absolute;\n z-index: 3;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n \n height: 30%;\n width: 30%;\n left: 68px;\n top: 68px;\n }\n \n \n \n \n \n \n \n \n .compass_container .arrow{\n transition: 2s ease-in-out;\n \n width: 100%;\n height: 100%;\n display: block;\n position: absolute;\n top: 0;\n \n }\n \n .compass_container .arrow .triangle{\n box-sizing: border-box:\n width: 500px;\n\t\theight: 100px;\n\t\tborder-left: 8px solid transparent;\n\t\tborder-right: 8px solid transparent;\n\t\t\n\t\tborder-top: 5px solid transparent;\n\t\tposition: absolute;\n\t\ttop: -120px;\n\t\tleft: 112px;\n\t\tmargin-left: -20px;\n\t\tz-index:1;\n\t\tborder-bottom: 86px solid {{color}};\n\t\t\n }\n \n</style>\n\n<div class=\"compass_container\" style=\"\">\n <div class=\"fancy_border\"></div>\n <div class=\"compass_headerN\">N</div>\n <div class=\"compass_headerW\">W</div>\n <div class=\"compass_headerS\">S</div>\n <div class=\"compass_headerE\">E</div>\n <div class=\"compass_headerNW\">NW</div>\n <div class=\"compass_headerNE\">NE</div> \n <div class=\"compass_headerSW\">SW</div>\n <div class=\"compass_headerSE\">SE</div>\n <div class=\"compass_headerCENTERBLOB\"></div>\n \n <div class=\"compass_headerCENTERTEXT\">{{Beaufort}}</div>\n \n \n \n <div class=\"arrow\" style=\"transform: rotate({{msg.payload.degrees}}deg);\">\n <div class=\"triangle\"></div>\n </div>\n \n</div>","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":false,"templateScope":"local","x":1030,"y":540,"wires":[[]]},{"id":"5f0a4eca.22adb","type":"mqtt-broker","name":"Pi MQTT","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"6549c513.6a736c","type":"ui_group","name":"HUMIDITY","tab":"2fc2582e.d3d21","order":2,"disp":false,"width":"3","collapse":false},{"id":"2609568d.f58f42","type":"ui_group","name":"WIND","tab":"2fc2582e.d3d21","order":4,"disp":false,"width":"6","collapse":false},{"id":"2fc2582e.d3d21","type":"ui_tab","name":"WEATHER AND UTILITIES","icon":"dashboard","order":1,"disabled":false,"hidden":false}]