{"id":4493,"date":"2026-01-13T11:07:28","date_gmt":"2026-01-13T11:07:28","guid":{"rendered":"https:\/\/m0aws.co.uk\/?p=4493"},"modified":"2026-01-13T11:16:19","modified_gmt":"2026-01-13T11:16:19","slug":"using-node-red-to-build-interactive-log-maps","status":"publish","type":"post","link":"https:\/\/m0aws.co.uk\/?p=4493","title":{"rendered":"Using Node-Red to build interactive log maps"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">I&#8217;ve not been on the radio much over the last few weeks as I&#8217;ve had my head down other radio related rabbit holes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One of the rabbit holes is a <a href=\"https:\/\/nodered.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Node-Red<\/a> project to make my online logs a little more interactive. For sometime now my logs have been displayed on my website as nicely formatted, searchable HTML pages however, they don&#8217;t really allow the viewer (myself included) to see the global coverage of all the contacts so, I decided to write a Node-Red flow that would do just that.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Node-Red-Interactive-Log-Flow.png\" target=\"_blank\" rel=\" noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1874\" height=\"586\" src=\"https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Node-Red-Interactive-Log-Flow.png\" alt=\"M0AWS Interactive Log Flow\" class=\"wp-image-4496\" srcset=\"https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Node-Red-Interactive-Log-Flow.png 1874w, https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Node-Red-Interactive-Log-Flow-300x94.png 300w, https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Node-Red-Interactive-Log-Flow-768x240.png 768w, https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Node-Red-Interactive-Log-Flow-1536x480.png 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><figcaption class=\"wp-element-caption\">M0AWS Interactive Log Flow<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The flow itself isn&#8217;t too complicated and basically consists of reading in the individual <a href=\"https:\/\/www.adif.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">ADIF<\/a> formatted log files, processing the data and then sending the data in the correct format to the map node for display.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;ve had to write a few functions to handle the processing of the ADIF formatted data but, these aren&#8217;t particularly complex and are fairly easy to understand even if like me, you&#8217;re not a <a href=\"https:\/\/en.wikipedia.org\/wiki\/JavaScript\" target=\"_blank\" rel=\"noreferrer noopener\">Javascript<\/a> programmer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The flow is working perfectly however, I&#8217;m in the process of reworking the <strong><em>format generic payload<\/em><\/strong> function to reduce the amount of code and make it more efficient.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Interactive-SSB-CW-node-Red-Map.png\" target=\"_blank\" rel=\" noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"2048\" height=\"1586\" src=\"https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Interactive-SSB-CW-node-Red-Map-2048x1586.png\" alt=\"M0AWS SSB \/ CW \/ FreeDV Interactive Log World Map\" class=\"wp-image-4495\" srcset=\"https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Interactive-SSB-CW-node-Red-Map-2048x1586.png 2048w, https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Interactive-SSB-CW-node-Red-Map-300x232.png 300w, https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Interactive-SSB-CW-node-Red-Map-768x595.png 768w, https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Interactive-SSB-CW-node-Red-Map-1536x1190.png 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><figcaption class=\"wp-element-caption\">M0AWS SSB \/ CW \/ FreeDV Interactive Log World Map<\/figcaption><\/figure>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"159\" height=\"500\" src=\"https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Log-Map-Layers-Menu.png\" alt=\"M0AWS Interactive Log Map Layers Menu\" class=\"wp-image-4504\" srcset=\"https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Log-Map-Layers-Menu.png 159w, https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Log-Map-Layers-Menu-95x300.png 95w\" sizes=\"auto, (max-width: 159px) 100vw, 159px\" \/><figcaption class=\"wp-element-caption\">M0AWS Interactive Log Map Layers Menu<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><br><br>The flow generates two maps, one for voice \/ CW \/Satellite contacts and the other for WSJT-X FT4\/8 contacts. Every pin on the map is colour coded by band with satellite contacts being denoted by a satellite icon.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each pin \/ icon on the map is clickable and reveals the data of the QSO being displayed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the top right-hand corner of the map there is a drop down <strong><em>layer<\/em><\/strong> <strong><em>menu<\/em><\/strong> that allows the viewer to filter by band thus reducing the number of icons on the screen at any one time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Seeing the data presented on a map really brings my logs alive. An example of this is that I had no idea I&#8217;d worked so many stations in India on the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Es%27hail_2\" target=\"_blank\" rel=\"noreferrer noopener\">QO-100 Satellite<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The small icons in the pins show a microphone for SSB\/FM\/FreeDV contacts and a downwards pointing triangle in a box for CW contacts. Sadly I couldn&#8217;t find a Morse key icon in the collection available.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Filtered-Satellite-only-Map-View.png\" target=\"_blank\" rel=\" noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1240\" height=\"1173\" src=\"https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Filtered-Satellite-only-Map-View.png\" alt=\"M0AWS filtered view of QO-100 Satellite contacts\" class=\"wp-image-4509\" srcset=\"https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Filtered-Satellite-only-Map-View.png 1240w, https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Filtered-Satellite-only-Map-View-300x284.png 300w, https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-Filtered-Satellite-only-Map-View-768x727.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><figcaption class=\"wp-element-caption\">M0AWS filtered view of QO-100 Satellite contacts<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">I only use FT4\/8 for testing new antenna designs however, it&#8217;s interesting to see the global coverage accomplished with this weak signal mode.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-WSJTX-Interactive-Node-Red-Map.png\" target=\"_blank\" rel=\" noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"2048\" height=\"1585\" src=\"https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-WSJTX-Interactive-Node-Red-Map-2048x1585.png\" alt=\"M0AWS WSJT-X FT4\/8 Interactive Log World Map\" class=\"wp-image-4497\" srcset=\"https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-WSJTX-Interactive-Node-Red-Map-2048x1585.png 2048w, https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-WSJTX-Interactive-Node-Red-Map-300x232.png 300w, https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-WSJTX-Interactive-Node-Red-Map-768x594.png 768w, https:\/\/m0aws.co.uk\/wp-content\/uploads\/2026\/01\/M0AWS-WSJTX-Interactive-Node-Red-Map-1536x1189.png 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><figcaption class=\"wp-element-caption\">M0AWS WSJT-X FT4\/8 Interactive Log World Map<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Once I&#8217;ve finished rewriting the <strong><em>format generic payload<\/em><\/strong> function I will make the flow available for download here so that others can also create an interactive view of their radio logs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you want to have a look at the maps and try them out for yourself, they are available under the <strong><em>Logs<\/em><\/strong> menu above.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This Node-Red instance is running in a <a href=\"https:\/\/m0aws.co.uk\/?p=4360\" target=\"_blank\" rel=\"noreferrer noopener\">virtual machine (VM) on a 16GB RAM RaspberryPi 5<\/a> that is also running a number of other VMs at the same time so, it&#8217;s safe to say it&#8217;s not heavy on CPU and will run on the older Pi4 as well.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">More soon &#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;ve not been on the radio much over the last few weeks as I&#8217;ve had my head down other radio related rabbit holes. One of the rabbit holes is a Node-Red project to make my online logs a little more interactive. For sometime now my logs have been displayed on my website as nicely formatted, &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/m0aws.co.uk\/?p=4493\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Using Node-Red to build interactive log maps&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[173,32,72,70,71,174,30,147,200,33,63,80,394,148,69,6,28,523,522,36,512,73,180,132,334,42,184,376,532,78,16,339,4,65,51,327,375,178,38,41,40,309,310,81,179,186,135,411,37,134,520,167,326,336,122,351,419,258,473,142,524,525,526,527,17,514,62,185,35],"tags":[],"class_list":["post-4493","post","type-post","status-publish","format-standard","hentry","category-10ghz","category-10m-band","category-12m-band","category-160m-band","category-17m-band","category-2-4ghz","category-20m-band","category-2m-band","category-2mband","category-30m-band","category-4m-band","category-60m-band","category-6m-band","category-70cm-band","category-80m-band","category-antenna","category-antenna-modelling","category-arm","category-arm64","category-code","category-coding","category-cw","category-dashboard","category-debian","category-dv","category-dx","category-flows","category-fm","category-freedv","category-ft4","category-ft8","category-geo-stationary","category-ham-radio","category-home-brew","category-html","category-imagination","category-internet","category-javascript","category-linux","category-logging","category-logs","category-mic","category-microphone","category-morse-code","category-nodered","category-nodes","category-opensource","category-pi-5","category-programming","category-projects","category-qemu","category-qo-100","category-radio","category-radioham","category-raspberrypi","category-raspbian","category-sbc","category-ssb","category-tools","category-vhf","category-virtualisation","category-virtualization","category-virtualmachine","category-vm","category-weak-signals","category-webpage","category-website","category-worldmap","category-wsjt-x"],"_links":{"self":[{"href":"https:\/\/m0aws.co.uk\/index.php?rest_route=\/wp\/v2\/posts\/4493","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/m0aws.co.uk\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/m0aws.co.uk\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/m0aws.co.uk\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/m0aws.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4493"}],"version-history":[{"count":20,"href":"https:\/\/m0aws.co.uk\/index.php?rest_route=\/wp\/v2\/posts\/4493\/revisions"}],"predecessor-version":[{"id":4518,"href":"https:\/\/m0aws.co.uk\/index.php?rest_route=\/wp\/v2\/posts\/4493\/revisions\/4518"}],"wp:attachment":[{"href":"https:\/\/m0aws.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4493"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/m0aws.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4493"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/m0aws.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4493"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}