Guest User

Untitled

a guest
May 13th, 2025
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const angles = ["n", "ne", "e", "se", "s", "sw", "w", "nw", "n"];
  2. function windDirection(angle) {
  3.     return angles[Math.floor((angle + 22.5) / 45)];
  4. }
  5.  
  6. function decodeWeatherV2(jsonData, parseForecast) {
  7.     json2 = { t: "weather2", v: 2 };
  8.  
  9.     const weatherCodes = [
  10.         [200, 201, 202, 210, 211, 212, 221, 230, 231, 232],
  11.         [300, 301, 302, 310, 311, 312, 313, 314, 321],
  12.         [],
  13.         [500, 501, 502, 503, 504, 511, 520, 521, 522, 531],
  14.         [600, 601, 602, 611, 612, 613, 615, 616, 620, 621, 622],
  15.         [701, 711, 721, 731, 741, 751, 761, 762, 771, 781],
  16.         [800, 801, 802, 803, 804],
  17.     ];
  18.     const mapWCode = (code) => {
  19.         return weatherCodes[code >> 5][code & 0x1f];
  20.     };
  21.  
  22.     const buffer = E.toArrayBuffer(atob(jsonData.d));
  23.     const dataView = new DataView(buffer);
  24.  
  25.     const weather = {
  26.         time: Math.round(Date.now()),
  27.         temp: dataView.getInt8(0),
  28.         hi: dataView.getInt8(1),
  29.         lo: dataView.getInt8(2),
  30.         hum: dataView.getUint8(3),
  31.         rain: dataView.getUint8(4),
  32.         uv: dataView.getUint8(5) / 10,
  33.         code: mapWCode(dataView.getUint8(6)),
  34.         txt: jsonData.c,
  35.         wind: dataView.getUint16(7, true) / 100,
  36.         wdir: dataView.getUint16(9, true),
  37.         loc: jsonData.l,
  38.         dew: dataView.getInt8(11),
  39.         pres: dataView.getUint16(12, true) / 10,
  40.         cloud: dataView.getUint8(14),
  41.         visib: dataView.getUint32(15, true) / 10,
  42.         sunrise: dataView.getUint32(19, true),
  43.         sunset: dataView.getUint32(23, true),
  44.         moonrise: dataView.getUint32(27, true),
  45.         moonset: dataView.getUint32(31, true),
  46.         moonphase: dataView.getUint16(35, true),
  47.         feel: dataView.getInt8(37, true),
  48.     };
  49.     weather.wrose = windDirection(weather.wdir);
  50.  
  51.     let offset = 38;
  52.     if (offset < buffer.length && parseForecast) {
  53.         // We have forecast data
  54.  
  55.         // Hourly forecast
  56.         const hoursAmount = dataView.getUint8(offset++);
  57.  
  58.         const timestampBase = dataView.getUint32(offset, true);
  59.         offset += 4;
  60.  
  61.         weather.hourfcast = {
  62.             time: [].map.call(
  63.                 new Uint8Array(buffer, offset, hoursAmount),
  64.                 (v) => timestampBase + (v / 10) * 3600,
  65.             ),
  66.             temp: new Int8Array(buffer, offset + hoursAmount, hoursAmount),
  67.             code: [].map.call(
  68.                 new Uint8Array(buffer, offset + hoursAmount * 2, hoursAmount),
  69.                 mapWCode,
  70.             ),
  71.             wind: new Uint8Array(buffer, offset + hoursAmount * 3, hoursAmount),
  72.             wdir: [].map.call(
  73.                 new Uint8Array(buffer, offset + hoursAmount * 4, hoursAmount),
  74.                 (v) => v * 2,
  75.             ),
  76.             wrose: [].map.call(
  77.                 new Uint8Array(buffer, offset + hoursAmount * 4, hoursAmount),
  78.                 (v) => windDirection(v * 2),
  79.             ),
  80.             rain: new Uint8Array(buffer, offset + hoursAmount * 5, hoursAmount),
  81.         };
  82.         offset += hoursAmount * 6;
  83.  
  84.         // Daily forecast
  85.         const daysAmount = dataView.getUint8(offset++);
  86.  
  87.         weather.dayfcast = {
  88.             hi: new Int8Array(buffer, offset, daysAmount),
  89.             lo: new Int8Array(buffer, offset + daysAmount, daysAmount),
  90.             code: [].map.call(
  91.                 new Uint8Array(buffer, offset + daysAmount * 2, daysAmount),
  92.                 mapWCode,
  93.             ),
  94.             wind: new Uint8Array(buffer, offset + daysAmount * 3, daysAmount),
  95.             wdir: [].map.call(
  96.                 new Uint8Array(buffer, offset + daysAmount * 4, daysAmount),
  97.                 (v) => v * 2,
  98.             ),
  99.             wrose: [].map.call(
  100.                 new Uint8Array(buffer, offset + daysAmount * 4, daysAmount),
  101.                 (v) => windDirection(v * 2),
  102.             ),
  103.             rain: new Uint8Array(buffer, offset + daysAmount * 5, daysAmount),
  104.         };
  105.     }
  106.  
  107.     json2.weather = weather;
  108.     return json2;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment