Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const angles = ["n", "ne", "e", "se", "s", "sw", "w", "nw", "n"];
- function windDirection(angle) {
- return angles[Math.floor((angle + 22.5) / 45)];
- }
- function decodeWeatherV2(jsonData, parseForecast) {
- json2 = { t: "weather2", v: 2 };
- const weatherCodes = [
- [200, 201, 202, 210, 211, 212, 221, 230, 231, 232],
- [300, 301, 302, 310, 311, 312, 313, 314, 321],
- [],
- [500, 501, 502, 503, 504, 511, 520, 521, 522, 531],
- [600, 601, 602, 611, 612, 613, 615, 616, 620, 621, 622],
- [701, 711, 721, 731, 741, 751, 761, 762, 771, 781],
- [800, 801, 802, 803, 804],
- ];
- const mapWCode = (code) => {
- return weatherCodes[code >> 5][code & 0x1f];
- };
- const buffer = E.toArrayBuffer(atob(jsonData.d));
- const dataView = new DataView(buffer);
- const weather = {
- time: Math.round(Date.now()),
- temp: dataView.getInt8(0),
- hi: dataView.getInt8(1),
- lo: dataView.getInt8(2),
- hum: dataView.getUint8(3),
- rain: dataView.getUint8(4),
- uv: dataView.getUint8(5) / 10,
- code: mapWCode(dataView.getUint8(6)),
- txt: jsonData.c,
- wind: dataView.getUint16(7, true) / 100,
- wdir: dataView.getUint16(9, true),
- loc: jsonData.l,
- dew: dataView.getInt8(11),
- pres: dataView.getUint16(12, true) / 10,
- cloud: dataView.getUint8(14),
- visib: dataView.getUint32(15, true) / 10,
- sunrise: dataView.getUint32(19, true),
- sunset: dataView.getUint32(23, true),
- moonrise: dataView.getUint32(27, true),
- moonset: dataView.getUint32(31, true),
- moonphase: dataView.getUint16(35, true),
- feel: dataView.getInt8(37, true),
- };
- weather.wrose = windDirection(weather.wdir);
- let offset = 38;
- if (offset < buffer.length && parseForecast) {
- // We have forecast data
- // Hourly forecast
- const hoursAmount = dataView.getUint8(offset++);
- const timestampBase = dataView.getUint32(offset, true);
- offset += 4;
- weather.hourfcast = {
- time: [].map.call(
- new Uint8Array(buffer, offset, hoursAmount),
- (v) => timestampBase + (v / 10) * 3600,
- ),
- temp: new Int8Array(buffer, offset + hoursAmount, hoursAmount),
- code: [].map.call(
- new Uint8Array(buffer, offset + hoursAmount * 2, hoursAmount),
- mapWCode,
- ),
- wind: new Uint8Array(buffer, offset + hoursAmount * 3, hoursAmount),
- wdir: [].map.call(
- new Uint8Array(buffer, offset + hoursAmount * 4, hoursAmount),
- (v) => v * 2,
- ),
- wrose: [].map.call(
- new Uint8Array(buffer, offset + hoursAmount * 4, hoursAmount),
- (v) => windDirection(v * 2),
- ),
- rain: new Uint8Array(buffer, offset + hoursAmount * 5, hoursAmount),
- };
- offset += hoursAmount * 6;
- // Daily forecast
- const daysAmount = dataView.getUint8(offset++);
- weather.dayfcast = {
- hi: new Int8Array(buffer, offset, daysAmount),
- lo: new Int8Array(buffer, offset + daysAmount, daysAmount),
- code: [].map.call(
- new Uint8Array(buffer, offset + daysAmount * 2, daysAmount),
- mapWCode,
- ),
- wind: new Uint8Array(buffer, offset + daysAmount * 3, daysAmount),
- wdir: [].map.call(
- new Uint8Array(buffer, offset + daysAmount * 4, daysAmount),
- (v) => v * 2,
- ),
- wrose: [].map.call(
- new Uint8Array(buffer, offset + daysAmount * 4, daysAmount),
- (v) => windDirection(v * 2),
- ),
- rain: new Uint8Array(buffer, offset + daysAmount * 5, daysAmount),
- };
- }
- json2.weather = weather;
- return json2;
- }
Advertisement
Add Comment
Please, Sign In to add comment