MagicMirror Forum
    • Recent
    • Tags
    • Unsolved
    • Solved
    • MagicMirror² Repository
    • Documentation
    • 3rd-Party-Modules
    • Donate
    • Discord
    • Register
    • Login
    A New Chapter for MagicMirror: The Community Takes the Lead
    Read the statement by Michael Teeuw here.

    Can anyone revive AviationWX, PilotWX, or TAF

    Scheduled Pinned Locked Moved Unsolved Requests
    36 Posts 3 Posters 9.8k Views 3 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • mumblebajM Offline
      mumblebaj Module Developer @sdetweil
      last edited by

      @sdetweil The below code works fine. Tested it. Having issues with my system at the moment and can’t make the changes. Can you incorporate?

      async function fetchData(metarUrl, airports) {
        try {
          const response = await axios.get(metarUrl, {
            responseType: 'arraybuffer', // ensure response is treated as binary
            headers: {
              'Accept-Encoding': 'gzip', // request gzip compression
            },
          });
      
          // Unzip the gzip response
          const unzippedData = zlib.gunzipSync(response.data).toString();
      
          let json_string = convert.toJson(unzippedData);
          var json = JSON.parse(json_string);
          var metarData = json.response.data.METAR;
          var airportData = new Object();
      
          var airports = payload.airportList.split(",").map(function (airport) {
              airport = airport.trim();
              return (airport.length < 4) ? "K" + airport : airport;
            });
      
          airports.forEach(function (airport) {
              metarData.forEach(function (metar) {
                  if (airport === metar.station_id) {
                      if (this.debug)
                          console.log("METAR data found for " + airport);
                      airportData[airport] = metar;
                      return; // check next airport in list
                  }
              });
              console.log(metarData)
          });
        } catch (error) {
          console.error('Error fetching data:', error);
        }
      }
      

      Check out my modules at: https://github.com/mumblebaj?tab=repositories
      Check my blog-post: https://mumblebaj.xyz/

      1 Reply Last reply Reply Quote 0
      • mumblebajM Offline
        mumblebaj Module Developer @sdetweil
        last edited by

        @sdetweil I can fix the other fetch as well no issues. Give me a few on this one.

        Check out my modules at: https://github.com/mumblebaj?tab=repositories
        Check my blog-post: https://mumblebaj.xyz/

        1 Reply Last reply Reply Quote 0
        • mumblebajM Offline
          mumblebaj Module Developer @sdetweil
          last edited by

          @sdetweil Both calls working.

          try {
                  const response = await axios.get(metarUrl, {
                      responseType: 'arraybuffer', // ensure response is treated as binary
                      headers: {
                          'Accept-Encoding': 'gzip', // request gzip compression
                      },
                  });
          
                  // Unzip the gzip response
                  const unzippedData = zlib.gunzipSync(response.data).toString();
          
                  let json_string = convert.toJson(unzippedData);
                  var json = JSON.parse(json_string);
                  var metarData = json.response.data.METAR;
                  var airportData = new Object();
          
                  var airports = payload.airportList.split(",").map(function (airport) {
                      airport = airport.trim();
                      return (airport.length < 4) ? "K" + airport : airport;
                  });
          
                  airports.forEach(function (airport) {
                      metarData.forEach(function (metar) {
                          if (airport === metar.station_id) {
                              if (this.debug)
                                  console.log("METAR data found for " + airport);
                              airportData[airport] = metar;
                              return; // check next airport in list
                          }
                      });
                      // console.log(metarData)
                  });
              } catch (error) {
                  console.error('Error fetching data:', error);
              }
          
              const checktype = { "Airspace_Flow_List":"Airspace_Flow", "Ground_Delay_List": "Ground_Delay", "Arrival_Departure_Delay_List": "Delay","Airport_Closure_List":"Airport" }
          
              
              try {
                  const response = await axios.get(FAAUrl);
          
                  // Your further processing
                  let json_string =
                      //convert.toJson(test_data)     swap comments to use test FAA data
                      convert.toJson(response.data.toString());
                  if (this.debug)
                      console.log("json faa=" + json_string);
                  const faa_data = JSON.parse(json_string);
          
                  if (!Array.isArray(faa_data['AIRPORT_STATUS_INFORMATION'].Delay_type)) {
                      // save the current entry
                      const x = faa_data['AIRPORT_STATUS_INFORMATION'].Delay_type
                      //  init as an array
                      faa_data['AIRPORT_STATUS_INFORMATION'].Delay_type = []
                      // add the element into the array
                      faa_data['AIRPORT_STATUS_INFORMATION'].Delay_type.push(x)
                  }
                  // loop thru the delay types
                  faa_data['AIRPORT_STATUS_INFORMATION'].Delay_type.forEach(t => {
                      //
                      if (t.name !== "Airspace Flow Programs") {
                          // for each the  there are two major keys, name and the list for that type
                          // get the key of the list
                          const keyname = Object.keys(t)[1]
                          // remove the "_list"  part for passing to front end
                          const key = keyname.split('_').slice(0, -1).join('_')
                          if (this.debug)
                              console.log("key data=" + JSON.stringify(t[keyname][checktype[keyname]]) + "keyname=" + keyname + " key=" + checktype[keyname] + "\n")
                          if (!Array.isArray(t[keyname][checktype[keyname]])) {
                              const x = t[keyname][checktype[keyname]]
                              t[keyname][checktype[keyname]] = []
                              t[keyname][checktype[keyname]].push(x)
                          } else {
                              console.log("checkytype=" + checktype[keyname])
                          }
                          if (this.debug)
                              console.log("data=" + Object.keys(faa_data['AIRPORT_STATUS_INFORMATION'].Delay_type)[0] + " data=" + JSON.stringify(t) + " keyname=" + keyname + " key=" + key + " last part=" + JSON.stringify(t[keyname][key]) + "\n")
          
                          // look thru all the aaffected airports for this record type
                          t[keyname][checktype[keyname]].forEach(airport_record => {
                              // if the airport is one the user requested
                              if (airports.includes('K' + airport_record.ARPT)) {
                                  if (airportData['K' + airport_record.ARPT]['FAA'] == undefined)
                                      airportData['K' + airport_record.ARPT]['FAA'] = {}
                                  // save this data record
                                  airportData['K' + airport_record.ARPT]['FAA'][key] = airport_record
                              }
                          })
                      }
          
                  });
                  // Emitting data to Socket
                  //self.sendSocketNotification("WX_RESULT", airportData);
              } catch (error) {
                  console.error('Error fetching FAA data:', error);
              }
          

          Check out my modules at: https://github.com/mumblebaj?tab=repositories
          Check my blog-post: https://mumblebaj.xyz/

          S 1 Reply Last reply Reply Quote 0
          • S Offline
            sdetweil @mumblebaj
            last edited by

            @mumblebaj thx. but there is a way to not have to use zlib. I just haven’t found any that work

            Sam

            How to add modules

            learning how to use browser developers window for css changes

            mumblebajM 1 Reply Last reply Reply Quote 0
            • mumblebajM Offline
              mumblebaj Module Developer @sdetweil
              last edited by

              @sdetweil If you want to use fetch you can do the first call as follows.

              try {
                  const response = await fetch(metarUrl, {
                    headers: {
                      'Accept-Encoding': 'gzip', // Request gzip compression
                    },
                  });
              
                  if (!response.ok) {
                    throw new Error(`HTTP error! Status: ${response.status}`);
                  }
              
                  // Read response body as buffer
                  const buffer = await response.buffer();
              
                  // Manually decompress gzip data
                  const zlib = require('zlib');
                  const decompressedData = zlib.gunzipSync(buffer).toString();
              

              You could use pako.

              const decompressedData = pako.inflate(buffer, { to: 'string' });
              

              Check out my modules at: https://github.com/mumblebaj?tab=repositories
              Check my blog-post: https://mumblebaj.xyz/

              S 1 Reply Last reply Reply Quote 0
              • S Offline
                sdetweil @mumblebaj
                last edited by sdetweil

                @mumblebaj but… you are not supposed to have to do either

                Sam

                How to add modules

                learning how to use browser developers window for css changes

                mumblebajM 1 Reply Last reply Reply Quote 0
                • mumblebajM Offline
                  mumblebaj Module Developer @sdetweil
                  last edited by

                  @sdetweil I have not seen another way. Sorry…:man_facepalming:

                  Check out my modules at: https://github.com/mumblebaj?tab=repositories
                  Check my blog-post: https://mumblebaj.xyz/

                  F 1 Reply Last reply Reply Quote 0
                  • F Offline
                    FSAHD @mumblebaj
                    last edited by

                    @mumblebaj @sdetweil fwiw, and I don’t know if this would be any easier for the situation.

                    There is a site called avwx.rest
                    (I believe the pilot wx all was using that source)

                    It’s an API built solely for pilot data
                    You do need a key but maybe the data will be easier to pull?

                    https://avwx.docs.apiary.io/#

                    S 2 Replies Last reply Reply Quote 0
                    • S Offline
                      sdetweil @FSAHD
                      last edited by

                      @FSAHD I might use that for pilot.

                      we are just talking about using more current support , so the module lasts longer

                      Sam

                      How to add modules

                      learning how to use browser developers window for css changes

                      mumblebajM 1 Reply Last reply Reply Quote 0
                      • mumblebajM Offline
                        mumblebaj Module Developer @sdetweil
                        last edited by

                        @sdetweil There is a simple api call from the site to get the metar data whicg might be simpler to use.

                        https://aviationweather.gov/api/data/metar?ids=KMCI%2CKORD%2CKBOS&format=json&taf=true&hours=1&bbox=-26.139%2C28.246&date=2024-03-10T23%3A44%3A22Z

                        Check out my modules at: https://github.com/mumblebaj?tab=repositories
                        Check my blog-post: https://mumblebaj.xyz/

                        1 Reply Last reply Reply Quote 1
                        • 1
                        • 2
                        • 3
                        • 4
                        • 3 / 4
                        • First post
                          Last post
                        Enjoying MagicMirror? Please consider a donation!
                        MagicMirror created by Michael Teeuw.
                        Forum managed by Sam, technical setup by Karsten.
                        This forum is using NodeBB as its core | Contributors
                        Contact | Privacy Policy