[{"data":1,"prerenderedAt":951},["ShallowReactive",2],{"blog-\u002Fblog\u002F2025\u002F12\u002Fgetting-weather-data-in-node-red":3},{"id":4,"title":5,"body":6,"description":12,"extension":941,"meta":942,"navigation":408,"path":947,"seo":948,"stem":949,"__hash__":950},"blog\u002Fblog\u002F2025\u002F12\u002Fgetting-weather-data-in-node-red.md","Building a Weather Dashboard in Node-RED (2026)",{"type":7,"value":8,"toc":925},"minimark",[9,13,16,19,24,27,57,61,64,86,100,104,107,121,125,128,160,171,233,241,246,262,277,284,287,290,294,301,311,487,504,516,524,528,534,538,541,546,549,587,595,598,602,605,633,641,644,648,651,707,715,718,722,725,760,768,771,775,778,864,872,876,879,882,890,896,901,905,908,911,914,921],[10,11,12],"p",{},"A weather dashboard is honestly the best first project if you're getting into Node-RED. Takes about 10-15 minutes from start to finish, and by the end you'll understand how the whole thing works - connecting to APIs, processing data, and displaying it visually.",[10,14,15],{},"This isn't one of our typical deep-dive industrial posts—it's a straightforward starter tutorial. You'll be building something real: calling an actual weather API, handling JSON responses, and watching live data appear on your dashboard. It's the kind of project that makes Node-RED's flow-based approach suddenly make sense. Once you've built it, you'll have a solid foundation for more complex projects.",[10,17,18],{},"We'll use FlowFuse Dashboard for the UI since it's modern and easier to work with. If you know how to drag nodes around and hit the deploy button, you're ready to start.",[20,21,23],"h2",{"id":22},"what-youll-need","What You'll Need",[10,25,26],{},"Before you start, make sure you have:",[28,29,30,46],"ul",{},[31,32,33,37,38,45],"li",{},[34,35,36],"strong",{},"Node-RED Instance:"," You need Node-RED running somewhere. Easiest option is FlowFuse, ",[39,40,44],"a",{"href":41,"rel":42},"https:\u002F\u002Fapp.flowfuse.com\u002Faccount\u002Fcreate",[43],"nofollow","grab a free trial"," and you get a cloud-hosted instance ready to go. No server setup, no port forwarding hassles.",[31,47,48,51,52,56],{},[34,49,50],{},"OpenWeatherMap Account:"," Sign up at ",[53,54,55],"code",{},"openweathermap.org",". The free tier gives you enough API calls for this project.",[20,58,60],{"id":59},"installing-flowfuse-dashboard","Installing FlowFuse Dashboard",[10,62,63],{},"First, get the dashboard package installed:",[65,66,67,70,73,76,83],"ol",{},[31,68,69],{},"Click the hamburger menu in the top right corner",[31,71,72],{},"Select Manage palette",[31,74,75],{},"Go to the Install tab",[31,77,78,79,82],{},"Type ",[53,80,81],{},"@flowfuse\u002Fnode-red-dashboard"," in the search box",[31,84,85],{},"Click the install button next to it",[10,87,88,89,92,93,92,96,99],{},"Wait for it to finish. You'll see a bunch of new dashboard nodes pop up in your left sidebar, things like ",[34,90,91],{},"ui-gauge",", ",[34,94,95],{},"ui-text",[34,97,98],{},"ui-chart",". That's how you know it worked.",[20,101,103],{"id":102},"getting-your-api-key","Getting Your API Key",[10,105,106],{},"Log in to your OpenWeather account. Once you're signed in:",[65,108,109,112,115,118],{},[31,110,111],{},"Go to your account section",[31,113,114],{},"Find API keys",[31,116,117],{},"Copy the default key (or generate a new one)",[31,119,120],{},"Save it in a text file or a note app.",[20,122,124],{"id":123},"setting-up-the-api-connection","Setting Up the API Connection",[10,126,127],{},"First, we need to connect to the weather API and make sure it's working.",[65,129,130,137,140,147,150,157],{},[31,131,132,133,136],{},"Drag an ",[34,134,135],{},"inject"," node onto the canvas",[31,138,139],{},"Double-click to configure it",[31,141,142,143,146],{},"Change ",[34,144,145],{},"Repeat"," from \"none\" to \"interval\"",[31,148,149],{},"Set it to repeat every 5 seconds (or whatever interval you prefer)",[31,151,152,153,156],{},"Check the box for ",[34,154,155],{},"Inject once after"," and set it to 0.1 seconds, this will trigger the flow immediately when you deploy",[31,158,159],{},"Click Done",[10,161,162,168],{},[163,164],"img",{"alt":165,"dataZoomable":166,"src":167},"Inject node configured to trigger the weather API every 5 seconds","","\u002Fblog\u002F2025\u002F12\u002Fimages\u002Ftrigger-weather-api.png",[169,170,165],"em",{},[65,172,174,180,190,196,203,213,220,226],{"start":173},7,[31,175,132,176,179],{},[34,177,178],{},"http request"," node to the right of it",[31,181,182,183,186,187,189],{},"Drag a ",[34,184,185],{},"debug"," node to the right of the ",[34,188,178],{}," node",[31,191,192,193,195],{},"Double-click the ",[34,194,178],{}," node to open its settings:",[31,197,198,199,202],{},"Make sure ",[34,200,201],{},"Method"," is set to GET",[31,204,205,206,209,210],{},"In the ",[34,207,208],{},"URL"," field, paste: ",[53,211,212],{},"https:\u002F\u002Fapi.openweathermap.org\u002Fdata\u002F2.5\u002Fweather?q=London&appid=YOUR_API_KEY&units=metric",[31,214,215,216,219],{},"Replace ",[53,217,218],{},"YOUR_API_KEY"," with the actual API key you copied from OpenWeatherMap",[31,221,215,222,225],{},[53,223,224],{},"London"," with your city if you want",[31,227,228,229,232],{},"Select the Return as ",[34,230,231],{},"parsed JSON",".",[10,234,235,239],{},[163,236],{"alt":237,"dataZoomable":166,"src":238},"HTTP request node configured to fetch weather data from OpenWeatherMap API","\u002Fblog\u002F2025\u002F12\u002Fimages\u002Fhttp-request.png",[169,240,237],{},[65,242,244],{"start":243},14,[31,245,159],{},[10,247,248,249,252,253,256,257,232],{},"The ",[53,250,251],{},"units=metric"," gives you Celsius. Change it to ",[53,254,255],{},"units=imperial"," for Fahrenheit. For more details on what parameters you can use, check out the ",[39,258,261],{"href":259,"rel":260},"https:\u002F\u002Fopenweathermap.org\u002Fcurrent",[43],"OpenWeatherMap API documentation",[10,263,264,265,267,268,270,271,273,274,276],{},"Now wire the nodes together by clicking and dragging from the ",[34,266,135],{}," node's right side to the ",[34,269,178],{}," node's left side, then from the ",[34,272,178],{}," node to the ",[34,275,185],{}," node.",[10,278,279,280,283],{},"Click the ",[34,281,282],{},"Deploy"," button in the top right and open the debug panel on the right sidebar if it's not already open.",[10,285,286],{},"You should see a JSON object with weather data, temperature, humidity, wind speed, description, and more. This is the raw data coming back from the API.",[10,288,289],{},"If you see a 401 error, your API key may still be activating. Wait 10–15 minutes and try again, or verify the key again in case it’s invalid or mistyped.",[20,291,293],{"id":292},"processing-the-weather-data","Processing the Weather Data",[10,295,296,297,300],{},"Now that you're getting data from the API, you need to extract the specific values you want to display. We'll use a ",[34,298,299],{},"function"," node to pull out temperature, humidity, weather description, and wind speed.",[65,302,303],{},[31,304,182,305,307,308,310],{},[34,306,299],{}," node and add following code into it and connect it to the ",[34,309,178],{}," node:",[312,313,317],"pre",{"className":314,"code":315,"language":316,"meta":166,"style":166},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F Extract the data we need\nconst temp = msg.payload.main.temp;\nconst humidity = msg.payload.main.humidity;\nconst description = msg.payload.weather[0].description;\nconst windSpeed = msg.payload.wind.speed;\nconst city = msg.payload.name;\n\n\u002F\u002F Create separate messages for each value\nreturn [\n    { payload: city, topic: \"city\" },\n    { payload: description, topic: \"description\" },\n    { payload: temp, topic: \"temperature\" },\n    { payload: humidity, topic: \"humidity\" },\n    { payload: windSpeed, topic: \"wind\" },\n];\n","javascript",[53,318,319,328,346,359,378,391,404,410,416,425,438,449,460,471,481],{"__ignoreMap":166},[320,321,324],"span",{"class":322,"line":323},"line",1,[320,325,327],{"class":326},"sJ8bj","\u002F\u002F Extract the data we need\n",[320,329,331,335,339,342],{"class":322,"line":330},2,[320,332,334],{"class":333},"szBVR","const",[320,336,338],{"class":337},"sj4cs"," temp",[320,340,341],{"class":333}," =",[320,343,345],{"class":344},"sVt8B"," msg.payload.main.temp;\n",[320,347,349,351,354,356],{"class":322,"line":348},3,[320,350,334],{"class":333},[320,352,353],{"class":337}," humidity",[320,355,341],{"class":333},[320,357,358],{"class":344}," msg.payload.main.humidity;\n",[320,360,362,364,367,369,372,375],{"class":322,"line":361},4,[320,363,334],{"class":333},[320,365,366],{"class":337}," description",[320,368,341],{"class":333},[320,370,371],{"class":344}," msg.payload.weather[",[320,373,374],{"class":337},"0",[320,376,377],{"class":344},"].description;\n",[320,379,381,383,386,388],{"class":322,"line":380},5,[320,382,334],{"class":333},[320,384,385],{"class":337}," windSpeed",[320,387,341],{"class":333},[320,389,390],{"class":344}," msg.payload.wind.speed;\n",[320,392,394,396,399,401],{"class":322,"line":393},6,[320,395,334],{"class":333},[320,397,398],{"class":337}," city",[320,400,341],{"class":333},[320,402,403],{"class":344}," msg.payload.name;\n",[320,405,406],{"class":322,"line":173},[320,407,409],{"emptyLinePlaceholder":408},true,"\n",[320,411,413],{"class":322,"line":412},8,[320,414,415],{"class":326},"\u002F\u002F Create separate messages for each value\n",[320,417,419,422],{"class":322,"line":418},9,[320,420,421],{"class":333},"return",[320,423,424],{"class":344}," [\n",[320,426,428,431,435],{"class":322,"line":427},10,[320,429,430],{"class":344},"    { payload: city, topic: ",[320,432,434],{"class":433},"sZZnC","\"city\"",[320,436,437],{"class":344}," },\n",[320,439,441,444,447],{"class":322,"line":440},11,[320,442,443],{"class":344},"    { payload: description, topic: ",[320,445,446],{"class":433},"\"description\"",[320,448,437],{"class":344},[320,450,452,455,458],{"class":322,"line":451},12,[320,453,454],{"class":344},"    { payload: temp, topic: ",[320,456,457],{"class":433},"\"temperature\"",[320,459,437],{"class":344},[320,461,463,466,469],{"class":322,"line":462},13,[320,464,465],{"class":344},"    { payload: humidity, topic: ",[320,467,468],{"class":433},"\"humidity\"",[320,470,437],{"class":344},[320,472,473,476,479],{"class":322,"line":243},[320,474,475],{"class":344},"    { payload: windSpeed, topic: ",[320,477,478],{"class":433},"\"wind\"",[320,480,437],{"class":344},[320,482,484],{"class":322,"line":483},15,[320,485,486],{"class":344},"];\n",[488,489,490],"blockquote",{},[10,491,492,495,496,498,499,503],{},[34,493,494],{},"Tip:"," If you're using FlowFuse, you don't need to write this JavaScript manually. You can use the FlowFuse Expert to generate the function code for you—just describe what you want the ",[34,497,299],{}," node to do. Check out the ",[39,500,502],{"href":501},"\u002Fblog\u002F2025\u002F07\u002Fflowfuse-ai-assistant-better-node-red-manufacturing\u002F","article"," for more details.",[65,505,506],{"start":330},[31,507,508,509,511,512,515],{},"Set the ",[34,510,299],{}," node's ",[34,513,514],{},"Outputs"," (in the Setup tab) to 5, since the function will return five separate messages.",[10,517,518,522],{},[163,519],{"alt":520,"dataZoomable":166,"src":521},"Function node configured with 5 outputs to split weather data","\u002Fblog\u002F2025\u002F12\u002Fimages\u002Ffunction-setup-tab.png",[169,523,520],{},[65,525,526],{"start":348},[31,527,159],{},[10,529,530,531,533],{},"This ",[34,532,299],{}," node splits the API response into separate outputs - one for temperature, one for humidity, and so on. Each output gets its own topic label so you can track what's what.",[20,535,537],{"id":536},"building-the-dashboard","Building the Dashboard",[10,539,540],{},"Now you'll see your weather data displayed on screen. This demonstrates how Node-RED connects data sources to visual components. We'll organize the dashboard into separate groups for better visual organization.",[542,543,545],"h3",{"id":544},"configuring-the-city-name-display","Configuring the City Name Display",[10,547,548],{},"Start by displaying which city you're tracking:",[65,550,551,555,565,570,577,584],{},[31,552,182,553,136],{},[34,554,95],{},[31,556,557,558,561,562,564],{},"Connect it to ",[34,559,560],{},"output 1"," of your ",[34,563,299],{}," node (the city output)",[31,566,192,567,569],{},[34,568,95],{}," node to open its settings",[31,571,572,573,576],{},"Set ",[34,574,575],{},"Label"," to \"City\"",[31,578,579,580,583],{},"For ",[34,581,582],{},"Group",", click the pencil icon to create a new group called \"Weather Info\"",[31,585,586],{},"Click Add, then Done",[10,588,589,593],{},[163,590],{"alt":591,"dataZoomable":166,"src":592},"UI text node configured to display city name in Weather Info group","\u002Fblog\u002F2025\u002F12\u002Fimages\u002Fcity-display.png",[169,594,591],{},[10,596,597],{},"You've just created your first dashboard element and dashboard group. Groups organize widgets on the page and function as containers.",[542,599,601],{"id":600},"configuring-the-weather-description","Configuring the Weather Description",[10,603,604],{},"Add a text field to show current conditions:",[65,606,607,612,620,623,628,631],{},[31,608,609,610,136],{},"Drag another ",[34,611,95],{},[31,613,557,614,561,617,619],{},[34,615,616],{},"output 2",[34,618,299],{}," node (description output)",[31,621,622],{},"Double-click to configure",[31,624,572,625,627],{},[34,626,575],{}," to \"Conditions\"",[31,629,630],{},"Use the same \"Weather Info\" group",[31,632,159],{},[10,634,635,639],{},[163,636],{"alt":637,"dataZoomable":166,"src":638},"UI text node configured to display weather conditions","\u002Fblog\u002F2025\u002F12\u002Fimages\u002Fcondition-display.png",[169,640,637],{},[10,642,643],{},"The API returns descriptions like \"scattered clouds\" or \"light rain\" - human-readable conditions.",[542,645,647],{"id":646},"configuring-the-temperature-gauge","Configuring the Temperature Gauge",[10,649,650],{},"Next, add a circular gauge for temperature:",[65,652,653,657,665,668,673,683,686,695,698,705],{},[31,654,182,655,136],{},[34,656,91],{},[31,658,557,659,561,662,664],{},[34,660,661],{},"output 3",[34,663,299],{}," node (the temperature output)",[31,666,667],{},"Double-click to open settings",[31,669,572,670,672],{},[34,671,575],{}," to \"Temperature (°C)\"",[31,674,572,675,678,679,682],{},[34,676,677],{},"Min"," to 0 and ",[34,680,681],{},"Max"," to 50 (adjust these based on your climate)",[31,684,685],{},"Add the color segments you want, as shown in the reference image.",[31,687,579,688,690,691,694],{},[34,689,582],{},", click the pencil icon to create a ",[34,692,693],{},"new group"," called \"Temperature & Humidity\"",[31,696,697],{},"Click Add to create the group",[31,699,700,701,704],{},"Under the ",[34,702,703],{},"Appearance"," tab, you can select a color scheme if desired",[31,706,159],{},[10,708,709,713],{},[163,710],{"alt":711,"dataZoomable":166,"src":712},"Temperature gauge configured with color-coded segments in Temperature & Humidity group","\u002Fblog\u002F2025\u002F12\u002Fimages\u002Ftemperature-gauge.png",[169,714,711],{},[10,716,717],{},"The gauge will automatically color-code based on the value - cooler temperatures display in blue tones, warmer in orange\u002Fred.",[542,719,721],{"id":720},"configuring-the-humidity-gauge","Configuring the Humidity Gauge",[10,723,724],{},"Add the humidity gauge to the same group:",[65,726,727,731,739,741,746,753,755,758],{},[31,728,609,729,136],{},[34,730,91],{},[31,732,557,733,561,736,738],{},[34,734,735],{},"output 4",[34,737,299],{}," node (humidity output)",[31,740,622],{},[31,742,572,743,745],{},[34,744,575],{}," to \"Humidity (%)\"",[31,747,572,748,678,750,752],{},[34,749,677],{},[34,751,681],{}," to 100 (humidity is always a percentage)",[31,754,685],{},[31,756,757],{},"Use the same \"Temperature & Humidity\" group from the dropdown",[31,759,159],{},[10,761,762,766],{},[163,763],{"alt":764,"dataZoomable":166,"src":765},"Humidity gauge configured to display percentage values with color coding","\u002Fblog\u002F2025\u002F12\u002Fimages\u002Fhumidity-gauge.png",[169,767,764],{},[10,769,770],{},"The two gauges will display side by side in the same group, making it easy to compare both metrics at once.",[20,772,774],{"id":773},"configuring-the-wind-speed-display","Configuring the Wind Speed Display",[10,776,777],{},"Next, create a dedicated chart to display wind speed trends over time:",[65,779,780,785,793,798,806,814,824,833,841,853],{},[31,781,182,782,784],{},[34,783,98],{}," node onto your flow.",[31,786,557,787,561,790,792],{},[34,788,789],{},"output 5",[34,791,299],{}," node (the wind speed output).",[31,794,192,795,797],{},[34,796,98],{}," node to configure it.",[31,799,572,800,802,803,232],{},[34,801,575],{}," to ",[34,804,805],{},"\"Wind Speed (m\u002Fs)\"",[31,807,572,808,802,811,232],{},[34,809,810],{},"Type",[34,812,813],{},"Line chart",[31,815,816,817,820,821,232],{},"For the ",[34,818,819],{},"X-axis",", select ",[34,822,823],{},"Timestamp",[31,825,572,826,829,830,232],{},[34,827,828],{},"Y-axis"," to use ",[34,831,832],{},"msg.payload",[31,834,572,835,802,838,232],{},[34,836,837],{},"Series",[34,839,840],{},"msg.topic",[31,842,843,844,846,847,849,850,232],{},"Under ",[34,845,582],{},", click the pencil icon and create a ",[34,848,693],{}," named ",[34,851,852],{},"\"Wind Speed\"",[31,854,855,856,859,860,863],{},"Click ",[34,857,858],{},"Add",", then ",[34,861,862],{},"Done"," to save the configuration.",[10,865,866,870],{},[163,867],{"alt":868,"dataZoomable":166,"src":869},"Wind speed chart configured as a line chart to show trends over time","\u002Fblog\u002F2025\u002F12\u002Fimages\u002Fwind-speed-chart.png",[169,871,868],{},[20,873,875],{"id":874},"viewing-your-dashboard","Viewing Your Dashboard",[10,877,878],{},"Hit the Deploy button in the top right corner.",[10,880,881],{},"Then, open the Dashboard 2.0 sidebar and click the Open Dashboard button. You should now see a dashboard similar to the one shown below.",[10,883,884,888],{},[163,885],{"alt":886,"dataZoomable":166,"src":887},"Complete weather dashboard displaying real-time weather data","\u002Fblog\u002F2025\u002F12\u002Fimages\u002Fweather-dashboard.png",[169,889,886],{},[10,891,892,893,895],{},"Below is the complete flow. Import it, enter your API URL with your API key in the ",[34,894,178],{}," node, and deploy the flow:",[897,898],"render-flow",{":height":899,"flow":900},"300","W3siaWQiOiJmNGMwODU5MTY1NGMyOWVmIiwidHlwZSI6ImluamVjdCIsInoiOiI5Y2Y4MmI2OGJiODllOGNlIiwibmFtZSI6IlRyaWdnZXIgV2VhdGhlciBBUEkiLCJwcm9wcyI6W10sInJlcGVhdCI6IjUiLCJjcm9udGFiIjoiIiwib25jZSI6dHJ1ZSwib25jZURlbGF5IjowLjEsInRvcGljIjoiIiwieCI6MTAwLCJ5IjoxMzAwLCJ3aXJlcyI6W1siNzBkM2RhYjUzMjgwMmM5NyJdXX0seyJpZCI6IjcwZDNkYWI1MzI4MDJjOTciLCJ0eXBlIjoiaHR0cCByZXF1ZXN0IiwieiI6IjljZjgyYjY4YmI4OWU4Y2UiLCJuYW1lIjoiT3BlbldlYXRoZXIgUmVxdWVzdCIsIm1ldGhvZCI6IkdFVCIsInJldCI6Im9iaiIsInBheXRvcXMiOiJpZ25vcmUiLCJ1cmwiOiIiLCJ0bHMiOiIiLCJwZXJzaXN0IjpmYWxzZSwicHJveHkiOiIiLCJpbnNlY3VyZUhUVFBQYXJzZXIiOmZhbHNlLCJhdXRoVHlwZSI6IiIsInNlbmRlcnIiOmZhbHNlLCJoZWFkZXJzIjpbXSwieCI6MzQwLCJ5IjoxMzAwLCJ3aXJlcyI6W1siODQ5YTkwMjViYjJmOGE3OCJdXX0seyJpZCI6Ijg0OWE5MDI1YmIyZjhhNzgiLCJ0eXBlIjoiZnVuY3Rpb24iLCJ6IjoiOWNmODJiNjhiYjg5ZThjZSIsIm5hbWUiOiJQcm9jZXNzIFdlYXRoZXIgRGF0YSIsImZ1bmMiOiIvLyBFeHRyYWN0IHRoZSBkYXRhIHdlIG5lZWRcbmNvbnN0IHRlbXAgPSBtc2cucGF5bG9hZC5tYWluLnRlbXA7XG5jb25zdCBodW1pZGl0eSA9IG1zZy5wYXlsb2FkLm1haW4uaHVtaWRpdHk7XG5jb25zdCBkZXNjcmlwdGlvbiA9IG1zZy5wYXlsb2FkLndlYXRoZXJbMF0uZGVzY3JpcHRpb247XG5jb25zdCB3aW5kU3BlZWQgPSBtc2cucGF5bG9hZC53aW5kLnNwZWVkO1xuY29uc3QgY2l0eSA9IG1zZy5wYXlsb2FkLm5hbWU7XG5cbi8vIENyZWF0ZSBzZXBhcmF0ZSBtZXNzYWdlcyBmb3IgZWFjaCB2YWx1ZVxucmV0dXJuIFtcbiAgICB7IHBheWxvYWQ6IGNpdHksIHRvcGljOiBcImNpdHlcIiB9LFxuICAgIHsgcGF5bG9hZDogZGVzY3JpcHRpb24sIHRvcGljOiBcImRlc2NyaXB0aW9uXCIgfSxcbiAgICB7IHBheWxvYWQ6IHRlbXAsIHRvcGljOiBcInRlbXBlcmF0dXJlXCIgfSxcbiAgICB7IHBheWxvYWQ6IGh1bWlkaXR5LCB0b3BpYzogXCJodW1pZGl0eVwiIH0sXG4gICAgeyBwYXlsb2FkOiB3aW5kU3BlZWQsIHRvcGljOiBcIndpbmRcIiB9LFxuXTsiLCJvdXRwdXRzIjo1LCJ0aW1lb3V0IjowLCJub2VyciI6MCwiaW5pdGlhbGl6ZSI6IiIsImZpbmFsaXplIjoiIiwibGlicyI6W10sIngiOjU4MCwieSI6MTMwMCwid2lyZXMiOltbImIzMmVjM2RjMDM2Yzk4MWUiXSxbImQ2YTFjZmFhMzc0YmYzZTkiXSxbIjUzMTNkMDIxN2Y1NWUyY2YiXSxbImZjYTM3Yzc1N2ZiNGQ2OWQiXSxbImI2NjhiZjE4NWU2ODY4NDciXV19LHsiaWQiOiI1MzEzZDAyMTdmNTVlMmNmIiwidHlwZSI6InVpLWdhdWdlIiwieiI6IjljZjgyYjY4YmI4OWU4Y2UiLCJuYW1lIjoiVGVtcGVyYXR1cmUiLCJncm91cCI6Ijk0NzBlNTFhOGVjODZkOGUiLCJvcmRlciI6MSwidmFsdWUiOiJwYXlsb2FkIiwidmFsdWVUeXBlIjoibXNnIiwid2lkdGgiOiIzIiwiaGVpZ2h0IjoiMyIsImd0eXBlIjoiZ2F1Z2UtaGFsZiIsImdzdHlsZSI6Im5lZWRsZSIsInRpdGxlIjoiVGVtcGVyYXR1cmUiLCJhbHdheXNTaG93VGl0bGUiOmZhbHNlLCJmbG9hdGluZ1RpdGxlUG9zaXRpb24iOiJ0b3AtbGVmdCIsInVuaXRzIjoiwrBDIiwiaWNvbiI6IiIsInByZWZpeCI6IiIsInN1ZmZpeCI6IiIsInNlZ21lbnRzIjpbeyJmcm9tIjoiMCIsImNvbG9yIjoiIzAwOGNiNCIsInRleHQiOiIiLCJ0ZXh0VHlwZSI6InZhbHVlIn0seyJmcm9tIjoiMTUiLCJjb2xvciI6IiMwMGEzZDciLCJ0ZXh0IjoiIiwidGV4dFR5cGUiOiJ2YWx1ZSJ9LHsiZnJvbSI6IjI1IiwiY29sb3IiOiIjZmVjNzAwIiwidGV4dCI6IiIsInRleHRUeXBlIjoidmFsdWUifSx7ImZyb20iOiIzNSIsImNvbG9yIjoiI2ZmYWEwMCIsInRleHQiOiIiLCJ0ZXh0VHlwZSI6InZhbHVlIn0seyJmcm9tIjoiNTAiLCJjb2xvciI6IiNmZjYyNTEiLCJ0ZXh0IjoiIiwidGV4dFR5cGUiOiJ2YWx1ZSJ9XSwibWluIjowLCJtYXgiOiI1MCIsInNpemVUaGlja25lc3MiOjE2LCJzaXplR2FwIjo0LCJzaXplS2V5VGhpY2tuZXNzIjo4LCJzdHlsZVJvdW5kZWQiOnRydWUsInN0eWxlR2xvdyI6ZmFsc2UsImNsYXNzTmFtZSI6IiIsIngiOjc5MCwieSI6MTMwMCwid2lyZXMiOltbXV19LHsiaWQiOiJiMzJlYzNkYzAzNmM5ODFlIiwidHlwZSI6InVpLXRleHQiLCJ6IjoiOWNmODJiNjhiYjg5ZThjZSIsImdyb3VwIjoiNWE4OWFjNzE3MWY1MWNjMyIsIm9yZGVyIjoxLCJ3aWR0aCI6IjAiLCJoZWlnaHQiOiIwIiwibmFtZSI6IkNpdHkgRGlzcGxheSIsImxhYmVsIjoiQ2l0eToiLCJmb3JtYXQiOiJ7e21zZy5wYXlsb2FkfX0iLCJsYXlvdXQiOiJyb3ctc3ByZWFkIiwic3R5bGUiOnRydWUsImZvbnQiOiJBcmlhbCxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZiIsImZvbnRTaXplIjoiMjEiLCJjb2xvciI6IiMwMDAwMDAiLCJ3cmFwVGV4dCI6ZmFsc2UsImNsYXNzTmFtZSI6IiIsInZhbHVlIjoicGF5bG9hZCIsInZhbHVlVHlwZSI6Im1zZyIsIngiOjc5MCwieSI6MTIyMCwid2lyZXMiOltdfSx7ImlkIjoiZDZhMWNmYWEzNzRiZjNlOSIsInR5cGUiOiJ1aS10ZXh0IiwieiI6IjljZjgyYjY4YmI4OWU4Y2UiLCJncm91cCI6IjVhODlhYzcxNzFmNTFjYzMiLCJvcmRlciI6Mywid2lkdGgiOiIwIiwiaGVpZ2h0IjoiMCIsIm5hbWUiOiJDb25kaXRpb25zIERpc3BsYXkiLCJsYWJlbCI6IkNvbmRpdGlvbnM6IiwiZm9ybWF0Ijoie3ttc2cucGF5bG9hZH19IiwibGF5b3V0Ijoicm93LXNwcmVhZCIsInN0eWxlIjp0cnVlLCJmb250IjoiQXJpYWwsQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWYiLCJmb250U2l6ZSI6IjIxIiwiY29sb3IiOiIjMDAwMDAwIiwid3JhcFRleHQiOmZhbHNlLCJjbGFzc05hbWUiOiIiLCJ2YWx1ZSI6InBheWxvYWQiLCJ2YWx1ZVR5cGUiOiJtc2ciLCJ4Ijo4MTAsInkiOjEyNjAsIndpcmVzIjpbXX0seyJpZCI6ImZjYTM3Yzc1N2ZiNGQ2OWQiLCJ0eXBlIjoidWktZ2F1Z2UiLCJ6IjoiOWNmODJiNjhiYjg5ZThjZSIsIm5hbWUiOiJIdW1pZGl0eSBHYXVnZSIsImdyb3VwIjoiOTQ3MGU1MWE4ZWM4NmQ4ZSIsIm9yZGVyIjoyLCJ2YWx1ZSI6InBheWxvYWQiLCJ2YWx1ZVR5cGUiOiJtc2ciLCJ3aWR0aCI6IjMiLCJoZWlnaHQiOiIzIiwiZ3R5cGUiOiJnYXVnZS1oYWxmIiwiZ3N0eWxlIjoibmVlZGxlIiwidGl0bGUiOiJIdW1pZGl0eSIsImFsd2F5c1Nob3dUaXRsZSI6ZmFsc2UsImZsb2F0aW5nVGl0bGVQb3NpdGlvbiI6InRvcC1sZWZ0IiwidW5pdHMiOiIlIiwiaWNvbiI6IiIsInByZWZpeCI6IiIsInN1ZmZpeCI6IiIsInNlZ21lbnRzIjpbeyJmcm9tIjoiMCIsImNvbG9yIjoiI2Q5NTAwMCIsInRleHQiOiIiLCJ0ZXh0VHlwZSI6InZhbHVlIn0seyJmcm9tIjoiMzAiLCJjb2xvciI6IiM2Zjc2MDgiLCJ0ZXh0IjoiIiwidGV4dFR5cGUiOiJ2YWx1ZSJ9LHsiZnJvbSI6IjgwIiwiY29sb3IiOiIjZmVjNzAwIiwidGV4dCI6IiIsInRleHRUeXBlIjoidmFsdWUifSx7ImZyb20iOiIxMDAiLCJjb2xvciI6IiNkOTUwMDAiLCJ0ZXh0IjoiIiwidGV4dFR5cGUiOiJ2YWx1ZSJ9XSwibWluIjowLCJtYXgiOiIxMDAiLCJzaXplVGhpY2tuZXNzIjoxNiwic2l6ZUdhcCI6NCwic2l6ZUtleVRoaWNrbmVzcyI6OCwic3R5bGVSb3VuZGVkIjp0cnVlLCJzdHlsZUdsb3ciOmZhbHNlLCJjbGFzc05hbWUiOiIiLCJ4Ijo4MDAsInkiOjEzNDAsIndpcmVzIjpbW11dfSx7ImlkIjoiYjY2OGJmMTg1ZTY4Njg0NyIsInR5cGUiOiJ1aS1jaGFydCIsInoiOiI5Y2Y4MmI2OGJiODllOGNlIiwiZ3JvdXAiOiI3YjIwMjVjMTA0Y2Q1MDZlIiwibmFtZSI6IldpbmQgU3BlZWQiLCJsYWJlbCI6IldpbmQgU3BlZWQgKG0vcykiLCJvcmRlciI6MSwiY2hhcnRUeXBlIjoibGluZSIsImNhdGVnb3J5IjoidG9waWMiLCJjYXRlZ29yeVR5cGUiOiJtc2ciLCJ4QXhpc0xhYmVsIjoiIiwieEF4aXNQcm9wZXJ0eSI6IiIsInhBeGlzUHJvcGVydHlUeXBlIjoidGltZXN0YW1wIiwieEF4aXNUeXBlIjoidGltZSIsInhBeGlzRm9ybWF0IjoiIiwieEF4aXNGb3JtYXRUeXBlIjoiYXV0byIsInhtaW4iOiIiLCJ4bWF4IjoiIiwieUF4aXNMYWJlbCI6IiIsInlBeGlzUHJvcGVydHkiOiJwYXlsb2FkIiwieUF4aXNQcm9wZXJ0eVR5cGUiOiJtc2ciLCJ5bWluIjoiIiwieW1heCI6IiIsImJpbnMiOjEwLCJhY3Rpb24iOiJhcHBlbmQiLCJzdGFja1NlcmllcyI6ZmFsc2UsInBvaW50U2hhcGUiOiJjaXJjbGUiLCJwb2ludFJhZGl1cyI6NCwic2hvd0xlZ2VuZCI6dHJ1ZSwicmVtb3ZlT2xkZXIiOjEsInJlbW92ZU9sZGVyVW5pdCI6IjM2MDAiLCJyZW1vdmVPbGRlclBvaW50cyI6IiIsImNvbG9ycyI6WyIjMDA5NWZmIiwiI2ZmMDAwMCIsIiNmZjdmMGUiLCIjMmNhMDJjIiwiI2EzNDdlMSIsIiNkNjI3MjgiLCIjZmY5ODk2IiwiIzk0NjdiZCIsIiNjNWIwZDUiXSwidGV4dENvbG9yIjpbIiM2NjY2NjYiXSwidGV4dENvbG9yRGVmYXVsdCI6dHJ1ZSwiZ3JpZENvbG9yIjpbIiNlNWU1ZTUiXSwiZ3JpZENvbG9yRGVmYXVsdCI6dHJ1ZSwid2lkdGgiOiIxMiIsImhlaWdodCI6IjQiLCJjbGFzc05hbWUiOiIiLCJpbnRlcnBvbGF0aW9uIjoibGluZWFyIiwieCI6NzkwLCJ5IjoxMzgwLCJ3aXJlcyI6W1tdXX0seyJpZCI6Ijk0NzBlNTFhOGVjODZkOGUiLCJ0eXBlIjoidWktZ3JvdXAiLCJuYW1lIjoiVGVtcGVyYXR1cmUgJiBIdW1pZGl0eSIsInBhZ2UiOiJmMWViOTliMWU3MTRkNDExIiwid2lkdGgiOjYsImhlaWdodCI6MSwib3JkZXIiOjIsInNob3dUaXRsZSI6ZmFsc2UsImNsYXNzTmFtZSI6IiIsInZpc2libGUiOiJ0cnVlIiwiZGlzYWJsZWQiOiJmYWxzZSIsImdyb3VwVHlwZSI6ImRlZmF1bHQifSx7ImlkIjoiNWE4OWFjNzE3MWY1MWNjMyIsInR5cGUiOiJ1aS1ncm91cCIsIm5hbWUiOiJXZWF0aGVyIEluZm8iLCJwYWdlIjoiZjFlYjk5YjFlNzE0ZDQxMSIsIndpZHRoIjoiNiIsImhlaWdodCI6IjQiLCJvcmRlciI6MSwic2hvd1RpdGxlIjpmYWxzZSwiY2xhc3NOYW1lIjoiIiwidmlzaWJsZSI6InRydWUiLCJkaXNhYmxlZCI6ImZhbHNlIiwiZ3JvdXBUeXBlIjoiZGVmYXVsdCJ9LHsiaWQiOiI3YjIwMjVjMTA0Y2Q1MDZlIiwidHlwZSI6InVpLWdyb3VwIiwibmFtZSI6IldpbmQgU3BlZWQiLCJwYWdlIjoiZjFlYjk5YjFlNzE0ZDQxMSIsIndpZHRoIjoiMTIiLCJoZWlnaHQiOjEsIm9yZGVyIjozLCJzaG93VGl0bGUiOmZhbHNlLCJjbGFzc05hbWUiOiIiLCJ2aXNpYmxlIjoidHJ1ZSIsImRpc2FibGVkIjoiZmFsc2UiLCJncm91cFR5cGUiOiJkZWZhdWx0In0seyJpZCI6ImYxZWI5OWIxZTcxNGQ0MTEiLCJ0eXBlIjoidWktcGFnZSIsIm5hbWUiOiJXZWF0aGVyIERhc2hib2FyZCIsInVpIjoiYWZlYTA0Y2U4NzM1YzBhNiIsInBhdGgiOiIvd2VhdGhlciIsImljb24iOiJob21lIiwibGF5b3V0IjoiZ3JpZCIsInRoZW1lIjoiOTM4MjJhN2I0MzY3M2M1OCIsImJyZWFrcG9pbnRzIjpbeyJuYW1lIjoiRGVmYXVsdCIsInB4IjoiMCIsImNvbHMiOiIzIn0seyJuYW1lIjoiVGFibGV0IiwicHgiOiI1NzYiLCJjb2xzIjoiNiJ9LHsibmFtZSI6IlNtYWxsIERlc2t0b3AiLCJweCI6Ijc2OCIsImNvbHMiOiI5In0seyJuYW1lIjoiRGVza3RvcCIsInB4IjoiMTAyNCIsImNvbHMiOiIxMiJ9XSwib3JkZXIiOjEsImNsYXNzTmFtZSI6IiIsInZpc2libGUiOnRydWUsImRpc2FibGVkIjpmYWxzZX0seyJpZCI6ImFmZWEwNGNlODczNWMwYTYiLCJ0eXBlIjoidWktYmFzZSIsIm5hbWUiOiJVSSBOYW1lIiwicGF0aCI6Ii9kYXNoYm9hcmQiLCJpbmNsdWRlQ2xpZW50RGF0YSI6dHJ1ZSwiYWNjZXB0c0NsaWVudENvbmZpZyI6WyJ1aS1jb250cm9sIiwidWktbm90aWZpY2F0aW9uIl0sImhlYWRlckNvbnRlbnQiOiJwYWdlIiwidGl0bGVCYXJTdHlsZSI6ImRlZmF1bHQiLCJzaG93UmVjb25uZWN0Tm90aWZpY2F0aW9uIjp0cnVlLCJub3RpZmljYXRpb25EaXNwbGF5VGltZSI6NSwic2hvd0Rpc2Nvbm5lY3ROb3RpZmljYXRpb24iOnRydWUsImFsbG93SW5zdGFsbCI6dHJ1ZX0seyJpZCI6IjkzODIyYTdiNDM2NzNjNTgiLCJ0eXBlIjoidWktdGhlbWUiLCJuYW1lIjoiRGVmYXVsdCBUaGVtZSIsImNvbG9ycyI6eyJzdXJmYWNlIjoiIzAwYTNkNyIsInByaW1hcnkiOiIjMDA5NGNlIiwiYmdQYWdlIjoiI2VlZWVlZSIsImdyb3VwQmciOiIjZmZmZmZmIiwiZ3JvdXBPdXRsaW5lIjoiI2NjY2NjYyJ9LCJzaXplcyI6eyJkZW5zaXR5IjoiZGVmYXVsdCIsInBhZ2VQYWRkaW5nIjoiMTJweCIsImdyb3VwR2FwIjoiMTJweCIsImdyb3VwQm9yZGVyUmFkaXVzIjoiNHB4Iiwid2lkZ2V0R2FwIjoiMTJweCJ9fSx7ImlkIjoiOTUwYjNiMzk5ZWEyMmVhNiIsInR5cGUiOiJnbG9iYWwtY29uZmlnIiwiZW52IjpbXSwibW9kdWxlcyI6eyJAZmxvd2Z1c2Uvbm9kZS1yZWQtZGFzaGJvYXJkIjoiMS4yOS4wIn19XQ==",[20,902,904],{"id":903},"whats-next","What's Next?",[10,906,907],{},"That's it! You've built a real-time weather dashboard and learned the basics of Node-RED—connecting to APIs, processing data, and building visual interfaces.",[10,909,910],{},"Throughout this tutorial, you used FlowFuse to host Node-RED and FlowFuse Dashboard for the UI. If you're just starting out, FlowFuse makes things easier—no server setup, no port forwarding, and your dashboard works anywhere. Plus, when you're ready to build bigger projects, features like team collaboration, DevOps pipelines, RBAC, snapshots, and audit logs are already built in.",[10,912,913],{},"Try expanding your dashboard by adding more cities, creating historical charts, or setting up weather alerts. The pattern stays the same—you're just swapping data sources and visualizations.",[10,915,916,920],{},[39,917,919],{"href":41,"rel":918},[43],"Start your free FlowFuse trial"," and keep building.",[922,923,924],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":166,"searchDepth":330,"depth":330,"links":926},[927,928,929,930,931,932,938,939,940],{"id":22,"depth":330,"text":23},{"id":59,"depth":330,"text":60},{"id":102,"depth":330,"text":103},{"id":123,"depth":330,"text":124},{"id":292,"depth":330,"text":293},{"id":536,"depth":330,"text":537,"children":933},[934,935,936,937],{"id":544,"depth":348,"text":545},{"id":600,"depth":348,"text":601},{"id":646,"depth":348,"text":647},{"id":720,"depth":348,"text":721},{"id":773,"depth":330,"text":774},{"id":874,"depth":330,"text":875},{"id":903,"depth":330,"text":904},"md",{"navTitle":5,"excerpt":943},{"type":7,"value":944},[945],[10,946,12],{},"\u002Fblog\u002F2025\u002F12\u002Fgetting-weather-data-in-node-red",{"title":5,"description":12},"blog\u002F2025\u002F12\u002Fgetting-weather-data-in-node-red","DweWXTmpRnFUykKHlPOvGxWPr0fRdtiTXGvpwJucoyE",1780070553856]