From 6d456931433f45a708e4ab0894de71d1a7d54004 Mon Sep 17 00:00:00 2001 From: hhh2210 Date: Fri, 13 Nov 2026 18:16:24 +0800 Subject: [PATCH 1/8] =?UTF-8?q?fix(dev):=20=E8=A1=A5=E5=85=85=20WK3=20?= =?UTF-8?q?=E4=B8=BB=E5=A4=A9=E6=B0=94=20JSON=20=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/wk3-weather-json.md | 41 ++++++ src/function/weatherKit3JSON.mjs | 194 ++++++++++++++++++++++++++ src/process/Request.dev.mjs | 5 + src/process/Response.dev.mjs | 26 ++++ tests/platformBundleReplay.test.mjs | 56 ++++++++ tests/weatherKit3JSON.test.mjs | 208 ++++++++++++++++++++++++++++ 6 files changed, 530 insertions(+) create mode 100644 docs/wk3-weather-json.md create mode 100644 src/function/weatherKit3JSON.mjs create mode 100644 tests/weatherKit3JSON.test.mjs diff --git a/docs/wk3-weather-json.md b/docs/wk3-weather-json.md new file mode 100644 index 00000000..a89aadf3 --- /dev/null +++ b/docs/wk3-weather-json.md @@ -0,0 +1,41 @@ +# WK3 主天气 JSON 适配(开发入口) + +基于 `dev` 的 WK3 二进制支持,补充当前天气、逐日、逐小时天气替换。 +不将 WK3 二进制交给 WK2 codec;不新增供应商、缓存、空气质量算法或平台构建分支。 + +## 请求与处理边界 + +- 仅 HTTPS `weatherkit.apple.com/api/v3/weather/` 的 GET,且 User-Agent 为 + `WeatherKit_Weather_iOS_` / `WeatherKit_Weather_macOS_` 前缀。 +- 仅在天气来源选择彩云或和风、国家在既有 `Weather.Replace` 范围内,且 URL + `dataSets` 与用户设置的交集包含当前、逐日或逐小时天气时协商 `Accept: application/json`。 +- 小组件、后台客户端、WK2、仅请求空气质量或分钟雨等请求继续原路径;发布入口不变。 +- JSON 响应调用现有六种产品注入函数,仍受 URL 与设置交集限制。未请求的产品 + 不发起供应商请求。单产品异常、非有限数字或“暂不可用”结果保留 Apple 产品。 +- JSON 协商改变了整个响应的表示,因此同包中未替换的已知 Apple 产品也需兼容 + 主 App JSON reader:天气枚举向量转标量、降水统计保留分类量并补标量、预警 UUID + 字节对象转 UUID 字符串。未知根产品和未知嵌套对象不作转换。 +- 返回 JSON 后删除旧 `bodyBytes`、正文长度、编码及缓存验证头。响应最多 4 MiB, + 遍历最多 64 层 / 100000 个节点,单数组最多 8192 项。 + +表示适配依据 [PR #107 的固定版本与原生观察](https://github.com/hhhoratioxu/WeatherKit/blob/355b5f5dad9d01cb13167949f8334a489b301811/docs/loon-v3-compatibility.md)。 +派生代码保留作者及 Apache-2.0 声明;未引入该 PR 的缓存、备用来源、地理判定和算法重构。 + +## 验证 + +```sh +npm ci +npm run build +npm run build:dev +npm run build:dev-args +node --test tests/*.test.mjs +``` + +`weatherKit3JSON.test.mjs` 覆盖设置边界、三种天气替换、混合数据集、失败回退、 +未知字段、字节正文和主 App 表示转换。`platformBundleReplay.test.mjs` 从实际构建的 +request/response bundle 发起模拟供应商调用,检查 Surge `$done` 形状和天气结果。 +测试夹具是合成数据,不代表本机原生解码或真实天气来源已经验收。 + +发布或启用前,仍需在 macOS/iOS 27.3 真机上核对实际 v3 请求、脚本日志、 +当前/逐小时/逐日数据与来源,并检查原生解码失败及 CloudKit 回退。 +本机已有的 Siri 路由例外属于安装配置,不混入上游协议补丁。 diff --git a/src/function/weatherKit3JSON.mjs b/src/function/weatherKit3JSON.mjs new file mode 100644 index 00000000..090bf883 --- /dev/null +++ b/src/function/weatherKit3JSON.mjs @@ -0,0 +1,194 @@ +// WK3 JSON reader adaptations derived from hhhoratioxu/WeatherKit PR #107 +// (355b5f5dad9d01cb13167949f8334a489b301811), Copyright 2026 hhhoratioxu. +// SPDX-License-Identifier: Apache-2.0 +import { Console } from "@nsnanocat/util"; + +const weatherProducts = ["currentWeather", "forecastDaily", "forecastHourly"]; +const clientProducts = [...weatherProducts, "airQuality", "forecastNextHour", "weatherAlerts", "forecastPeriodic", "weatherChanges"]; +const clientContainers = new Set(["metadata", "days", "hours", "minutes", "daytimeForecast", "overnightForecast", "series", "periods", "condition", "parameters", "summary", "alerts", "pollutants"]); +const maxBodyBytes = 4 * 1024 * 1024; +const object = value => value !== null && typeof value === "object" && !Array.isArray(value); +const header = (headers, name) => Object.entries(headers ?? {}).find(([key]) => key.toLowerCase() === name)?.[1]; + +/** Only negotiate JSON for main-app requests which actually need weather replacement. */ +export function useWeatherKit3JSON(request, parameters, settings) { + return ( + request.method === "GET" && + /^https:\/\/weatherkit\.apple\.com\/api\/v3\/weather\//.test(request.url) && + /^WeatherKit_Weather_(iOS|macOS)_/.test(header(request.headers, "user-agent")) && + parameters.version === "v3" && + [parameters.latitude, parameters.longitude].every(value => value !== undefined && Number.isFinite(Number(value))) && + Math.abs(Number(parameters.latitude)) <= 90 && + Math.abs(Number(parameters.longitude)) <= 180 && + ["ColorfulClouds", "QWeather"].includes(settings.Weather?.Provider) && + settings.Weather?.Replace?.includes(parameters.country) && + parameters.dataSets.some(name => weatherProducts.includes(name) && settings.DataSets.includes(name)) + ); +} + +/** Adapt Apple's JSON representation to the native main-app reader; unknown roots stay untouched. */ +export function adaptWeatherKit3JSON(product, name, provider = false) { + let nodes = 0; + function visit(value, depth = 0, known = true) { + if (++nodes > 100000 || depth > 64) throw new RangeError("WK3 JSON exceeds traversal bounds"); + if (!value || typeof value !== "object") return; + if (Array.isArray(value)) { + if (value.length > 8192) throw new RangeError("WK3 JSON vector too large"); + for (const item of value) visit(item, depth + 1, known); + return; + } + for (const key of Object.keys(value)) { + let item = value[key]; + if (!known) { + visit(item, depth + 1, false); + continue; + } + if ((key === "conditionCode" || key === "precipitationType" || (key === "condition" && item?.length > 0)) && Array.isArray(item) && item.every(entry => typeof entry === "string")) { + const first = item.find(entry => entry); + if (first === undefined) delete value[key]; + else value[key] = first; + item = value[key]; + } + if ((key === "precipitationAmount" || key.startsWith("snowfallAmount")) && object(item) && Number.isFinite(item.expected)) value[key] = item = item.expected; + if (/^precipitationAmount(?:(?:Previous|Next)\d+h)?ByType$/.test(key) && Array.isArray(item)) { + const scalar = key.slice(0, -"ByType".length); + if (value[scalar] === undefined && item.every(part => object(part) && Number.isFinite(part.expected) && part.expected >= 0)) { + const amount = item.reduce((sum, part) => sum + part.expected, 0); + if (Number.isFinite(amount)) value[scalar] = amount; + } + } + if (provider) { + if (item === undefined) { + delete value[key]; + continue; + } + if (typeof item === "number" && !Number.isFinite(Math.fround(item))) throw new RangeError("Invalid WK3 provider number"); + const range = integerRange(key); + if (range && item != null) { + if (typeof item !== "number" || item < 0 || item > range) throw new RangeError(`Invalid WK3 ${key}`); + value[key] = item = timeFields.has(key) ? Math.trunc(item) : Math.round(item); + } + if (item === 0 && optionalTimes.has(key)) { + delete value[key]; + continue; + } + if (key === "metadata" && object(item)) { + for (const coordinate of ["latitude", "longitude"]) + if (typeof item[coordinate] === "string" && item[coordinate].trim()) { + const number = Number(item[coordinate]); + if (!Number.isFinite(number)) throw new RangeError("Invalid WK3 coordinate"); + item[coordinate] = number; + } + } + } + visit(item, depth + 1, clientContainers.has(key)); + } + } + visit(product); + if (name === "weatherAlerts") + for (const alert of product?.alerts ?? []) { + const bytes = alert?.id?.bytes; + if (!Array.isArray(bytes) || bytes.length !== 16 || !bytes.every(byte => Number.isInteger(byte) && byte >= 0 && byte <= 255)) continue; + const hex = bytes.map(byte => byte.toString(16).padStart(2, "0")).join(""); + alert.id = `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`; + } + return product; +} + +const percentages = new Set(["cloudCover", "cloudCoverLowAltPct", "cloudCoverMidAltPct", "cloudCoverHighAltPct", "humidity", "humidityMax", "humidityMin", "precipitationChance"]); +const bytes = new Set(["uvIndex", "maxUvIndex", "uvIndexMax", "uvIndexMin", "categoryIndex"]); +const timeFields = new Set([ + "asOf", + "readTime", + "reportedTime", + "expireTime", + "forecastStart", + "forecastEnd", + "startTime", + "endTime", + "date", + "effectiveTime", + "issuedTime", + "eventOnsetTime", + "eventEndTime", + "moonrise", + "moonset", + "sunrise", + "sunset", + "sunriseCivil", + "sunsetCivil", + "sunriseNautical", + "sunsetNautical", + "sunriseAstronomical", + "sunsetAstronomical", + "solarNoon", + "solarMidnight", + "temperatureMaxTime", + "temperatureMinTime", +]); +const optionalTimes = new Set([ + "reportedTime", + "endTime", + "eventOnsetTime", + "eventEndTime", + "moonrise", + "moonset", + "sunrise", + "sunset", + "sunriseCivil", + "sunsetCivil", + "sunriseNautical", + "sunsetNautical", + "sunriseAstronomical", + "sunsetAstronomical", + "solarNoon", + "solarMidnight", + "temperatureMaxTime", + "temperatureMinTime", +]); +function integerRange(key) { + if (percentages.has(key)) return 100; + if (bytes.has(key)) return 255; + if (key === "index" || key === "windDirection") return 65535; + if (timeFields.has(key)) return 0xffffffff; +} + +/** Process each selected product independently, reusing existing injectors and preserving Apple on failure. */ +export async function replaceWeatherKit3JSON(response, dataSets, injectors) { + if (response.status !== 200 || !/^application\/json(?:;|$)/i.test(header(response.headers, "content-type"))) return response; + const raw = response.bodyBytes ?? response.body; + let body; + try { + if ((typeof raw === "string" ? raw.length : raw?.byteLength) > maxBodyBytes) return response; + const text = typeof raw === "string" ? raw : new TextDecoder("utf-8", { fatal: true }).decode(raw); + if (new TextEncoder().encode(text).byteLength > maxBodyBytes) return response; + body = JSON.parse(text); + if (!object(body)) return response; + // JSON negotiation changes representation even for unselected products in the same response. + // In particular forecastPeriodic and retained alert UUIDs still need reader compatibility. + for (const name of clientProducts) if (object(body[name])) adaptWeatherKit3JSON(body[name], name); + } catch { + return response; + } + await Promise.all( + [...new Set(dataSets)].map(async name => { + if (!injectors[name] || (!object(body[name]?.metadata) && name !== "forecastNextHour")) return; + const original = body[name]; + try { + const copy = original === undefined ? undefined : JSON.parse(JSON.stringify(original)); + const value = await injectors[name](copy); + if (object(value?.metadata) && value.metadata.temporarilyUnavailable !== true) body[name] = adaptWeatherKit3JSON(value, name, true); + } catch (error) { + body[name] = original; + Console.warn("WeatherKit.api.v3.weather.json", `preserved ${name}: ${error?.name ?? "Error"}`); + } + }), + ); + const encoded = JSON.stringify(body); + if (new TextEncoder().encode(encoded).byteLength > maxBodyBytes) return response; + const headers = { ...response.headers }; + for (const key of Object.keys(headers)) if (["content-length", "content-encoding", "etag", "last-modified", "content-md5", "digest", "cache-control"].includes(key.toLowerCase())) delete headers[key]; + headers["Cache-Control"] = "no-store"; + const { bodyBytes: _bodyBytes, ...result } = response; + return { ...result, headers, body: encoded }; +} diff --git a/src/process/Request.dev.mjs b/src/process/Request.dev.mjs index fba6aa36..e72dadf3 100644 --- a/src/process/Request.dev.mjs +++ b/src/process/Request.dev.mjs @@ -6,6 +6,7 @@ import WeatherAlerts from "../class/WeatherAlerts.mjs"; import database from "../function/database.mjs"; import parseWeatherKitURL from "../function/parseWeatherKitURL.mjs"; import setENV from "../function/setENV.mjs"; +import { useWeatherKit3JSON } from "../function/weatherKit3JSON.mjs"; /***************** Processing *****************/ export async function Request($request) { // 构造回复数据 @@ -165,6 +166,10 @@ export async function Request($request) { break; } $request.url = url.toString(); + if (useWeatherKit3JSON($request, parseWeatherKitURL(url), Settings)) { + for (const key of Object.keys($request.headers)) if (["accept", "if-modified-since"].includes(key.toLowerCase())) delete $request.headers[key]; + $request.headers.Accept = "application/json"; + } Console.debug(`$request.url: ${$request.url}`); return { $request, $response }; } diff --git a/src/process/Response.dev.mjs b/src/process/Response.dev.mjs index 59d33872..3261aba2 100644 --- a/src/process/Response.dev.mjs +++ b/src/process/Response.dev.mjs @@ -14,6 +14,7 @@ import mergeWeatherKitAvailability from "../function/mergeWeatherKitAvailability import parseWeatherKitURL from "../function/parseWeatherKitURL.mjs"; import providerNameToLogo from "../function/providerNameToLogo.mjs"; import setENV from "../function/setENV.mjs"; +import { replaceWeatherKit3JSON, useWeatherKit3JSON } from "../function/weatherKit3JSON.mjs"; /***************** Processing *****************/ export async function Response($request, $response) { // 解构URL @@ -31,6 +32,31 @@ export async function Response($request, $response) { */ const { Settings, Caches, Configs } = setENV("iRingo", "WeatherKit", database); Console.logLevel = Settings.LogLevel; + const parameters = parseWeatherKitURL(url); + if (useWeatherKit3JSON($request, parameters, Settings) && Object.entries($response.headers ?? {}).some(([key, value]) => key.toLowerCase() === "content-type" && /^application\/json(?:;|$)/i.test(value))) { + const providerParameters = { ...parameters }; + const enviroments = { + colorfulClouds: new ColorfulClouds(providerParameters, Settings?.API?.ColorfulClouds?.Token || "Y2FpeXVuX25vdGlmeQ=="), + qWeather: new QWeather(providerParameters, Settings?.API?.QWeather?.Token || "bdd98ec1d87747f3a2e8b1741a5af796", Settings?.API?.QWeather?.Host), + waqi: new WAQI(parameters, Settings?.API?.WAQI?.Token), + country: parameters.country, + }; + return replaceWeatherKit3JSON( + $response, + parameters.dataSets.filter(name => Settings.DataSets.includes(name)), + { + currentWeather: product => InjectCurrentWeather(product, Settings, enviroments), + forecastDaily: product => InjectForecastDaily(product, Settings, enviroments), + forecastHourly: product => InjectForecastHourly(product, Settings, enviroments), + airQuality: product => InjectAirQuality(product, Settings, Caches, enviroments), + forecastNextHour: product => InjectForecastNextHour(product, Settings, enviroments), + weatherAlerts: product => { + enviroments.qWeather.weatherKitLanguage = product?.metadata?.language ?? enviroments.qWeather.weatherKitLanguage; + return InjectWeatherAlerts(product, Settings, enviroments); + }, + }, + ); + } // 创建空数据 let body = {}; // 格式判断 diff --git a/tests/platformBundleReplay.test.mjs b/tests/platformBundleReplay.test.mjs index c1446f4c..9698992e 100644 --- a/tests/platformBundleReplay.test.mjs +++ b/tests/platformBundleReplay.test.mjs @@ -130,3 +130,59 @@ test("release bundle keeps the WK2 path byte-identical without injections", { sk const output = await replay(releaseBundle, "release-v2"); assert.deepEqual(output.body, wk2Empty); }); + +test("dev request/response bundles negotiate WK3 JSON and replace weather via the real Caiyun adapter", { skip: !bundlesExist && "dist bundles not built" }, async () => { + const date = 1800000000; + const metadata = { providerName: "Apple", temporarilyUnavailable: false }; + const original = { currentWeather: { metadata, temperature: 20, conditionCode: ["RAIN"], retainedField: 42 }, unknown: { conditionCode: ["untouched"] } }; + replayGlobals({ url: "https://weatherkit.apple.com/api/v3/weather/zh-Hans/22.54/114.06?country=CN&dataSets=currentWeather", body: new Uint8Array() }); + globalThis.$request.headers = { "User-Agent": "WeatherKit_Weather_macOS_Version_27.3", accept: "application/vnd.apple.flatbuffer" }; + globalThis.$argument = { LogLevel: "OFF", Storage: "Argument", DataSets: "currentWeather", Weather: { Provider: "ColorfulClouds", Replace: "CN" } }; + const negotiated = await new Promise((resolve, reject) => { + globalThis.$done = resolve; + import(`${new URL("../dist/request.dev.bundle.js", import.meta.url).href}?replay=wk3-json`).catch(reject); + }); + assert.equal(negotiated.headers.Accept, "application/json"); + globalThis.$request = negotiated; + globalThis.$response = { status: 200, headers: { "Content-Type": "application/json", ETag: "old" }, body: new TextEncoder().encode(JSON.stringify(original)) }; + let calls = 0; + globalThis.$httpClient.get = (request, callback) => { + calls++; + assert.match(request.url, /realtime/); + const payload = { + status: "ok", + location: [22.54, 114.06], + result: { + server_time: date, + realtime: { + status: "ok", + cloudrate: 0.25, + skycon: "CLEAR_DAY", + humidity: 0.65, + precipitation: { local: { intensity: 0 } }, + pressure: 101300, + temperature: 27, + apparent_temperature: 28, + visibility: 10, + wind: { direction: 90, speed: 3 }, + }, + }, + }; + callback(null, { status: 200, headers: {} }, JSON.stringify(payload)); + }; + const output = await new Promise((resolve, reject) => { + globalThis.$done = resolve; + import(`${devBundle.href}?replay=wk3-json-weather`).catch(reject); + }); + assert.equal(calls, 1); + assert.equal(output.response, undefined, "Surge response-stage $done is unwrapped"); + assert.equal(output.bodyBytes, undefined); + const body = JSON.parse(output.body); + assert.equal(body.currentWeather.temperature, 27); + assert.equal(body.currentWeather.conditionCode, "CLEAR"); + assert.equal(body.currentWeather.humidity, 65); + assert.equal(body.currentWeather.metadata.providerName, "彩云天气"); + assert.equal(body.currentWeather.retainedField, 42); + assert.deepEqual(body.unknown, original.unknown); + assert.equal(output.headers.ETag, undefined); +}); diff --git a/tests/weatherKit3JSON.test.mjs b/tests/weatherKit3JSON.test.mjs new file mode 100644 index 00000000..e4c2bfa6 --- /dev/null +++ b/tests/weatherKit3JSON.test.mjs @@ -0,0 +1,208 @@ +import assert from "node:assert/strict"; +import test, { beforeEach } from "node:test"; + +globalThis.$environment = { "surge-version": "test" }; +globalThis.$persistentStore = { read: () => null, write: () => true }; +globalThis.$argument = { LogLevel: "OFF", Storage: "Argument" }; + +const [{ Request }, { Response }, { default: ColorfulClouds }, { default: QWeather }, { adaptWeatherKit3JSON, replaceWeatherKit3JSON }] = await Promise.all([ + import("../src/process/Request.dev.mjs"), + import("../src/process/Response.dev.mjs"), + import("../src/class/ColorfulClouds.mjs"), + import("../src/class/QWeather.mjs"), + import("../src/function/weatherKit3JSON.mjs"), +]); + +const time = 1800000000; +const metadata = { providerName: "Apple", latitude: 22.54, longitude: 114.06, readTime: time, temporarilyUnavailable: false }; +const forecast = { forecastStart: time, forecastEnd: time + 3600, conditionCode: ["RAIN"], precipitationAmountByType: [{ precipitationType: ["RAIN"], expected: 6 }], temperature: 20, retainedField: "keep" }; +// Synthetic reader-contract fixture derived from PR #107's documented macOS observations, +// not a capture or proof of native acceptance on this Mac. +function appleBody() { + return structuredClone({ + currentWeather: { metadata, temperature: 20, conditionCode: ["RAIN"], humidity: 80, retainedField: "keep" }, + forecastDaily: { metadata, days: [{ ...forecast, daytimeForecast: forecast, overnightForecast: forecast }] }, + forecastHourly: { metadata, hours: [forecast] }, + forecastPeriodic: { metadata, series: [{ periods: [forecast] }] }, + weatherAlerts: { metadata, alerts: [{ id: { bytes: Array.from({ length: 16 }, (_, i) => i) }, description: "Apple alert" }] }, + unknownRoot: { conditionCode: ["DO_NOT_TOUCH"], nested: { expected: 17 } }, + }); +} +function request(dataSets = "currentWeather,forecastDaily,forecastHourly,forecastPeriodic,weatherAlerts") { + return { + method: "GET", + headers: { "User-Agent": "WeatherKit_Weather_macOS_Version_27.3", accept: "application/vnd.apple.flatbuffer", "If-None-Match": "old", "If-Modified-Since": "yesterday" }, + url: `https://weatherkit.apple.com/api/v3/weather/zh-Hans/22.54/114.06?country=CN&dataSets=${dataSets}`, + }; +} +function response(body = appleBody()) { + return { status: 200, headers: { "Content-Type": "application/json; charset=utf-8", ETag: "old", "content-length": "100", Digest: "old", "X-Keep": "yes" }, body: JSON.stringify(body) }; +} +beforeEach(() => { + globalThis.$argument = { + LogLevel: "OFF", + Storage: "Argument", + DataSets: ["currentWeather", "forecastDaily", "forecastHourly"], + Weather: { Provider: "ColorfulClouds", Replace: ["CN"] }, + }; + globalThis.$httpClient = { get: () => assert.fail("unexpected real provider request") }; +}); + +test("main-app WK3 request negotiates JSON without changing datasets or URL", async () => { + const input = request(); + const { $request: output } = await Request(input); + assert.equal(output.url, request().url); + assert.equal(output.headers.Accept, "application/json"); + assert.equal(output.headers.accept, undefined); + assert.equal(output.headers["If-None-Match"], undefined); + assert.equal(output.headers["If-Modified-Since"], undefined); +}); + +test("JSON negotiation is restricted by client, version, method, country, provider and dataset", async () => { + const cases = [ + input => { + input.headers["User-Agent"] = "WeatherWidget"; + }, + input => { + input.url = input.url.replace("v3", "v2"); + }, + input => { + input.method = "HEAD"; + }, + input => { + input.url = input.url.replace("country=CN", "country=US"); + }, + input => { + input.url = input.url.replace("22.54", "122.54"); + }, + input => { + input.url = input.url.replace(/dataSets=.*/, "dataSets=forecastPeriodic"); + }, + () => { + globalThis.$argument.Weather.Provider = "WeatherKit"; + }, + () => { + globalThis.$argument.DataSets = "[]"; + }, + ]; + for (const configure of cases) { + globalThis.$argument.Weather.Provider = "ColorfulClouds"; + globalThis.$argument.DataSets = ["currentWeather", "forecastDaily", "forecastHourly"]; + const input = request(); + configure(input); + const { $request: output } = await Request(input); + assert.equal(output.headers.accept, "application/vnd.apple.flatbuffer", configure.toString()); + assert.equal(output.headers.Accept, undefined); + } + const input = request(); + globalThis.$argument.DataSets = ["currentWeather"]; + input.headers["user-agent"] = input.headers["User-Agent"].replace("macOS", "iOS"); + delete input.headers["User-Agent"]; + assert.equal((await Request(input)).$request.headers.Accept, "application/json"); +}); + +test("WK3 JSON reuses Caiyun current, daily and hourly replacements and preserves other roots", async t => { + t.mock.method(ColorfulClouds.prototype, "CurrentWeather", async () => ({ metadata: { providerName: "彩云天气" }, temperature: 27, humidity: 65.4, conditionCode: "CLEAR" })); + t.mock.method(ColorfulClouds.prototype, "Daily", async () => ({ metadata: { providerName: "彩云天气" }, days: [{ forecastStart: time, temperatureMax: 30, conditionCode: "CLEAR" }] })); + t.mock.method(ColorfulClouds.prototype, "ForecastHourly", async () => ({ metadata: { providerName: "彩云天气" }, hours: [{ forecastStart: time, temperature: 28, conditionCode: "CLEAR" }] })); + const input = response(); + const output = await Response(request(), input); + const body = JSON.parse(output.body); + assert.equal(body.currentWeather.temperature, 27); + assert.equal(body.currentWeather.humidity, 65); + assert.equal(body.currentWeather.metadata.providerName, "彩云天气"); + assert.equal(body.currentWeather.retainedField, "keep"); + assert.equal(body.forecastDaily.days[0].temperatureMax, 30); + assert.equal(body.forecastHourly.hours[0].temperature, 28); + assert.equal(body.forecastDaily.days[0].precipitationAmount, 6); + assert.equal(body.forecastDaily.days[0].daytimeForecast.precipitationAmount, 6); + assert.equal(body.forecastPeriodic.series[0].periods[0].conditionCode, "RAIN"); + assert.equal(body.weatherAlerts.alerts[0].id, "00010203-0405-0607-0809-0a0b0c0d0e0f"); + assert.deepEqual(body.unknownRoot, appleBody().unknownRoot); + assert.equal(output.headers.ETag, undefined); + assert.equal(output.headers.Digest, undefined); + assert.equal(output.headers["content-length"], undefined); + assert.equal(output.headers["Cache-Control"], "no-store"); + assert.equal(output.headers["X-Keep"], "yes"); + assert.equal(input.body, response().body, "input response stays unmodified"); +}); + +test("QWeather uses existing injectors; only requested AND enabled weather products are replaced", async t => { + globalThis.$argument.Weather.Provider = "QWeather"; + globalThis.$argument.DataSets = ["currentWeather", "forecastDaily"]; + const now = t.mock.method(QWeather.prototype, "WeatherNow", async () => ({ metadata: { providerName: "和风天气" }, temperature: 25 })); + t.mock.method(QWeather.prototype, "Daily", async () => assert.fail("daily not requested")); + t.mock.method(QWeather.prototype, "Hourly", async () => assert.fail("hourly disabled")); + const output = JSON.parse((await Response(request("currentWeather,forecastHourly"), response())).body); + assert.equal(output.currentWeather.temperature, 25); + assert.equal(now.mock.callCount(), 1); + assert.equal(output.forecastHourly.hours[0].temperature, 20); + assert.equal(output.forecastDaily.metadata.providerName, "Apple"); +}); + +test("provider failure/invalid number rolls back one product without discarding healthy replacements", async t => { + t.mock.method(ColorfulClouds.prototype, "CurrentWeather", async () => ({ metadata: { providerName: "Invalid" }, temperature: Number.NaN })); + t.mock.method(ColorfulClouds.prototype, "Daily", async () => { + throw new Error("offline"); + }); + t.mock.method(ColorfulClouds.prototype, "ForecastHourly", async () => ({ metadata: { providerName: "彩云天气" }, hours: [{ forecastStart: time, temperature: 29 }] })); + const output = JSON.parse((await Response(request(), response())).body); + assert.equal(output.currentWeather.temperature, 20); + assert.equal(output.currentWeather.metadata.providerName, "Apple"); + assert.equal(output.currentWeather.conditionCode, "RAIN", "fallback still satisfies the negotiated reader format"); + assert.equal(output.forecastDaily.metadata.providerName, "Apple"); + assert.equal(output.forecastHourly.hours[0].temperature, 29); +}); + +test("Surge binary-body-mode JSON bytes are decoded and stale bodyBytes removed", async t => { + t.mock.method(ColorfulClouds.prototype, "CurrentWeather", async () => ({ metadata: { providerName: "彩云天气" }, temperature: 27 })); + const input = response(); + input.bodyBytes = new TextEncoder().encode(input.body); + input.body = "stale"; + const output = await Response(request("currentWeather"), input); + assert.equal(JSON.parse(output.body).currentWeather.temperature, 27); + assert.equal(output.bodyBytes, undefined); +}); + +test("provider's unavailable result preserves usable Apple data and attribution", async t => { + t.mock.method(ColorfulClouds.prototype, "CurrentWeather", async () => ({ metadata: { providerName: "彩云天气", temporarilyUnavailable: true } })); + const output = JSON.parse((await Response(request("currentWeather"), response())).body); + assert.equal(output.currentWeather.metadata.providerName, "Apple"); + assert.equal(output.currentWeather.metadata.temporarilyUnavailable, false); + assert.equal(output.currentWeather.temperature, 20); +}); + +test("unknown nested fields retain their own shapes", () => { + const unknown = { conditionCode: ["FUTURE"], precipitationAmount: { expected: 8 } }; + const value = { conditionCode: ["RAIN"], unknown: structuredClone(unknown) }; + adaptWeatherKit3JSON(value, "currentWeather"); + assert.equal(value.conditionCode, "RAIN"); + assert.deepEqual(value.unknown, unknown); +}); + +test("malformed/error/oversized JSON responses are returned untouched without provider calls", async () => { + const cases = [ + { ...response(), status: 503 }, + { ...response(), body: "{" }, + { ...response(), body: "[]" }, + { ...response(), body: " ".repeat(4 * 1024 * 1024 + 1) }, + ]; + for (const input of cases) assert.equal(await Response(request(), input), input); +}); + +test("periodic-only normalization works independently of replaceable products", async () => { + const output = await replaceWeatherKit3JSON(response({ forecastPeriodic: appleBody().forecastPeriodic }), [], {}); + assert.equal(JSON.parse(output.body).forecastPeriodic.series[0].periods[0].precipitationAmount, 6); +}); + +test("condition record arrays stay intact; provider timestamp absence and integer rules are explicit", () => { + const condition = [{ startTime: time, forecastToken: "START" }]; + const value = { condition, humidity: 65.6, reportedTime: 0, temperature: -2, metadata: { latitude: "22.54", longitude: "114.06" } }; + adaptWeatherKit3JSON(value, "currentWeather", true); + assert.deepEqual(value.condition, condition); + assert.equal(value.humidity, 66); + assert.equal(value.reportedTime, undefined); + assert.equal(value.temperature, -2); + assert.equal(value.metadata.latitude, 22.54); + assert.throws(() => adaptWeatherKit3JSON({ humidity: 120 }, "currentWeather", true), RangeError); +}); From 499e7f67f66ec6dc7e4075021e8ae32a843f962a Mon Sep 17 00:00:00 2001 From: hhh2210 Date: Fri, 13 Nov 2026 18:32:58 +0800 Subject: [PATCH 2/8] =?UTF-8?q?fix(dev):=20=E4=BF=9D=E7=95=99=20WK3=20JSON?= =?UTF-8?q?=20=E5=A4=B1=E8=B4=A5=E5=9B=9E=E9=80=80=E7=9A=84=E5=8E=9F?= =?UTF-8?q?=E7=94=9F=E5=85=BC=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/function/weatherKit3JSON.mjs | 17 ++++++++++++++--- tests/weatherKit3JSON.test.mjs | 24 ++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/function/weatherKit3JSON.mjs b/src/function/weatherKit3JSON.mjs index 090bf883..d784162f 100644 --- a/src/function/weatherKit3JSON.mjs +++ b/src/function/weatherKit3JSON.mjs @@ -170,6 +170,7 @@ export async function replaceWeatherKit3JSON(response, dataSets, injectors) { } catch { return response; } + const fallback = JSON.stringify(body); await Promise.all( [...new Set(dataSets)].map(async name => { if (!injectors[name] || (!object(body[name]?.metadata) && name !== "forecastNextHour")) return; @@ -177,15 +178,25 @@ export async function replaceWeatherKit3JSON(response, dataSets, injectors) { try { const copy = original === undefined ? undefined : JSON.parse(JSON.stringify(original)); const value = await injectors[name](copy); - if (object(value?.metadata) && value.metadata.temporarilyUnavailable !== true) body[name] = adaptWeatherKit3JSON(value, name, true); + if (object(value?.metadata) && value.metadata.temporarilyUnavailable !== true) { + const candidate = adaptWeatherKit3JSON(value, name, true); + // Bound and validate before assigning so an invalid provider graph cannot poison the whole response. + const encoded = JSON.stringify(candidate, (_key, item) => { + if (typeof item === "number" && !Number.isFinite(item)) throw new RangeError("Invalid WK3 provider number"); + return item; + }); + if (new TextEncoder().encode(encoded).byteLength > maxBodyBytes) throw new RangeError("WK3 product too large"); + body[name] = candidate; + } } catch (error) { body[name] = original; Console.warn("WeatherKit.api.v3.weather.json", `preserved ${name}: ${error?.name ?? "Error"}`); } }), ); - const encoded = JSON.stringify(body); - if (new TextEncoder().encode(encoded).byteLength > maxBodyBytes) return response; + let encoded = JSON.stringify(body); + // Once JSON is negotiated, fallback must still satisfy the native JSON reader (not raw WK3 JSON). + if (new TextEncoder().encode(encoded).byteLength > maxBodyBytes) encoded = fallback; const headers = { ...response.headers }; for (const key of Object.keys(headers)) if (["content-length", "content-encoding", "etag", "last-modified", "content-md5", "digest", "cache-control"].includes(key.toLowerCase())) delete headers[key]; headers["Cache-Control"] = "no-store"; diff --git a/tests/weatherKit3JSON.test.mjs b/tests/weatherKit3JSON.test.mjs index e4c2bfa6..1d5caa35 100644 --- a/tests/weatherKit3JSON.test.mjs +++ b/tests/weatherKit3JSON.test.mjs @@ -180,6 +180,30 @@ test("unknown nested fields retain their own shapes", () => { assert.deepEqual(value.unknown, unknown); }); +test("oversized/invalid provider graphs keep normalized Apple data instead of raw WK3 JSON", async () => { + for (const extra of ["x".repeat(4 * 1024 * 1024), [Number.NaN], 1n]) { + const output = await replaceWeatherKit3JSON(response(), ["currentWeather"], { + currentWeather: product => ({ ...product, temperature: 27, extra }), + }); + const body = JSON.parse(output.body); + assert.equal(body.currentWeather.temperature, 20); + assert.equal(body.currentWeather.conditionCode, "RAIN"); + assert.equal(body.currentWeather.extra, undefined); + } +}); + +test("combined product size fallback keeps the reader-compatible response", async () => { + const extra = "x".repeat(3 * 1024 * 1024); + const output = await replaceWeatherKit3JSON(response(), ["currentWeather", "forecastHourly"], { + currentWeather: product => ({ ...product, temperature: 27, extra }), + forecastHourly: product => ({ ...product, extra }), + }); + const body = JSON.parse(output.body); + assert.equal(body.currentWeather.temperature, 20); + assert.equal(body.currentWeather.conditionCode, "RAIN"); + assert.equal(body.forecastHourly.extra, undefined); +}); + test("malformed/error/oversized JSON responses are returned untouched without provider calls", async () => { const cases = [ { ...response(), status: 503 }, From cb32f80d7a9be9d3f8a2572fee2400a824fe873e Mon Sep 17 00:00:00 2001 From: hhh2210 Date: Fri, 13 Nov 2026 19:04:09 +0800 Subject: [PATCH 3/8] =?UTF-8?q?fix(dev):=20=E5=AF=B9=E9=BD=90=2027.3=20?= =?UTF-8?q?=E7=9C=9F=E6=9C=BA=20JSON=20=E8=A7=A3=E7=A0=81=E8=BE=B9?= =?UTF-8?q?=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/wk3-weather-json.md | 21 +++++++++++++--- src/function/weatherKit3JSON.mjs | 14 ++++++++--- tests/weatherKit3JSON.test.mjs | 42 ++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/docs/wk3-weather-json.md b/docs/wk3-weather-json.md index a89aadf3..b40ebfb4 100644 --- a/docs/wk3-weather-json.md +++ b/docs/wk3-weather-json.md @@ -36,6 +36,21 @@ node --test tests/*.test.mjs request/response bundle 发起模拟供应商调用,检查 Surge `$done` 形状和天气结果。 测试夹具是合成数据,不代表本机原生解码或真实天气来源已经验收。 -发布或启用前,仍需在 macOS/iOS 27.3 真机上核对实际 v3 请求、脚本日志、 -当前/逐小时/逐日数据与来源,并检查原生解码失败及 CloudKit 回退。 -本机已有的 Siri 路由例外属于安装配置,不混入上游协议补丁。 +## macOS 验收(2026-11-13) + +macOS 27.3(26C5035r)、Surge 6.12.0(12820),本地加载同一构建产物: + +- 主 App 的 v3 请求实际协商 `application/json`;抓取的改写响应中,当前、逐日和 + 逐小时产品均保留彩云来源(逐日 11 项、逐小时 274 项),空气标准为 `EU.EAQI`。 +- 苏州、无锡预览显示当前天气、逐小时、逐日、分钟雨与 EAQI;无锡逐日详情中的 + 当前温度、最高/最低温与主页面一致,小时图表可正常打开。 +- 真机发现的 EAQI 污染物 `index=-1` 哨兵、降水分类枚举、`restOfDayForecast` + 和 `forecastPeriodic.forecasts[].periods[]` 均已补回归。修正后的三个有界日志窗口 + 合计 30 次 WeatherData 更新成功,无 `Unable to decode` 或 CloudKit 回退记录。 +- 未将原始位置、授权头或完整抓包加入仓库。未实测 iPhone、watchOS 或其他代理客户端; + 这不是长时间稳定性/耗电结论。后台小组件保留既有 WK3 二进制路径。 + +本机 GitHub 登录缺少 Packages 读取权限,因此协议依赖由公开 `v2.0.5` 标签 +(`NSRingo/apple.WeatherKit@c87c1dcd851ea9293141bcfb32fde1b2cca564b9`)源码构建; +未改依赖声明或锁文件,也未声称与发布的 npm tarball 字节一致。 +Siri 路由例外属于独立配置修复,不混入此协议补丁。 diff --git a/src/function/weatherKit3JSON.mjs b/src/function/weatherKit3JSON.mjs index d784162f..a4155061 100644 --- a/src/function/weatherKit3JSON.mjs +++ b/src/function/weatherKit3JSON.mjs @@ -5,7 +5,8 @@ import { Console } from "@nsnanocat/util"; const weatherProducts = ["currentWeather", "forecastDaily", "forecastHourly"]; const clientProducts = [...weatherProducts, "airQuality", "forecastNextHour", "weatherAlerts", "forecastPeriodic", "weatherChanges"]; -const clientContainers = new Set(["metadata", "days", "hours", "minutes", "daytimeForecast", "overnightForecast", "series", "periods", "condition", "parameters", "summary", "alerts", "pollutants"]); +const clientContainers = new Set(["metadata", "days", "hours", "minutes", "daytimeForecast", "overnightForecast", "restOfDayForecast", "series", "forecasts", "periods", "condition", "parameters", "summary", "alerts", "pollutants"]); +const precipitationByType = /^precipitationAmount(?:(?:Previous|Next)\d+h)?ByType$/; const maxBodyBytes = 4 * 1024 * 1024; const object = value => value !== null && typeof value === "object" && !Array.isArray(value); const header = (headers, name) => Object.entries(headers ?? {}).find(([key]) => key.toLowerCase() === name)?.[1]; @@ -28,6 +29,13 @@ export function useWeatherKit3JSON(request, parameters, settings) { /** Adapt Apple's JSON representation to the native main-app reader; unknown roots stay untouched. */ export function adaptWeatherKit3JSON(product, name, provider = false) { + // Existing AQ algorithms use -1 for an optional pollutant index not defined by that standard. + // WK3 JSON uses unsigned integers: omit the sentinel, preserving the concentration and overall AQ. + if (provider && name === "airQuality") + for (const pollutant of product?.pollutants ?? []) { + if (pollutant.index === -1) delete pollutant.index; + if (pollutant.categoryIndex === -1) delete pollutant.categoryIndex; + } let nodes = 0; function visit(value, depth = 0, known = true) { if (++nodes > 100000 || depth > 64) throw new RangeError("WK3 JSON exceeds traversal bounds"); @@ -50,7 +58,7 @@ export function adaptWeatherKit3JSON(product, name, provider = false) { item = value[key]; } if ((key === "precipitationAmount" || key.startsWith("snowfallAmount")) && object(item) && Number.isFinite(item.expected)) value[key] = item = item.expected; - if (/^precipitationAmount(?:(?:Previous|Next)\d+h)?ByType$/.test(key) && Array.isArray(item)) { + if (precipitationByType.test(key) && Array.isArray(item)) { const scalar = key.slice(0, -"ByType".length); if (value[scalar] === undefined && item.every(part => object(part) && Number.isFinite(part.expected) && part.expected >= 0)) { const amount = item.reduce((sum, part) => sum + part.expected, 0); @@ -81,7 +89,7 @@ export function adaptWeatherKit3JSON(product, name, provider = false) { } } } - visit(item, depth + 1, clientContainers.has(key)); + visit(item, depth + 1, clientContainers.has(key) || precipitationByType.test(key)); } } visit(product); diff --git a/tests/weatherKit3JSON.test.mjs b/tests/weatherKit3JSON.test.mjs index 1d5caa35..673e4fc4 100644 --- a/tests/weatherKit3JSON.test.mjs +++ b/tests/weatherKit3JSON.test.mjs @@ -180,6 +180,48 @@ test("unknown nested fields retain their own shapes", () => { assert.deepEqual(value.unknown, unknown); }); +test("native 27.3 precipitation ranges, rest-of-day and periodic forecasts use scalar conditions", () => { + const current = { precipitationAmountPrevious1hByType: [{ expected: 2, precipitationType: ["RAIN"] }] }; + adaptWeatherKit3JSON(current, "currentWeather"); + assert.equal(current.precipitationAmountPrevious1hByType[0].precipitationType, "RAIN"); + const daily = { days: [{ restOfDayForecast: { conditionCode: ["CLOUDY"], precipitationAmountByType: [{ expected: 3, precipitationType: ["RAIN"] }] } }] }; + adaptWeatherKit3JSON(daily, "forecastDaily"); + assert.equal(daily.days[0].restOfDayForecast.conditionCode, "CLOUDY"); + assert.equal(daily.days[0].restOfDayForecast.precipitationAmountByType[0].precipitationType, "RAIN"); + const periodic = { forecasts: [{ periods: [{ conditionCode: ["RAIN"] }] }] }; + adaptWeatherKit3JSON(periodic, "forecastPeriodic"); + assert.equal(periodic.forecasts[0].periods[0].conditionCode, "RAIN"); +}); + +test("EAQI's unsupported CO sub-index does not roll back the whole AQ product", async t => { + globalThis.$argument.DataSets = "airQuality,currentWeather"; + globalThis.$argument.AirQuality = { Calculate: { Algorithm: "EU_EAQI" }, Comparison: { ReplaceWhenCurrentChange: false } }; + t.mock.method(ColorfulClouds.prototype, "CurrentWeather", async () => undefined); + // Minimal synthetic copy of the native response shape that exposed the -1 sentinel regression. + const apple = appleBody(); + apple.airQuality = { + metadata: { ...metadata, providerName: "和风天气" }, + index: 40, + categoryIndex: 1, + scale: "HJ6332012.2604", + previousDayComparison: "UNKNOWN", + pollutants: [ + ["PM10", 40], + ["NO2", 57], + ["CO", 0.6], + ["OZONE", 46], + ["PM2_5", 26], + ["SO2", 9], + ].map(([pollutantType, amount]) => ({ pollutantType, amount, units: "MICROGRAMS_PER_CUBIC_METER" })), + }; + const body = JSON.parse((await Response(request("airQuality,currentWeather"), response(apple))).body); + assert.match(body.airQuality.scale, /^EU\.EAQI/); + const co = body.airQuality.pollutants.find(pollutant => pollutant.pollutantType === "CO"); + assert.equal(co.amount, 600, "existing provider-unit correction still applies"); + assert.equal(co.index, undefined); + assert.equal(co.categoryIndex, undefined); +}); + test("oversized/invalid provider graphs keep normalized Apple data instead of raw WK3 JSON", async () => { for (const extra of ["x".repeat(4 * 1024 * 1024), [Number.NaN], 1n]) { const output = await replaceWeatherKit3JSON(response(), ["currentWeather"], { From 83be24f8506da517783d94fdb0d548ac72ba4a56 Mon Sep 17 00:00:00 2001 From: hhh2210 Date: Fri, 13 Nov 2026 19:44:16 +0800 Subject: [PATCH 4/8] =?UTF-8?q?fix(weather):=20=E5=85=88=E5=B0=86=E5=BD=A9?= =?UTF-8?q?=E4=BA=91=E4=BA=91=E9=87=8F=E6=8D=A2=E7=AE=97=E4=B8=BA=E7=99=BE?= =?UTF-8?q?=E5=88=86=E6=AF=94=E5=86=8D=E5=8F=96=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/class/ColorfulClouds.mjs | 6 ++-- tests/dailyPrecipitationTotals.test.mjs | 38 ++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/class/ColorfulClouds.mjs b/src/class/ColorfulClouds.mjs index 0a7f1c6a..b3c78ca6 100644 --- a/src/class/ColorfulClouds.mjs +++ b/src/class/ColorfulClouds.mjs @@ -519,7 +519,7 @@ export default class ColorfulClouds { daytimeForecast: { forecastStart: timeStamp + 8 * 3600, // 8 hours forecastEnd: timeStamp + 8 * 3600 + 12 * 3600, // 8 + 12 hours - cloudCover: body?.result?.daily?.cloudrate?.[i]?.avg, + cloudCover: Math.round(body?.result?.daily?.cloudrate?.[i]?.avg * 100), // cloudCoverHighAltPct: 0, // Not given // cloudCoverLowAltPct: 0, // Not given // cloudCoverMidAltPct: 0, // Not given @@ -543,7 +543,7 @@ export default class ColorfulClouds { overnightForecast: { forecastStart: timeStamp + 20 * 3600, // 20 hours forecastEnd: timeStamp + 20 * 3600 + 12 * 3600, // 20 + 12 hours - cloudCover: body?.result?.daily?.cloudrate?.[i]?.avg, + cloudCover: Math.round(body?.result?.daily?.cloudrate?.[i]?.avg * 100), // cloudCoverHighAltPct: 0, // Not given // cloudCoverLowAltPct: 0, // Not given // cloudCoverMidAltPct: 0, // Not given @@ -839,7 +839,7 @@ export default class ColorfulClouds { return { metadata: this.#Metadata(hourly.result.server_time, hourly.location), hours: Array.from({ length: hourly.result.hourly.skycon.length }, (_, i) => ({ - cloudCover: hourly.result.hourly.cloudrate[i].value, + cloudCover: Math.round(hourly.result.hourly.cloudrate[i].value * 100), // cloudCoverHighAltPct: 0, // Not given // cloudCoverLowAltPct: 0, // Not given // cloudCoverMidAltPct: 0, // Not given diff --git a/tests/dailyPrecipitationTotals.test.mjs b/tests/dailyPrecipitationTotals.test.mjs index ed99a25a..1290a629 100644 --- a/tests/dailyPrecipitationTotals.test.mjs +++ b/tests/dailyPrecipitationTotals.test.mjs @@ -7,7 +7,8 @@ globalThis.$argument = { LogLevel: "OFF", Storage: "database" }; globalThis.$httpClient = { get(request, callback) { let body; - if (request.url.includes("api.caiyunapp.com")) body = colorfulCloudsDaily; + if (request.url.includes("/hourly?")) body = colorfulCloudsHourly; + else if (request.url.includes("api.caiyunapp.com")) body = colorfulCloudsDaily; else if (request.url.includes("/v7/weather/")) body = qWeatherDaily; else throw new Error(`unexpected request: ${request.url}`); callback(null, { headers: {}, status: 200 }, JSON.stringify(body)); @@ -35,6 +36,8 @@ test("ColorfulClouds keeps WeatherKit daily amount pairs while replacing support assert.equal(appleDay.precipitationChance, 80); assert.equal(appleDay.daytimeForecast.precipitationChance, 70); assert.equal(appleDay.overnightForecast.precipitationChance, 60); + assert.equal(appleDay.daytimeForecast.cloudCover, 80); + assert.equal(appleDay.overnightForecast.cloudCover, 80); }); test("QWeather keeps WeatherKit daily amount pairs instead of reusing one daily total", async () => { @@ -129,3 +132,36 @@ const qWeatherDaily = { fxLink: "https://www.qweather.com/", updateTime: "2026-07-16T08:00:00+08:00", }; + +// The provider boundary converts fractions once, before either WK2 encoding or WK3 JSON rounding. +const colorfulCloudsHourly = { + status: "ok", + location: [30, 120], + result: { + hourly: { + status: "ok", + skycon: [{ value: "CLOUDY", datetime: "2026-11-13T12:00:00Z" }], + cloudrate: [{ value: 0.5 }], + humidity: [{ value: 0.5 }], + precipitation: [{ value: 0, probability: 0 }], + pressure: [{ value: 101300 }], + temperature: [{ value: 20 }], + apparent_temperature: [{ value: 20 }], + visibility: [{ value: 10 }], + wind: [{ direction: 0, speed: 1 }], + }, + }, +}; +test("Caiyun hourly cloud-cover fractions are converted to percentages before rounding", async () => { + for (const [fraction, percent] of [ + [0, 0], + [0.005, 1], + [0.5, 50], + [0.8, 80], + [1, 100], + ]) { + colorfulCloudsHourly.result.hourly.cloudrate[0].value = fraction; + const forecast = await new ColorfulClouds({ ...parameters, version: "v3" }, "token").ForecastHourly(1); + assert.equal(forecast.hours[0].cloudCover, percent); + } +}); From f4676feae89a27a8403c574c6086a433d5adb3c9 Mon Sep 17 00:00:00 2001 From: hhh2210 Date: Fri, 13 Nov 2026 19:44:16 +0800 Subject: [PATCH 5/8] =?UTF-8?q?test(wk3):=20=E7=94=A8=2027.3=20=E6=88=90?= =?UTF-8?q?=E5=AF=B9=E5=93=8D=E5=BA=94=E6=A0=B8=E5=AF=B9=E7=8E=B0=E6=9C=89?= =?UTF-8?q?=20schema?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/wk3-paired-validation.md | 52 ++++++++ scripts/compare-wk3-pair.mjs | 95 ++++++++++++++ tests/fixtures/wk3-paired/README.md | 36 ++++++ tests/fixtures/wk3-paired/hangzhou/apple.bin | Bin 0 -> 11332 bytes tests/fixtures/wk3-paired/hangzhou/apple.json | 1 + .../wk3-paired/hangzhou/manifest.json | 82 ++++++++++++ .../wk3-paired/seattle-repeat/apple.bin | Bin 0 -> 13820 bytes .../wk3-paired/seattle-repeat/apple.json | 1 + .../wk3-paired/seattle-repeat/manifest.json | 117 ++++++++++++++++++ tests/fixtures/wk3-paired/seattle/apple.bin | Bin 0 -> 13784 bytes tests/fixtures/wk3-paired/seattle/apple.json | 1 + .../fixtures/wk3-paired/seattle/manifest.json | 87 +++++++++++++ tests/fixtures/wk3-paired/tianjin/apple.bin | Bin 0 -> 10160 bytes tests/fixtures/wk3-paired/tianjin/apple.json | 1 + .../fixtures/wk3-paired/tianjin/manifest.json | 82 ++++++++++++ tests/weatherKit3Paired.test.mjs | 48 +++++++ 16 files changed, 603 insertions(+) create mode 100644 docs/wk3-paired-validation.md create mode 100644 scripts/compare-wk3-pair.mjs create mode 100644 tests/fixtures/wk3-paired/README.md create mode 100644 tests/fixtures/wk3-paired/hangzhou/apple.bin create mode 100644 tests/fixtures/wk3-paired/hangzhou/apple.json create mode 100644 tests/fixtures/wk3-paired/hangzhou/manifest.json create mode 100644 tests/fixtures/wk3-paired/seattle-repeat/apple.bin create mode 100644 tests/fixtures/wk3-paired/seattle-repeat/apple.json create mode 100644 tests/fixtures/wk3-paired/seattle-repeat/manifest.json create mode 100644 tests/fixtures/wk3-paired/seattle/apple.bin create mode 100644 tests/fixtures/wk3-paired/seattle/apple.json create mode 100644 tests/fixtures/wk3-paired/seattle/manifest.json create mode 100644 tests/fixtures/wk3-paired/tianjin/apple.bin create mode 100644 tests/fixtures/wk3-paired/tianjin/apple.json create mode 100644 tests/fixtures/wk3-paired/tianjin/manifest.json create mode 100644 tests/weatherKit3Paired.test.mjs diff --git a/docs/wk3-paired-validation.md b/docs/wk3-paired-validation.md new file mode 100644 index 00000000..84dad152 --- /dev/null +++ b/docs/wk3-paired-validation.md @@ -0,0 +1,52 @@ +# 27.3 JSON / FlatBuffer 成对验证 + +2026-11-13,macOS 27.3 (26C5035r)。杭州、天津、西雅图及西雅图复测共四组, +每组同 URL / 地点 / 请求参数,仅改变 Accept;启动差小于 2 ms。 +抓取时旁路改写,恢复后继续使用 WK3 Preview。使用当前 dev 的三个产品 codec +解码,并独立读取原始 vtable 的时间整数与分钟向量长度。 + +## 结果 + +| 样本 | 完整字段行数 | 已对齐 | 当前产品 codec 缺失 | 摘要 condition 缺失 | 返回值/版本差异 | +|---|---:|---:|---:|---:|---:| +| 杭州 | 2121 | 48 | 2073 | 0 | 0 | +| 天津 | 2057 | 48 | 2009 | 0 | 0 | +| 西雅图 | 2436 | 420 | 2014 | 1 | 1 | +| 西雅图复测 | 2448 | 422 | 2014 | 1 | 11 | +| 合计 | 9062 | 938 | 8110 | 2 | 12 | + +“已对齐”包括逐值相同、float32 表示精度、UUID 字节/字符串等价和明确的缺省值。 +空气质量污染物按名称对齐;原始数组顺序相反。时间戳保持整数精确比较。 + +| 字段(样本) | JSON 值 | FlatBuffer 解码值 | 是否一致 | 原因 / 原始字节复核 | +|---|---|---|---|---| +| AQ index(杭州) | 50 | 50 | 是 | short 标量一致 | +| AQ CO amount(杭州) | 0.7 | 0.699999988079071 | 是 | 同一 float32;单位枚举相同 | +| alert severity(西雅图) | MINOR | MINOR | 是 | 枚举一致 | +| alert importance(西雅图) | LOW | LOW | 是 | 枚举一致 | +| alert responses(西雅图) | MONITOR | MONITOR | 是 | 枚举一致 | +| nextHour minutes(西雅图) | 81 条 | 81 条 | 是 | 所有已声明分钟字段逐项比对 | +| nextHour.summary[0].condition[0] | CLEAR | 未输出 | 否 | 当前 schema 将摘要槽 2 标记 deprecated | +| AQ metadata.expireTime(西雅图) | 1794571344 | 1794571285 | 否 | 原始槽 1 的 uint32 确为 1794571285 | +| AQ metadata.expireTime(复测) | 1794571287 | 1794571351 | 否 | 原始槽 1 的 uint32 确为 1794571351 | +| nextHour.metadata.reportedTime(复测) | 1794569160 | 1794569280 | 否 | 原始时间值相差 120 秒 | +| nextHour.forecastEnd(复测) | 1794574560 | 1794574680 | 否 | 原始时间值也相差 120 秒 | +| nextHour.minutes(复测) | 82 条 | 84 条 | 否 | 原始向量长度 84;多出两条、共八个字段 | +| currentWeather / daily / hourly 等 | 有值 | 未输出 | 否 | dev 没有这些产品的 WK3 codec;没有套用 WK2 或占位 ubyte | + +完整 9062 行由 `node scripts/compare-wk3-pair.mjs output/wk3-paired` 生成, +列为字段名、JSON 值、FlatBuffer 解码值、是否一致及原因,并带样本名。 +四组成对脱敏响应和 SHA-256 已存入 `tests/fixtures/wk3-paired/`,可重复生成表格。 + +## 已定位与下一步 + +- cloudCover 在彩云 provider 边界修正为百分比,覆盖小时与日间/夜间预报; + 0.5 → 50、0.8 → 80,回归另覆盖 0、0.005、1。 +- 三个已实现产品中,样本内的枚举和单位标签逐项对齐;发现的时间差直接存在于原始 + 整数中。复测的 reportedTime 和 forecastEnd 同时相差 120 秒,记录为不同产品版本, + 不归因于枚举或单位换算。 +- 要输出分钟摘要 condition,需要在协议包补充槽 2 的向量定义和读取器;当前样本是 + 单元素 CLEAR,确定元素宽度还需多元素摘要样本。 +- 要解码当前/逐日/逐小时等其余产品,需要在协议包定义其表和 codec,再用本组样本 + 重跑全字段表。当前 8110 项记录为 schema/codec 缺项。 +- 当前分钟雨样本的雨强为零;检验非零雨强数值换算,需要追加正在降雨地区的原始成对样本。 diff --git a/scripts/compare-wk3-pair.mjs b/scripts/compare-wk3-pair.mjs new file mode 100644 index 00000000..c2bfea74 --- /dev/null +++ b/scripts/compare-wk3-pair.mjs @@ -0,0 +1,95 @@ +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath, pathToFileURL } from "node:url"; +import { ByteBuffer } from "flatbuffers"; + +globalThis.$environment ??= { "surge-version": "test" }; +globalThis.$persistentStore ??= { read: () => null, write: () => true }; +const { Console } = await import("@nsnanocat/util"); +Console.logLevel = "OFF"; +const { default: WeatherKit3 } = await import("../src/class/WeatherKit3.mjs"); +const supported = ["airQuality", "forecastNextHour", "weatherAlerts"]; +const missing = ""; +const floatFields = new Set(["latitude", "longitude", "amount", "precipitationIntensity", "perceivedPrecipitationIntensity"]); +// Direct vtable reads independently check the decoder's integer fields and vector lengths. +function wireFacts(bb) { + const root = bb.readUint32(0); + const child = (table, slot) => { + const offset = bb.__offset(table, 4 + slot * 2); + return offset ? bb.__indirect(table + offset) : 0; + }; + const scalar = (table, slot) => { + const offset = bb.__offset(table, 4 + slot * 2); + return offset ? bb.readUint32(table + offset) : 0; + }; + const aqMetadata = child(child(root, 0), 0), + nextHour = child(root, 5); + return { aqExpiry: scalar(aqMetadata, 1), minuteCount: nextHour ? bb.readUint32(child(nextHour, 5)) : 0, forecastEnd: nextHour ? scalar(nextHour, 4) : 0, reportedTime: nextHour ? scalar(child(nextHour, 0), 8) : 0 }; +} + +function fields(value, prefix = "", out = {}) { + if (value && typeof value === "object" && !Array.isArray(value) && !(Array.isArray(value.bytes) && value.bytes.length === 16)) { + for (const [key, child] of Object.entries(value)) fields(child, prefix ? `${prefix}.${key}` : key, out); + } else if (Array.isArray(value) && value.length) { + for (const [index, child] of value.entries()) { + // The wire and JSON services return pollutants in opposite orders; compare species, not positions. + const key = child?.pollutantType ? `[${child.pollutantType}]` : `[${index}]`; + fields(child, `${prefix}${key}`, out); + } + } else out[prefix] = value; + return out; +} + +export function comparePair(directory) { + const apple = JSON.parse(fs.readFileSync(path.join(directory, "apple.json"))); + const wire = new ByteBuffer(new Uint8Array(fs.readFileSync(path.join(directory, "apple.bin")))); + const { json: decoded, failures } = WeatherKit3.decodeWithReport(wire, supported); + const a = fields(apple), + b = fields(decoded), + raw = wireFacts(wire); + const rows = [...new Set([...Object.keys(a), ...Object.keys(b)])].sort().map(field => { + const x = Object.hasOwn(a, field) ? a[field] : missing; + const y = Object.hasOwn(b, field) ? b[field] : missing; + let equal = JSON.stringify(x) === JSON.stringify(y), + reason = equal ? "一致" : "值不一致:需定位单位/枚举/偏移"; + const root = field.split(/[.[]/)[0]; + if (!supported.includes(root)) reason = "缺字段:当前 dev 未实现该产品的 WK3 codec"; + else if (floatFields.has(field.split(".").at(-1)) && typeof x === "number" && typeof y === "number" && Math.fround(x) === Math.fround(y)) { + equal = true; + reason = x === y ? "一致" : "一致:JSON 十进制与 float32 表示精度"; + } else if (Array.isArray(x?.bytes) && typeof y === "string") { + equal = x.bytes.map(byte => byte.toString(16).padStart(2, "0")).join("") === y.replaceAll("-", ""); + reason = equal ? "一致:同一 UUID 的字节/字符串表示" : "UUID 字节不一致"; + } else if (field === "airQuality.metadata.expireTime" && !equal && y === raw.aqExpiry) reason = "返回值差异:原始 Metadata 槽 1 的 uint32 与解码值一致"; + else if (field === "forecastNextHour.metadata.reportedTime" && !equal && y === raw.reportedTime) reason = `数据版本差异:原始 reportedTime 与 JSON 相差 ${y - x} 秒`; + else if (field === "forecastNextHour.forecastEnd" && !equal && y === raw.forecastEnd) reason = "返回值差异:原始 forecastEnd uint32 与解码值一致"; + else if (x === missing && /^forecastNextHour\.minutes\[/.test(field) && raw.minuteCount > (apple.forecastNextHour?.minutes?.length ?? 0)) { + reason = `返回值差异:JSON 分钟向量 ${apple.forecastNextHour.minutes.length} 条,原始 FlatBuffer 向量 ${raw.minuteCount} 条`; + } else if (x === missing && (y === null || y === 0 || y === false || (Array.isArray(y) && y.length === 0))) { + equal = true; + reason = "一致:JSON 省略缺省值,schema 返回缺省值"; + } else if (y === missing && /forecastNextHour\.summary\[\d+\]\.condition/.test(field)) reason = "缺字段:WK3 summary 槽 2 在当前 schema 标记 deprecated"; + else if (y === missing) reason = "缺字段:当前 codec 未输出此字段"; + return { field, json: x, flatbuffer: y, equal, reason }; + }); + const counts = {}; + for (const row of rows) counts[row.reason] = (counts[row.reason] ?? 0) + 1; + return { rows, failures, counts, decoded, raw }; +} + +if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { + const output = path.resolve(process.argv[2] ?? "output/wk3-paired"); + fs.mkdirSync(output, { recursive: true }); + const all = [], + summaries = {}; + for (const city of ["hangzhou", "tianjin", "seattle", "seattle-repeat"]) { + const result = comparePair(fileURLToPath(new URL(`../tests/fixtures/wk3-paired/${city}/`, import.meta.url))); + all.push(...result.rows.map(row => ({ sample: city, ...row }))); + summaries[city] = { counts: result.counts, failures: result.failures, fields: result.rows.length, raw: result.raw }; + fs.writeFileSync(path.join(output, `${city}.decoded.json`), JSON.stringify(result.decoded, null, 2)); + } + const cell = value => `"${String(typeof value === "object" ? JSON.stringify(value) : value).replaceAll('"', '""')}"`; + fs.writeFileSync(path.join(output, "fields.csv"), "sample,field,JSON,FlatBuffer,equal,reason\n" + all.map(row => [row.sample, row.field, row.json, row.flatbuffer, row.equal, row.reason].map(cell).join(",")).join("\n") + "\n"); + fs.writeFileSync(path.join(output, "summary.json"), JSON.stringify(summaries, null, 2)); + console.log(JSON.stringify(summaries, null, 2)); +} diff --git a/tests/fixtures/wk3-paired/README.md b/tests/fixtures/wk3-paired/README.md new file mode 100644 index 00000000..3ac9ea87 --- /dev/null +++ b/tests/fixtures/wk3-paired/README.md @@ -0,0 +1,36 @@ +# macOS 27.3 paired WeatherKit responses + +Captured on 2026-11-13 from this macOS 27.3 (26C5035r) host, using its native Weather +request credentials only in memory. The rewrite module was disabled for the bounded +probe and restored in `finally`. Each pair uses the same public test location, URL, +User-Agent, schema header and datasets. Only `Accept` differs. Requests begin within +2 ms of each other; exact acquisition times and response media types are in each manifest. + +- `hangzhou`, `tianjin`: public city-centre requests, not device-location requests. +- `seattle`: includes 81 native minute records and one real weather alert. +- `seattle-repeat`: explicit no-cache repeat; both HTTP responses report the same Date + and MISS, but the JSON minute product is two minutes older (82 records versus 84). + This acquisition is retained rather than selecting only matching responses. + +Redaction: no request headers, credentials or device metadata are stored. Metadata +latitude/longitude are replaced with zero in JSON and in vtable-validated binary float +fields. Coordinates embedded in URLs are zeroed with same-length byte substitutions. +The binary is **not re-encoded**; original vtables, product slots, enum values, unknown +fields and timestamps remain. Manifest offsets audit exactly which floats changed. +JSON is compact to retain the wire-response style and avoid generated diff noise. + +Schema/codec under test: WeatherKit `dev@cd9d7927`, protocol `v2.0.5` source tag at +`NSRingo/apple.WeatherKit@c87c1dcd` (the local source-build procedure is in +`docs/wk3-weather-json.md`). The comparison does not interpret `unknownN:ubyte` root +placeholders as product schemas. + +```sh +node scripts/compare-wk3-pair.mjs output/wk3-paired +node --test tests/weatherKit3Paired.test.mjs +``` + +The generator writes every field to `fields.csv` (sample, field, JSON, FlatBuffer, +equal, reason), decoded JSON and summary counts. Pollutants are keyed by species +because the two formats return them in opposite orders. Float32 equivalence is used +only for schema float fields, never timestamps; UUIDs and omitted defaults have +explicit comparison rules. Integer mismatches are checked against direct vtable reads. diff --git a/tests/fixtures/wk3-paired/hangzhou/apple.bin b/tests/fixtures/wk3-paired/hangzhou/apple.bin new file mode 100644 index 0000000000000000000000000000000000000000..bcebe1759069106cb65f67593be92aa43153436c GIT binary patch literal 11332 zcmcgy3tUxI*5BuXh%Z7#1=PG5Dk91?@Xh0FgexH`B8nO+;Kj$jq*p{G1%#4G8!dcf zYMA&attR6$HJx$%9Bs<-k?E8+T1HM~Wd+qJd=<3V-nIAKLgRyc0LmkGx0Ns!nOTq7`wv4^g z6=nX66$LOBe^*i5@jecO*USX+0x{;n+Ou}*lRImRU+N{fxOm`wSMZ}!H+#9{a_as% zp0MB*j#`F!pC}658-J)2Co3w2_9>8V)@(lf0Kvw|$CS*e4UE?$;7H+^twR#xW1v}IWf7cUyTa8Xuz=AzV$ zAZpw7s-mc}U#$@=q)KFMUoim=NDEBPu8W?dl!Qw(K~97 zF<*zaz3f`1_82tai~qP<$x8h}^3t8Kq%Zn+%iUhZ4C&ENWC0rC#-7#m??SpK@}@%j zMg4o{ex(S(y*FrLD(N#d!x){Knel`%DK&G^!bS6qW7A2&c;5z;zG(2&DY#QRdcUn$ zv0}&)dq+{H;T0?XL9->oLf4{esvSr=4z2V*X9vB0)cBXXpnt)PbWbCr19ar1A6GY& zhoa5_bc`1$8Wt7=oe{iX z`600BuB!BHSvcCErbwPkC3`s@U5fYIl8>hCmv0bmsJ*IUjEMLT4gkT8j4vP?^`kUXUqt6Ira;UrTDo=2=J2-m4eCdTG{rs?{Pfakff=MLat zE*rl;A-B7_L0%u*AHSm|=IUc6Y{wql$O&7Qr}868GZ#eIb)D$Il`w58;hH;Jwh$)U z*5GYyjKuTD*#l*roN=A~Tv5IrxQ%~1btmt7uRuPwAyXcI#~pZvN$mCu z(airLbD_sZ{-^i0@Bu@&Mf}-Vs^gjIz>}!qvCN)iAuOiZt?~4_(S+wL@C1F9FYDxt zXZlS=nYVfe-yTrHLtk7bM=cyCzZ3a}j9FX5!_v)T-q^^`+~3083Z9R+JNbZ)XJSh{ zb5jOe2updt)_8vBgl9UQ?@q2pTN*jzxeYww`MbE!^?m%SO9}ESuRwW5k6pl%&)AlJ zW_CNzOjw32f05sMxo1R0!xr6+9(3S|PgKXo^w}L!2}|ksm96Y36!xL_*KOdraQ=L_ zPR@8f!8>$mt2y{T+ zt`_dFnMlY%b#!XUb1Qh#T%j@=5L+d#~)<9IWk{XXh@J&bt9c06t8 zIYk;2J1&iNs}?!nc@#XUj!rFk9<5gtnhUjg5YYnWbu=ecugO>Ef12Nkuh+?Dd59Nxl7+dnYr{qnq_T{QC`pa4sll$5N-mXmv{OeAX zqYoa;`x#8}l4VAs<Vb0(_(MLyb}Qd!dqL$}nca-m3AdD-suJ;ED#|n9OLcT= z$@dxX{p!*)a-X>#Xn&mDhcZLaPr2MM=y~|j&BRwaQ`n4eDEU?5OFmZPI~DSVS&9x- ziL>Bqs8tlIqmwgVAM|2VToQ-4WIT(74TQo9M*Ne$k13ler@!U}Ok865y+}t=(XCv* zwl|IYO@!4YW=S)wh$py;_1@*j?O3NtsYzjJ`TMFw)-6Rj2&_~`Cugi}fi)g09zysi zELLXYm{~;{!h&I+e(Yhe^tZ=Sw0>x^)2|Ok%YzSnEHl#deHz;Izz)R%3!*e^ZocnDeNPPR((`elb6d>$gmH@A)}+&X6efh`*P^ z%Y$~HA2pr>q;5l#YQhUtP zA9m|$E)UG*{*gQR)xFx>?=`U*&+!xkX*Rn}=b31kGs_ac5^KJ%5HFxjs-u%LPm0Zc zz6b=p@R)BD+jb#!XU^Fh3is=W}A zx4s>CCIUseIsQVf8aGosiUOCrWk2UbSYn#R*P_Ou;By#6ZRZ=Q$KcmZ&I6K)Z^@|==!uz(OB%n>IqZ9Gd z{RjEd=5rKg@_%uTqL^HZ$2Tx`cYt}@q@LIxN(Y)>B zI$UnE_eq(tb&T~|ZnlNy@gDE&gDujygD-5e`e$Mb7C(EoA%)f^XMyE>D?E%PpbX#t z*VZ1C&!9fQvO*;bLRQNE*g7M(_W;%n9iefoMM4l#+Rz!Nu+H$tA|eEaMQaKFpA_X7 z?)jwDl%ZJjA24^l*N@-wdR?xbvY)?tOR}0h+HrHC!8&SN1gVpDV!Rq;@ z!Fs)|!CLHLux52LSaW+CtYgy+)@~jy*59GMZPX?lBi&0tU*D6geKr}at}X#H@;kd& z*(u2yiY$f}Cm{EP$}y_%jYhAAqAx?#EC$7gzR28>y-{X^E|QpRGkRV(?tVF)mvy)z z4}U#hesM)8XDmr#U%-W5d(k}fL??{LrM!Iqyoj=uA^JMlhgwlv8aX4L;#u@uLith` ztLdD6Vo3&D zUri3eMnrPtAh(N~9dA?l7L-#Rl10YzhgHE5IyK3MafP+SVbn>a%8_f#Z1hp{kKbLB zZ@s)r9$CGHcla%{Ms@u`ekD}0R^?{!&?S;}wUDf@&XuftXGvDmQD*(&1hfA646}al zKC>R~Dp?CpNY;F`M{8UgC>vC?iCOoIl&r32}iow1MZ0p3XmCa!5Y7&?4I|hHy3GMmo*eX(k&lTWR4&eC5#TsDxO} zHhLIIpQTSos%-$Gs>ANMU;19tDZ?B@cC7b5M&GaM{|0j#-tPBL0vmHB-8PQ>Usbor zjyZHbskmAu{Tflpfi-C27!9jOU&2{_iM7I-gM2JLQL#JAu*F{PiFHIa-h0!_(s5?y z^#}8-Pkt*`TXw>KY~a)nWh?9DM?P1C?Yrmr2Ys0J0Uz{D7iJyVky#5Zir`j7bjwtP zceWz>omK?0<<=;)X99(QLP2i9D8H!)SJ#JPs7=;e5v7RDq#ifq^krdu<$LSob~W+x z{HV?xwI$WoFfWm9wZA%v8v)NDcgRGuDz}T|K{A{CTg#n=JTN}N)zn9^`1NbYXvMpo zc)}{xZ@H3wUi;~!svlK4yWYxHx^mKy5qun2ABqlCu?9#!gwwWKQFB~SiNl_ZqxkUmjpDCe8pRf$Mv-m=^=}j}*c!z`AM^!4l%vTCP(4Vw(jfl$bR+txpG^Ie zf387Xt5%fl)9=W~hV|fC=6&)Y?_4=={bck}BV#A5W_I@tbGqz`ykjqJL>msdM?}jc z_rq-^ACkHBlg3tZd&3W*3flo5xJiAtcH;xjXQFN9TKoN8Ii&Lj`QmG1@f((8mpl2n zE}UdEqLPDGzYzh%tG9={FYzfK+?v-KJ1>ar7z;F(i|yqx$h2j%EM{R#SteV;Y%BwB z7r;}^Mb=##<&>w&g8z=a-N3`s{oj^jSz` z_MQguvPZqVGqgc04N2yAavDVN@&=K2p88t3-uFQSudK;m*j48u2ez3>XT*o}V?-qfufQpziPs~(U4n^^?M8hwUi2=*&I{^s_;Z9n zjPkWqM!wC2=V7yVMCjz~@1lS)2X)-3a`yIU*8Ms2n49A`+gK^*UOK`_&t3;daB;m( zj61%J=M1VB@A=h>`rg3eT`$%wt`nn|*9o`WIw3t(C-N@TiAl@rMGD%Bqc-76>7EE0 zv8-N7)g&cn7Wo%M8NRX=>z5!c_hY zbcEl|xB`)rrZU2C4Y-1XJ9C|!akc!;;`E&-p2w9XbDf;O)5m#=(>Py%Q9m90e(5;R zCY%K1z&bOFea$@hP$!wc=U7S}|=g=M_k{+&;vrcDX&5df(7cNVA2Q6pfO1kLP z>87d+b%kcvQB2t)PWmw70|yp)lIqWgbqkCm9JWy!7UE4rSfVsLRDU~{C)>;Gk^eY` zdeiA;N{pHLy>5P6_T>vV{wNO(c#FrMsTTYCF62u>YDCWb-TalcHKL-RMg*;@5u=yY zh#}{zMcL(QvH#O*QGBynEC{F(qpsA5HE7R9Z8A29?i8!O`gV;d@~c6ggj@9U15IPJ@Q!)AfQ`A5ek&ex>=dh)NEu;Yrbi^^s0vCJ@f@Z?t`IsMFEM{;+HORDbJp0?pkr%BddN++E0{?^n^? z*$!h^zUsv-Yz14+mcg5o7yorW+~EUguNV74v?mpjv{~JkqB9}SoqmEJEw2)^PaZa+ zT5K>?i*p03#Wn16twFvsq@YSvKV2p6Y^V}9uT_aR3#y%cK$`9YKAB!Ej=x_e3@#JW z^s^>Wu;tSMb2*(qcFuM}&8Dn;yY zxVlGzQTBIof%&&ekw$M!H_IN$LvpqE6r!8<@3zzd(`oeg7-ug5UtyE!lUHf zkQWt?2b&WW;rRpzSAr-0O_?Rlp|Nrn&!l_m2c*&zEZY@?t_ob0f}x_gV$|rmqVB}?o9pCUm+BCXj`ln$tv@^Bcixp55jr{7$17aEOk1iILnGBY!8nR%?t{5{&m3a?p*l!_Sc`+vVZvxh-_{?q9>r{~{~ukW6{*IwUc zefwLtjUS`qF6Phtm@m^YZ|2NAnJeput8U6Y`p*L;7~9#Op$uaefm#h?pF1;F>53n> zF_t})vArRT`Hw}pbFxgA69Fv{40r&H4PbrPEy|fI>y2N^p>c8=fcx%{NmpHL*ELSH zB>{XuR3=9$?Xiz#nYim}v-sPu&BFR9V_!H~1k_*&Kz@07N!dL?K}OR;Q(B}Rs;P8gL9Pk6ST8_dSX@jxJq4(3-`&m*jc+J4 zm6pev$_)jDWkCf+M$@9e{PKB)(FMk`$Q)B}?t}>wLIc9WL&E~bg_?2$4C6v_1Hvba zF@=VPn@py>oRNiwqPdZ#qJZhCBg+fsnU)k6nIic-Q)xl2At#hov^W;{W*2(3Mx)|9{%=WzQ&{N)%Y%4~hUU z*nq={Vus#jYHRiI$H}kF&4T!!#Q?pJrlNoUyI+3Un!kLVpd@6tLQn^o{6C<}`d%ry z0Zm0QeJemr_nmQ{^iBt|9Z-w&Xdt1uLRVg_D=9T0R!llWkx_>jSgb2E85=q_EV%o8 z9O6j5J{Awy&&OEbNxmpHLByE~r>5iwl*iAHHHrD<3(6{(7P*dciKETv3hXww*lf88(sJ$U(a`KH2>GBQkOE`mQQ@=Zm$g7Wi~>&mQtfP?Z43r)Jb z1-M?ML*mwzEhzfW+8$;Q1!Z}e=G26Mv?XbC#F+4z(~GYafZwXIQoHN zklLR7?uOozVx1!08Bb6-iUsmVi393zJ_WGF!h$lBVxpm-R5yQtp|GHQvCU6PpcI#z za?6z{C^Hr2>GDd8=jlp{3k#J_%NjuQip`W1DJTBNVk2Zhv9bKV@Fi*C^UDe+WTwqe zN-bMZ!E#P1{hEf}<3FNbcJwi|iR$BY^gUalgByZ>ERY4H!5=MnfiD6lfWyFUU>i^i ztO2Tlr9cT_1k!;-Kmx`BetyPXz&K09ykRY1@;1Uz$RcVumY$A%7J_!3rGfH zfpEYd&;cHRl3Nf!jR5u4p93EQ2Y{WxR-gu04Lk}g0t$g_APq;hMV_kk0^N5F32X#6jTQ;Gy89;E`Yn90+y> zhk=i3Eg}lM0;~rogQtQ$z%#&~Yb;_mxCWdD&IT8OeZdRCR~YOEZv!s_mw;D-$AX^& zx5&+6BX}=(Gq@7G9UKeZ1$G7R1ApArERKLzgO7vLz^B2U;BUZZJDbI2a4q;M*a&V0 z`+>W_4IRzG1v$G8JOEq{9s~{t4+VF$H;a+r1K>dLqu?-b0yqlX53C2DXloWz!E3-X z!0F)GU~h09xW2Vn6oEH^7lQM_4}$%{%fO8-&0-~ZC-^z=BJf6V1b8!;fwzMXTVOx9 z8oUpj2tERK10M&U!g$~`crExFa2B{3tOHXo)(4SEec452Uf`nSYWhw2fL;ZPUCQG$ zKBp+AJWgloecS6|%i)y08B@o<^ep{m8jXg^)9L9m*0H?QWX*XVbkTNv1|LV@JQ$ds zsz5h)qCh@Wq8d}Bg-?4z-;e1;R zV|$R4{!7oI>h+1os#-X0V_IXJpSG`h4X zZA0QnFPal{d@0LxPBI&C{@9>(Q7Y&f-J|m12m;dOwLcHzG1=3&|D`~_W$`)A*z1t< zrlJq&(&xs6UInkv4tC*!4-xm_hm^NW;=em%8JY9{SKcWyM$B`Ygry<`-h4 zRCMbT#j=n!(^x7?VbfSLvgdtlGMj`smV^;sxP5jt)HXJt85bSY3cXpBa?Ui@8hkjv z7R-NYa^a!Zev-C%Z-hP1BViwiBb&&UX1@r&J^ra^*KIY?HhWU+_M~TKkUfU%U?bU5 z@?1}Q?!djQv)%S2;`|xUSV={AFMY}s^4F-D zqjE^6#t}XBqW571;$8zL9hTyp>QUjS*U@@ep5-}&&p#E(?+m(~PyOtgG$HOI=!a3+ z*!6n0t3%&1I*6}dH-&G!wk5L9nV0YNMV&Z2?fS$|Pa=IXl6s|+E_FXzbC>#lkUrjM z7ge8rIH!74IO@|(?<-!FKWeRE(=XN>bFr^=yjuxwK$2YnI0GeE@^J%}+7eDOUanIx zC>=P9L8}qi4Fe?LC~{CT@Hq_62Cl&1YQPPsgHe=Q84FWZG2)q?#o?C(#M)LfLh-)& zvf;SmXB&-E{vUw1%^6Q2$9NX=bA7cjYVJDV`h&D*$lKDHmpwUdYw~t2j-|Gtu@4SU z%4O6pl-K;gGlquTs~giIwjvfEL?=Y|RX{}sm6be2&+PkEmMLE@c*YI#-h(2~>$6v0 zmiDaNDV#2?KzJ7&fiJ=z906X{IZB-oDny9WX_2nEMhNYK8-r5j0#7YWM@pPEcbouHZBj_fcm#G_Tanv69ZlN zpj`v_xh1}e%)DJaWZp^r7s;f)%qBBEjt@>ba2EOWyezw*PAa3qQ6{z9F5F+VVFIup3=MR9muZ@(;*KAC^FBK^^obmJ>H<$xo6S}yUaP6cjwj~ zun5l!vV0XXsf>#2Wp0GblwR$&zVlg(O}zDW|G0x^FBru`LqiprRrmLh8U6jpG127P zps$V5Hs59%jbX;sZ&<_%$jm{VR7S=1GHHCPJNc8FHzN3P-sVd+Q-L;=OzLe??zH{eMFzl%UAX9_hsg@ArVc zv5MT?T@{Y+_W1dc>lL|Eb5`5rrlDQ#GbS&wh_#Sg)FI1MMunqX8eiRpSfFu|b&PbJ z(fEk$UA@?oKk}hFZA(zUi zaFk2-J^{J?o*Bh`PX2=W;b;FPirmJ5!<6wGjn7DK%9S4W4(|BteC2)1zO>pd_pa=T zMj8)QL+-#9+6mW;{F!~@iQ+cl1!((BNaF4i<32jB4V=L zVl1Kta%uspTLt;SI?|6~k$4ZsvU}M*xNjZf|KDQ~8oTcLtPQdsLFeBqK6{EYAMlxu z&yUO`eY7dnH`7P23D5S-Wn(SE{|eSP096-a7a$D2pmC^m3~ELP(4nt)u}Cy#rZFhh zy{hzPb+dRwmWzSLpVg>$#SL{|pL=M1*Sd@J&&FMU|LzSb{n$##UW@nfxcGEUK9_r9C@Bxz!>^JLoFs`(!6 z4^W*dsDGu{`mz6Isp=o(TZ~9C=5IWvv2}KvzA6h1edx0^NQmafO7d+yMhzj!l*k5AT`H^*zu??q|N zhr_hyrVSeNvdtQ^`E`wX{@WV!Z5EBW;YF=kLVf-Kt+|E+y{a_k_q?=bXAQ>EFKNw{ zNg8v6GDC@F6CpYVh*0vv1mp+G4Bfl!Ubg)LTvQISl;ZuwtaRz;r!PyS@Bb9rj^76D21~Q{rh30qgsfI60Z?GPP!?XOC4n&u&oKkAKs+N)f@Q*GU6 zq1d3DLG7GIf*LT!xM#WEW5`cZ+=m;anpr4kV&+F)Vdhy=HRejxR|u2#G4uYz4DB3epf+Y*GS>R6 zI!;6@bEW^I{QukA`D&A1NdNt}(>D&5Oq_hi@xUy4tI783I?$=X%u3y(G>0p}O z_c3WxshyoPz59^ggKz2Sd#K71u3Fm}lQf$rseh(}Vv=;FyiN05b^re^`+S*7xg!o8 z*QX8**(Am8kAiMYL%w~q{{h9f%G+4$u4mA9RMztn`B#TRc3tDLlyw$Ne%(pWl5BQE zoHW^VCB0QpobrdC48!0mFm{X zBJkT`eEDm#kT=OfS0jtiHL@_ab%{o;EI#Qgix1po(UdBS;~lb~{S<0j9OKkBzH@(< zm{}|fXU&vsYTwFjT|L^E3jeF`a$C|Gso;Q=9(*ld{Q z%5|vQ?zicN+17XYuCe5^y0>LzeUj8A&^>>AgaX3h*v6Ca`}ei++G!t22A^TjjcLfg zYl{vj{#CN6&F}C3dO#u{>rlw9>y%lkimqD!XwtKBKu=w%-}v07E9tKG%QSXv#C5tx z`MMtGNjYv&D(IS8z7cB^OYz&4E^Hg6XaD`9e)gUWo*Flt*9RQuAHLQp`loD^`UG|f zd72xakkuvXQoF?I$z9@FOqY0JYo{2#qf>Oe(=b$0F2P^z64|IPk?O<{ftYg0 z;8~qwgjW}0AaOReKfAwEY-_?i&vTbVKAM{2&3(4)l=7ci#g#c9`Nr!5J;mTBA9qO0 z3%5iaJob{h<{V=8Q_7qy@{{ZMs1)*1a9-C9YtHQFZhtiXB+FuNQoAor3xSCI28-5L4WoKHMRkG*KB;XXPy& z;sn;me)z##YCUsNdT!!GtnoBS_hlU8j8$1OsF}!r@#)X|=s)G&gWARUH;+hPFKid7 z2LkyE@3f1-JK9D3)^<@?+b&#twTs95w~I`aiyYc6rp{>>ey$ykIbouj6H?mSg->z2 z&}t@SQd`q^e+OvIa^nk9^)m;h`hW;ND{Fuvm$AQMY40ID+xeCL+-v)laoXctihjW3 zs=5!+-QLqP(#cPn-r*7Cqu}@3Z+Q1S5Lc={oN-QbU=@!3SO$Hls%2l*N?SKs^EmmV zXy@%Vy^s?~FZju0`-c+wWbhYL5r_TMIP|r*-=xfB(#vf^z$DVC#Op@AwmIlkgY(@( zP0=bG^>S=qS|_>a@Z2e!W4%vO;rQG|tUplu#!>~rt#Pd6OTACi8m@bK4*%l#oiWq~ zqq43^Ki$zL0_1p}l;0*knbRhmXSRvJq&5-xW~+Gj-BwY3xK$WGZWV|6w}}nA+C&ZN zqdf&2vx!#&udizp?|8N;?W=y%S&MbJT@Sw~jd)nYA8gn1&l}H4sl8s}jBUZk7Kk_h zPxTaEea^UZTC4l2b*1XZP`e*ft^0D$BYdODhjsJYdbBV3qX~T*sYAA3#QBR}(UOX8 ze?(!NOgoJ;*$g%vCDpYT>zf^M!#IwqlrIY7NV3~BX@;^_#m0@0$ezZdtvzg_e*Gw7QMG9|&iB6< zBdO@N2}+=>`tFl27}j{z=Nj=`?`>Bk6^_p(uu5h2U}P0+AzOf1gmw1td-@A|4oQA6 zjxD)_z3eLf>*RE0Z{^2@En>?EH~#iVEyB1vh4&iVDwYjEEcI#?KX`GywpV?m2} ztF%QdU(zDN_qK@JOs$SNWV)I|Lc&|ckb^CVvBY%syI^O;_`wnTrKisi;uE7*@`BlU z*4Sn*poyVR&Jq2pjXLhJeLVKo_eNhj;U(GHW2U`5rds#bebOe*rnU&y^=uFFYdT_C z^=kso|F+PXt8nz|G26V*bJ8y9l-`@;QO(~!n8&YV%;3@ETo5Olv4msRlb@RX+&KB9 z<}izH+@e?GWV~IkL~EQ#3HN4@P9+sR_xzRdpMzfYIDhKUf@l?vdR-qUepmxm?eWC< z`gJ=nPqL!>xykHNMsbqQ9$-t@Vr8~TagxR6;%%Z```%cbngW6e(4 zgUh?!x(|naG}?PR8;b9a@ZI{p4=jSeXAuwYw1{`MS;Q;1;`<{{i#V^dh#h_w@w%{x z$KA1)i2Bx0o!DL^rf)F9&RE2kb1jG!eJ1VCRlZN(mHeJB4Q@qVv92l5-XQH!Lym^@ z9_XvH?H|5sw}?++w8=7(APU972Rz^ z^C)WzsB6dx%3eksqxt^5$X@DSB&cg7G*hKRwWm+b%gQ$(^uD_Pe80_>x3M6!RQU#k z-doz=y6&44Znq`H`VENBm@$(nHgEO~$ZEWwsx6f`Uv+3)w2E$9dgkWtb@6{KH`DhP zj^8y*7_PIeSHER%AF}5r?bDr`)%KY^PT8xw{<{Xs1xBoksWzqIJZsf<>=|3pZPSgp zxyIqS6*yPhl-TjPg}4VXf6yACURgED!n#o|%V7q**Noi{IKJD~NV2YVSm*E7FLg1# zv3(mr8z$%fbU`}UFoI)Pz)lYNi@yE?SKhYHk8d}JaH^GH1ZcfU1x~d&6BflL*1Y=R z_xF$PmsB|Vzx!D)X5D|G?~|zps>2ok+rPorUjN-LeS1%Jk$wNp@6bGyub6)I%NA@!`?@`GMAIK-;6ys5x@IkD_e=x(E-{R{O)_q_Iq`*nX_Be zZ@+sh-wfhDnxa+$yJ9M<$hk9TH)p;3Ad31!zwUCMe4H4~`gq}66lwv|k1W06Zy>a^ z)=q6;^#h9Fn2B!)={J_PSxl)3e{M3xgg;Hf4x2-pEG{z4E65EfEGRMu<|u{cQ6c4z oouUg3<&k5@2ZjZQjVvrKiVPSN5)v318lwDtN|CA5_7^Ju3$u5)+yDRo literal 0 HcmV?d00001 diff --git a/tests/fixtures/wk3-paired/seattle-repeat/apple.json b/tests/fixtures/wk3-paired/seattle-repeat/apple.json new file mode 100644 index 00000000..a3fcf266 --- /dev/null +++ b/tests/fixtures/wk3-paired/seattle-repeat/apple.json @@ -0,0 +1 @@ +{"news":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"APPLE_INTERNAL","reportedTime":1794569673},"placements":[{"priority":2,"articles":[{"id":"A6ajisfZkSH-TzT_j18WQJQ","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How the UV index helps you know when it’s safe to have fun in the sun","alertIds":[]}],"placement":["UV_DETAILS"]},{"priority":2,"articles":[{"id":"AxDHjEelNRh-tGqDejqtusw","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How to prepare and stay safe if high winds are in your forecast","alertIds":[]}],"placement":["WIND_DETAILS"]},{"priority":2,"articles":[{"id":"A2uodtK8zT8qsl9ZTqOSsuw","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How to use the air quality index to protect yourself from pollution and smoke","alertIds":[]}],"placement":["AIR_QUALITY_DETAILS"]}]},"airQuality":{"metadata":{"latitude":0,"longitude":0,"expireTime":1794571287,"sourceType":"MODELED","attributionUrl":"https://dynamic-link.breezometer.com/?lat=47.606&lon=-122.332&partner=apple","readTime":1794569673,"temporarilyUnavailable":false,"providerName":"BreezoMeter","reportedTime":1794567600},"index":59,"pollutants":[{"amount":5.0,"units":"PARTS_PER_BILLION","pollutantType":"OZONE"},{"amount":14.707169,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"PM2_5"},{"amount":32.544106,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"PM10"},{"amount":300.0,"units":"PARTS_PER_BILLION","pollutantType":"CO"},{"amount":24.375298,"units":"PARTS_PER_BILLION","pollutantType":"NO2"},{"amount":5.560594,"units":"PARTS_PER_BILLION","pollutantType":"NO"},{"amount":0.8,"units":"PARTS_PER_BILLION","pollutantType":"SO2"},{"amount":23.047903,"units":"PARTS_PER_BILLION","pollutantType":"NOX"}],"scale":"EPA_NowCast.2604","primaryPollutant":"PM2_5","previousDayComparison":"SAME","categoryIndex":2,"isSignificant":false},"currentWeather":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794569973,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794569673},"daylight":false,"humidity":84,"pressure":992.896606,"temperature":11.151289,"visibility":20750.910156,"asOf":1794569673,"precipitationIntensity":0.0,"temperatureDewPoint":8.548309,"windGust":10.370301,"temperatureApparent":10.537592,"snowfallAmountPrevious6h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"snowfallAmountPrevious24h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountNext6hByType":[],"snowfallAmountNext24h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountPrevious6hByType":[],"snowfallAmountPrevious1h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"pressureTrend":"FALLING","windDirection":94,"windSpeed":7.099107,"cloudCoverLowAltPct":3,"perceivedPrecipitationIntensity":0.0,"precipitationAmountPrevious1hByType":[],"cloudCover":84,"precipitationAmountNext1hByType":[],"snowfallAmountNext1h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountPrevious24hByType":[],"cloudCoverMidAltPct":86,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":97,"snowfallAmountNext6h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"uvIndex":0,"precipitationAmountNext24hByType":[{"expected":5.984974,"minimum":5.984974,"maximum":5.984974,"precipitationType":["RAIN"]}]},"weatherChanges":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"changes":[{"forecastEnd":1794729600,"maxTemperatureChange":"STEADY","forecastStart":1794643200,"minTemperatureChange":"STEADY","dayPrecipitationChange":"DEC","nightPrecipitationChange":"INC"},{"forecastEnd":1794816000,"maxTemperatureChange":"STEADY","forecastStart":1794729600,"minTemperatureChange":"STEADY","dayPrecipitationChange":"INC","nightPrecipitationChange":"DEC"}],"forecastEnd":1794816000,"forecastStart":1794643200},"weatherAlerts":{"metadata":{"language":"en","latitude":0,"longitude":0,"expireTime":1794569973,"sourceType":"STATION","attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"temporarilyUnavailable":false,"providerName":"National Weather Service","reportedTime":1794538320},"alerts":[{"id":{"bytes":[190,12,153,147,104,54,83,236,165,44,137,30,51,142,238,251]},"description":"Coastal Flood Advisory","token":"COASTAL_FLOOD_ADVISORY","phenomenon":"Flood","severity":"MINOR","significance":"ADVISORY","source":"National Weather Service","urgency":"EXPECTED","certainty":"LIKELY","importance":"LOW","responses":["MONITOR"],"eventOnsetTime":1794578400,"detailsUrl":"https://weatherkit.apple.com/alertDetails/index.html?ids=be0c9993-6836-53ec-a52c-891e338eeefb&lang=en-US&timezone=America/Los_Angeles&party=apple","effectiveTime":1794538320,"issuedTime":1794538320,"eventSource":"US","areaId":"waz315","expireTime":1794574800,"countryCode":"US","eventEndTime":1794600000,"attributionUrl":"https://www.weather.gov"}],"detailsUrl":"https://weatherkit.apple.com/alertDetails/index.html?ids=be0c9993-6836-53ec-a52c-891e338eeefb&lang=en-US&timezone=America/Los_Angeles&party=apple"},"historicalComparisons":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"comparisons":[{"condition":"TEMPERATURE_MAX","deviation":"NORMAL","baselineValue":10.839996,"baselineStartDate":0,"currentValue":13.64015,"baselineType":"MEAN"},{"condition":"PRECIPITATION","deviation":"NORMAL","baselineValue":0.0,"baselineStartDate":0,"currentValue":0.0,"baselineType":"MEAN"}]},"forecastDaily":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"days":[{"moonrise":1794598874,"moonset":1794627382,"sunrise":1794582705,"sunset":1794616505,"forecastEnd":1794643200,"sunriseCivil":1794580706,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"solarMidnight":1794642825,"windSpeedAvg":9.337426,"temperatureMaxTime":1794585564,"windGustSpeedMax":36.504002,"sunriseAstronomical":1794576293,"forecastStart":1794556800,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":5.652,"minimum":5.652,"maximum":5.652,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794622910,"visibilityMax":34072.0,"precipitationChance":86,"temperatureMin":9.91,"maxUvIndex":1,"temperatureMinTime":1794643200,"sunsetNautical":1794620737,"daytimeForecast":{"humidity":83,"daylight":true,"forecastEnd":1794625200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":9.132,"windGustSpeedMax":32.810402,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":11.529953,"forecastStart":1794582000,"windDirection":181,"windSpeed":10.008599,"humidityMax":90,"precipitationAmountByType":[{"expected":5.455,"minimum":5.455,"maximum":5.455,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":53,"visibilityMax":34072.0,"cloudCover":99,"precipitationChance":79,"temperatureMin":10.49,"cloudCoverMidAltPct":94,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":76,"humidityMin":70,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":15.263999},"conditionCode":["RAIN"],"humidityMin":70,"solarNoon":1794599599,"visibilityMin":6167.0,"overnightForecast":{"humidity":86,"daylight":false,"forecastEnd":1794668400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.49,"uvIndexMin":0,"temperatureApparentMin":5.112798,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":0.549,"uvIndexMax":0,"temperatureApparentMax":10.093671,"forecastStart":1794625200,"windDirection":183,"windSpeed":13.7466,"humidityMax":89,"precipitationAmountByType":[{"expected":0.71,"minimum":0.71,"maximum":0.71,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":49,"visibilityMax":28703.0,"cloudCover":74,"precipitationChance":65,"temperatureMin":9.009192,"cloudCoverMidAltPct":49,"precipitationIntensityMax":0.234,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":31,"humidityMin":82,"visibilityMin":16190.0,"precipitationType":["RAIN"],"windSpeedMax":16.65},"precipitationType":["RAIN"],"sunriseNautical":1794578462,"sunsetCivil":1794618498,"windSpeedMax":16.254,"restOfDayForecast":{"humidity":83,"daylight":false,"forecastEnd":1794643200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":5.957533,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":11.864366,"forecastStart":1794569673,"windDirection":171,"windSpeed":10.008805,"humidityMax":90,"precipitationAmountByType":[{"expected":5.652,"minimum":5.652,"maximum":5.652,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":42,"visibilityMax":34072.0,"cloudCover":95,"precipitationChance":84,"temperatureMin":9.91,"cloudCoverMidAltPct":84,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":76,"humidityMin":70,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":16.254}},{"moonrise":1794687261,"moonset":1794717746,"sunrise":1794669195,"sunset":1794702834,"forecastEnd":1794729600,"sunriseCivil":1794667189,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.170017,"solarMidnight":1794729234,"windSpeedAvg":13.5183,"temperatureMaxTime":1794689975,"windGustSpeedMax":36.504002,"sunriseAstronomical":1794662769,"forecastStart":1794643200,"moonPhase":"WAXING_CRESCENT","humidityMax":88,"precipitationAmountByType":[{"expected":5.55,"minimum":5.55,"maximum":5.55,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794709253,"visibilityMax":29373.0,"precipitationChance":85,"temperatureMin":9.009192,"maxUvIndex":1,"temperatureMinTime":1794668269,"sunsetNautical":1794707078,"daytimeForecast":{"humidity":79,"daylight":true,"forecastEnd":1794711600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.170017,"uvIndexMin":0,"temperatureApparentMin":5.696423,"windGustSpeedMax":33.551998,"perceivedPrecipitationIntensityMax":0.503,"uvIndexMax":1,"temperatureApparentMax":9.767292,"forecastStart":1794668400,"windDirection":166,"windSpeed":13.39695,"humidityMax":86,"precipitationAmountByType":[{"expected":0.96,"minimum":0.96,"maximum":0.96,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":59,"visibilityMax":29373.0,"cloudCover":89,"precipitationChance":55,"temperatureMin":9.01,"cloudCoverMidAltPct":72,"precipitationIntensityMax":0.194,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":64,"humidityMin":76,"visibilityMin":15078.0,"precipitationType":["RAIN"],"windSpeedMax":14.860799},"conditionCode":["RAIN"],"humidityMin":76,"solarNoon":1794686008,"visibilityMin":4069.0,"overnightForecast":{"humidity":84,"daylight":false,"forecastEnd":1794754800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.48,"uvIndexMin":0,"temperatureApparentMin":5.973359,"windGustSpeedMax":38.952,"perceivedPrecipitationIntensityMax":1.473,"uvIndexMax":0,"temperatureApparentMax":9.430315,"forecastStart":1794711600,"windDirection":155,"windSpeed":14.398049,"humidityMax":88,"precipitationAmountByType":[{"expected":8.279,"minimum":8.279,"maximum":8.279,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":67,"visibilityMax":25393.0,"cloudCover":94,"precipitationChance":87,"temperatureMin":10.038711,"cloudCoverMidAltPct":84,"precipitationIntensityMax":2.419,"conditionCode":["RAIN"],"cloudCoverHighAltPct":31,"humidityMin":78,"visibilityMin":4069.0,"precipitationType":["RAIN"],"windSpeedMax":17.780401},"precipitationType":["RAIN"],"sunriseNautical":1794664941,"sunsetCivil":1794704834,"windSpeedMax":16.65},{"moonrise":1794775225,"moonset":1794808239,"sunrise":1794755684,"sunset":1794789166,"forecastEnd":1794816000,"sunriseCivil":1794753672,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.499799,"solarMidnight":1794815645,"windSpeedAvg":13.973175,"temperatureMaxTime":1794775537,"windGustSpeedMax":38.952,"sunriseAstronomical":1794749245,"forecastStart":1794729600,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":7.270999,"minimum":7.270999,"maximum":7.270999,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794795599,"visibilityMax":27960.0,"precipitationChance":94,"temperatureMin":7.48,"maxUvIndex":1,"temperatureMinTime":1794816000,"sunsetNautical":1794793421,"daytimeForecast":{"humidity":79,"daylight":true,"forecastEnd":1794798000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.499799,"uvIndexMin":0,"temperatureApparentMin":5.879239,"windGustSpeedMax":35.748001,"perceivedPrecipitationIntensityMax":0.775,"uvIndexMax":1,"temperatureApparentMax":9.362825,"forecastStart":1794754800,"windDirection":199,"windSpeed":15.284551,"humidityMax":86,"precipitationAmountByType":[{"expected":3.041,"minimum":3.041,"maximum":3.041,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":37,"visibilityMax":27960.0,"cloudCover":64,"precipitationChance":79,"temperatureMin":9.24,"cloudCoverMidAltPct":53,"precipitationIntensityMax":0.499,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":0,"humidityMin":73,"visibilityMin":13909.0,"precipitationType":["RAIN"],"windSpeedMax":18.6192},"conditionCode":["RAIN"],"humidityMin":73,"solarNoon":1794772418,"visibilityMin":7974.0,"overnightForecast":{"humidity":89,"daylight":false,"forecastEnd":1794841200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.24,"uvIndexMin":0,"temperatureApparentMin":4.984706,"windGustSpeedMax":20.1276,"perceivedPrecipitationIntensityMax":1.093,"uvIndexMax":0,"temperatureApparentMax":8.094274,"forecastStart":1794798000,"windDirection":167,"windSpeed":7.06065,"humidityMax":90,"precipitationAmountByType":[{"expected":2.986,"minimum":2.986,"maximum":2.986,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":36,"visibilityMax":26518.0,"cloudCover":63,"precipitationChance":51,"temperatureMin":6.209458,"cloudCoverMidAltPct":37,"precipitationIntensityMax":1.117,"conditionCode":["RAIN"],"cloudCoverHighAltPct":4,"humidityMin":83,"visibilityMin":16329.0,"precipitationType":["RAIN"],"windSpeedMax":8.186399},"precipitationType":["RAIN"],"sunriseNautical":1794751419,"sunsetCivil":1794791172,"windSpeedMax":18.6192},{"moonrise":1794862879,"moonset":1794898770,"sunrise":1794842173,"sunset":1794875500,"forecastEnd":1794902400,"sunriseCivil":1794840154,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.921954,"solarMidnight":1794902056,"windSpeedAvg":8.8203,"temperatureMaxTime":1794864861,"windGustSpeedMax":25.909199,"sunriseAstronomical":1794835720,"forecastStart":1794816000,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":4.384,"minimum":4.384,"maximum":4.384,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794881947,"visibilityMax":31734.0,"precipitationChance":67,"temperatureMin":6.209458,"maxUvIndex":1,"temperatureMinTime":1794840092,"sunsetNautical":1794879767,"daytimeForecast":{"humidity":80,"daylight":true,"forecastEnd":1794884400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.921954,"uvIndexMin":0,"temperatureApparentMin":5.026797,"windGustSpeedMax":25.909199,"perceivedPrecipitationIntensityMax":0.808,"uvIndexMax":1,"temperatureApparentMax":10.102699,"forecastStart":1794841200,"windDirection":182,"windSpeed":9.35655,"humidityMax":90,"precipitationAmountByType":[{"expected":0.895,"minimum":0.895,"maximum":0.895,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":45,"visibilityMax":31734.0,"cloudCover":73,"precipitationChance":36,"temperatureMin":6.24,"cloudCoverMidAltPct":57,"precipitationIntensityMax":0.548,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":16,"humidityMin":73,"visibilityMin":16596.0,"precipitationType":["RAIN"],"windSpeedMax":12.225599},"conditionCode":["RAIN"],"humidityMin":73,"solarNoon":1794858830,"visibilityMin":16329.0,"overnightForecast":{"humidity":88,"daylight":false,"forecastEnd":1794927600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.71,"uvIndexMin":0,"temperatureApparentMin":4.863145,"windGustSpeedMax":25.909199,"perceivedPrecipitationIntensityMax":0.751,"uvIndexMax":0,"temperatureApparentMax":6.049259,"forecastStart":1794884400,"windDirection":169,"windSpeed":8.89755,"humidityMax":89,"precipitationAmountByType":[{"expected":0.568,"minimum":0.568,"maximum":0.568,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":56,"visibilityMax":28122.0,"cloudCover":60,"precipitationChance":50,"temperatureMin":5.989975,"cloudCoverMidAltPct":7,"precipitationIntensityMax":0.465,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":1,"humidityMin":85,"visibilityMin":16596.0,"precipitationType":["RAIN"],"windSpeedMax":11.7612},"precipitationType":["RAIN"],"sunriseNautical":1794837897,"sunsetCivil":1794877511,"windSpeedMax":12.225599},{"moonrise":1794950358,"sunrise":1794928662,"sunset":1794961836,"forecastEnd":1794988800,"sunriseCivil":1794926635,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.845637,"solarMidnight":1794988468,"windSpeedAvg":6.440775,"temperatureMaxTime":1794953467,"windGustSpeedMax":18.273602,"sunriseAstronomical":1794922194,"forecastStart":1794902400,"moonPhase":"FIRST_QUARTER","humidityMax":89,"precipitationAmountByType":[{"expected":0.341,"minimum":0.341,"maximum":0.341,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794968297,"visibilityMax":29733.0,"precipitationChance":53,"temperatureMin":5.98,"maxUvIndex":1,"temperatureMinTime":1794988800,"sunsetNautical":1794966114,"daytimeForecast":{"humidity":72,"daylight":true,"forecastEnd":1794970800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.845637,"uvIndexMin":0,"temperatureApparentMin":5.082117,"windGustSpeedMax":17.006401,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":12.097757,"forecastStart":1794927600,"windDirection":154,"windSpeed":5.87355,"humidityMax":87,"precipitationAmountByType":[],"cloudCoverLowAltPct":15,"visibilityMax":29733.0,"cloudCover":29,"precipitationChance":0,"temperatureMin":6.13,"cloudCoverMidAltPct":1,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":6,"humidityMin":62,"visibilityMin":17780.0,"precipitationType":["CLEAR"],"windSpeedMax":7.1748},"conditionCode":["DRIZZLE"],"humidityMin":62,"solarNoon":1794945242,"visibilityMin":17780.0,"overnightForecast":{"humidity":82,"daylight":false,"forecastEnd":1795014000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.72,"uvIndexMin":0,"temperatureApparentMin":2.451838,"windGustSpeedMax":25.2936,"perceivedPrecipitationIntensityMax":0.95,"uvIndexMax":0,"temperatureApparentMax":7.151364,"forecastStart":1794970800,"windDirection":133,"windSpeed":7.62915,"humidityMax":89,"precipitationAmountByType":[{"expected":4.327,"minimum":4.327,"maximum":4.327,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":31,"visibilityMax":25857.0,"cloudCover":92,"precipitationChance":50,"temperatureMin":4.947516,"cloudCoverMidAltPct":66,"precipitationIntensityMax":0.798,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":89,"humidityMin":74,"visibilityMin":10859.0,"precipitationType":["RAIN"],"windSpeedMax":12.204},"precipitationType":["RAIN"],"sunriseNautical":1794924375,"sunsetCivil":1794963853,"windSpeedMax":8.9928},{"moonrise":1795037733,"moonset":1794989335,"sunrise":1795015150,"sunset":1795048175,"forecastEnd":1795075200,"sunriseCivil":1795013116,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.020019,"solarMidnight":1795074881,"windSpeedAvg":10.204425,"temperatureMaxTime":1795042826,"windGustSpeedMax":25.7724,"sunriseAstronomical":1795008667,"forecastStart":1794988800,"moonPhase":"WAXING_GIBBOUS","humidityMax":94,"precipitationAmountByType":[{"expected":6.641001,"minimum":6.641001,"maximum":6.641001,"precipitationType":["RAIN"]}],"sunsetAstronomical":1795054649,"visibilityMax":30421.0,"precipitationChance":74,"temperatureMin":4.947516,"maxUvIndex":1,"temperatureMinTime":1795009991,"sunsetNautical":1795052464,"daytimeForecast":{"humidity":81,"daylight":true,"forecastEnd":1795057200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.020019,"uvIndexMin":0,"temperatureApparentMin":2.416847,"windGustSpeedMax":25.7724,"perceivedPrecipitationIntensityMax":0.866,"uvIndexMax":1,"temperatureApparentMax":6.052989,"forecastStart":1795014000,"windDirection":182,"windSpeed":12.15015,"humidityMax":88,"precipitationAmountByType":[{"expected":2.276,"minimum":2.276,"maximum":2.276,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":60,"visibilityMax":30421.0,"cloudCover":82,"precipitationChance":66,"temperatureMin":5.11,"cloudCoverMidAltPct":76,"precipitationIntensityMax":0.643,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":50,"humidityMin":76,"visibilityMin":14677.0,"precipitationType":["RAIN"],"windSpeedMax":13.608},"conditionCode":["DRIZZLE"],"humidityMin":76,"solarNoon":1795031654,"visibilityMin":10859.0,"overnightForecast":{"humidity":92,"daylight":false,"forecastEnd":1795100400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.9,"uvIndexMin":0,"temperatureApparentMin":5.690445,"windGustSpeedMax":17.945999,"perceivedPrecipitationIntensityMax":0.327,"uvIndexMax":0,"temperatureApparentMax":6.35371,"forecastStart":1795057200,"windDirection":158,"windSpeed":5.645401,"humidityMax":95,"precipitationAmountByType":[{"expected":0.478,"minimum":0.478,"maximum":0.478,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":62,"visibilityMax":25229.0,"cloudCover":82,"precipitationChance":50,"temperatureMin":5.36,"cloudCoverMidAltPct":55,"precipitationIntensityMax":0.079,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":8,"humidityMin":82,"visibilityMin":12901.0,"precipitationType":["RAIN"],"windSpeedMax":9.774},"precipitationType":["RAIN"],"sunriseNautical":1795010851,"sunsetCivil":1795050198,"windSpeedMax":13.608},{"moonrise":1795125079,"moonset":1795079963,"sunrise":1795101637,"sunset":1795134515,"forecastEnd":1795161600,"sunriseCivil":1795099597,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.116987,"solarMidnight":1795161294,"windSpeedAvg":5.149725,"temperatureMaxTime":1795135920,"windGustSpeedMax":12.852,"sunriseAstronomical":1795095140,"forecastStart":1795075200,"moonPhase":"WAXING_GIBBOUS","humidityMax":96,"precipitationAmountByType":[{"expected":0.141,"minimum":0.141,"maximum":0.141,"precipitationType":["RAIN"]}],"sunsetAstronomical":1795141003,"visibilityMax":32204.0,"precipitationChance":53,"temperatureMin":5.36,"maxUvIndex":1,"temperatureMinTime":1795082400,"sunsetNautical":1795138815,"daytimeForecast":{"humidity":83,"daylight":true,"forecastEnd":1795143600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.116987,"uvIndexMin":0,"temperatureApparentMin":6.35371,"windGustSpeedMax":12.852,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":10.070161,"forecastStart":1795100400,"windDirection":4,"windSpeed":6.0135,"humidityMax":93,"precipitationAmountByType":[],"cloudCoverLowAltPct":44,"visibilityMax":32204.0,"cloudCover":63,"precipitationChance":0,"temperatureMin":6.03,"cloudCoverMidAltPct":2,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":0,"humidityMin":77,"visibilityMin":12901.0,"precipitationType":["CLEAR"],"windSpeedMax":7.8264},"conditionCode":["DRIZZLE"],"humidityMin":77,"solarNoon":1795118068,"visibilityMin":12901.0,"overnightForecast":{"humidity":94,"daylight":false,"forecastEnd":1795186800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.52,"uvIndexMin":0,"temperatureApparentMin":4.634763,"windGustSpeedMax":9.4392,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":8.422463,"forecastStart":1795143600,"windDirection":44,"windSpeed":3.7053,"humidityMax":97,"precipitationAmountByType":[],"cloudCoverLowAltPct":34,"visibilityMax":28680.0,"cloudCover":52,"precipitationChance":0,"temperatureMin":4.006788,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"humidityMin":85,"visibilityMin":9083.0,"precipitationType":["CLEAR"],"windSpeedMax":4.0212},"precipitationType":["RAIN"],"sunriseNautical":1795097328,"sunsetCivil":1795136544,"windSpeedMax":7.8264},{"moonrise":1795212479,"moonset":1795170725,"sunrise":1795188123,"sunset":1795220858,"forecastEnd":1795248000,"sunriseCivil":1795186076,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.763362,"solarMidnight":1795247709,"windSpeedAvg":4.930575,"temperatureMaxTime":1795216005,"windGustSpeedMax":14.482799,"sunriseAstronomical":1795181613,"forecastStart":1795161600,"moonPhase":"WAXING_GIBBOUS","humidityMax":97,"precipitationAmountByType":[],"sunsetAstronomical":1795227360,"visibilityMax":17821.0,"precipitationChance":0,"temperatureMin":4.006788,"maxUvIndex":1,"temperatureMinTime":1795177699,"sunsetNautical":1795225170,"daytimeForecast":{"humidity":77,"daylight":true,"forecastEnd":1795230000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.763362,"uvIndexMin":0,"temperatureApparentMin":5.128633,"windGustSpeedMax":14.482799,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":11.921696,"forecastStart":1795186800,"windDirection":9,"windSpeed":6.00165,"humidityMax":92,"precipitationAmountByType":[],"cloudCoverLowAltPct":16,"visibilityMax":13937.0,"cloudCover":19,"precipitationChance":0,"temperatureMin":4.73,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":69,"visibilityMin":9448.0,"precipitationType":["CLEAR"],"windSpeedMax":7.5348},"conditionCode":["MOSTLY_CLEAR"],"humidityMin":69,"solarNoon":1795204483,"visibilityMin":9083.0,"overnightForecast":{"humidity":78,"daylight":false,"forecastEnd":1795273200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.8,"uvIndexMin":0,"temperatureApparentMin":3.108699,"windGustSpeedMax":12.618,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":6.648598,"forecastStart":1795230000,"windDirection":63,"windSpeed":5.1837,"humidityMax":84,"precipitationAmountByType":[],"cloudCoverLowAltPct":7,"visibilityMax":24474.0,"cloudCover":10,"precipitationChance":0,"temperatureMin":4.249874,"cloudCoverMidAltPct":1,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":3,"humidityMin":66,"visibilityMin":13937.0,"precipitationType":["CLEAR"],"windSpeedMax":6.4764},"precipitationType":["CLEAR"],"sunriseNautical":1795183803,"sunsetCivil":1795222893,"windSpeedMax":7.5348},{"moonrise":1795300029,"moonset":1795261701,"sunrise":1795274609,"sunset":1795307204,"forecastEnd":1795334400,"sunriseCivil":1795272555,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.168908,"solarMidnight":1795334124,"windSpeedAvg":5.365725,"temperatureMaxTime":1795299642,"windGustSpeedMax":13.5252,"sunriseAstronomical":1795268084,"forecastStart":1795248000,"moonPhase":"WAXING_GIBBOUS","humidityMax":83,"precipitationAmountByType":[],"sunsetAstronomical":1795313719,"visibilityMax":26954.0,"precipitationChance":0,"temperatureMin":4.249874,"maxUvIndex":1,"temperatureMinTime":1795255291,"sunsetNautical":1795311526,"daytimeForecast":{"humidity":62,"daylight":true,"forecastEnd":1795316400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.168908,"uvIndexMin":0,"temperatureApparentMin":4.959615,"windGustSpeedMax":12.459599,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":13.309563,"forecastStart":1795273200,"windDirection":135,"windSpeed":4.4259,"humidityMax":66,"precipitationAmountByType":[],"cloudCoverLowAltPct":2,"visibilityMax":26954.0,"cloudCover":19,"precipitationChance":0,"temperatureMin":6.57,"cloudCoverMidAltPct":17,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":60,"visibilityMin":8662.0,"precipitationType":["CLEAR"],"windSpeedMax":6.372},"conditionCode":["MOSTLY_CLEAR"],"humidityMin":60,"solarNoon":1795290898,"visibilityMin":8662.0,"overnightForecast":{"humidity":71,"daylight":false,"forecastEnd":1795359600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.71,"uvIndexMin":0,"temperatureApparentMin":3.380726,"windGustSpeedMax":13.5252,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":7.205438,"forecastStart":1795316400,"windDirection":154,"windSpeed":5.82615,"humidityMax":77,"precipitationAmountByType":[],"cloudCoverLowAltPct":0,"visibilityMax":22708.0,"cloudCover":12,"precipitationChance":0,"temperatureMin":4.10744,"cloudCoverMidAltPct":4,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":64,"visibilityMin":10503.0,"precipitationType":["CLEAR"],"windSpeedMax":7.487999},"precipitationType":["CLEAR"],"sunriseNautical":1795270278,"sunsetCivil":1795309245,"windSpeedMax":7.487999}]},"forecastHourly":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"hours":[{"daylight":false,"humidity":85,"pressure":993.530029,"temperature":11.51,"visibility":22126.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":1,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":9.07518,"windGust":6.9768,"temperatureApparent":10.747892,"cloudCover":68,"precipitationChance":0,"cloudCoverMidAltPct":89,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":100,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794567600,"pressureTrend":"FALLING","windDirection":131,"uvIndex":0,"windSpeed":6.9768,"snowfallIntensity":0.0},{"daylight":false,"humidity":83,"pressure":992.429993,"temperature":10.95,"visibility":19738.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":4,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":8.174545,"windGust":12.87,"temperatureApparent":10.448459,"cloudCover":96,"precipitationChance":0,"cloudCoverMidAltPct":83,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":94,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794571200,"pressureTrend":"FALLING","windDirection":69,"uvIndex":0,"windSpeed":7.1892,"snowfallIntensity":0.0},{"daylight":false,"humidity":79,"pressure":990.97998,"temperature":11.34,"visibility":21981.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":4,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.828262,"windGust":15.4296,"temperatureApparent":9.860982,"cloudCover":74,"precipitationChance":0,"cloudCoverMidAltPct":48,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":67,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794574800,"pressureTrend":"FALLING","windDirection":83,"uvIndex":0,"windSpeed":9.0468,"snowfallIntensity":0.0},{"daylight":false,"humidity":74,"pressure":990.539978,"temperature":11.79,"visibility":26370.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":8,"perceivedPrecipitationIntensity":0.082,"precipitationIntensity":0.005,"temperatureDewPoint":7.305634,"windGust":17.848801,"temperatureApparent":11.730489,"cloudCover":100,"precipitationChance":5,"cloudCoverMidAltPct":95,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":98,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.005,"minimum":0.005,"maximum":0.005},"forecastStart":1794578400,"pressureTrend":"FALLING","windDirection":152,"uvIndex":0,"windSpeed":5.5908,"snowfallIntensity":0.0},{"daylight":false,"humidity":71,"pressure":989.789978,"temperature":12.85,"visibility":32347.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":6,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.719589,"windGust":25.4088,"temperatureApparent":11.529953,"cloudCover":97,"precipitationChance":0,"cloudCoverMidAltPct":92,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":97,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794582000,"pressureTrend":"FALLING","windDirection":107,"uvIndex":0,"windSpeed":9.324,"snowfallIntensity":0.0},{"daylight":true,"humidity":70,"pressure":990.130005,"temperature":13.64,"visibility":34072.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":24,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":8.26889,"windGust":31.352398,"temperatureApparent":10.051039,"cloudCover":99,"precipitationChance":0,"cloudCoverMidAltPct":96,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":56,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794585600,"pressureTrend":"FALLING","windDirection":131,"uvIndex":0,"windSpeed":15.263999,"snowfallIntensity":0.0},{"daylight":true,"humidity":80,"pressure":991.099976,"temperature":12.79,"visibility":20931.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":66,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":9.425461,"windGust":32.810402,"temperatureApparent":9.430462,"cloudCover":96,"precipitationChance":0,"cloudCoverMidAltPct":60,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":22,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794589200,"pressureTrend":"STEADY","windDirection":239,"uvIndex":0,"windSpeed":13.521601,"snowfallIntensity":0.0},{"daylight":true,"humidity":81,"pressure":991.559998,"temperature":13.02,"visibility":15831.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":39,"perceivedPrecipitationIntensity":0.568,"precipitationIntensity":0.252,"temperatureDewPoint":9.834717,"windGust":27.719999,"temperatureApparent":11.22246,"cloudCover":100,"precipitationChance":20,"cloudCoverMidAltPct":98,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":19,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.252,"minimum":0.252,"maximum":0.252},"forecastStart":1794592800,"pressureTrend":"RISING","windDirection":221,"uvIndex":1,"windSpeed":8.478,"snowfallIntensity":0.0},{"daylight":true,"humidity":82,"pressure":991.630005,"temperature":13.07,"visibility":16011.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":67,"perceivedPrecipitationIntensity":0.283,"precipitationIntensity":0.059,"temperatureDewPoint":10.066879,"windGust":30.477598,"temperatureApparent":10.538489,"cloudCover":100,"precipitationChance":23,"cloudCoverMidAltPct":96,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":34,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.059,"minimum":0.059,"maximum":0.059},"forecastStart":1794596400,"pressureTrend":"RISING","windDirection":194,"uvIndex":1,"windSpeed":10.5984,"snowfallIntensity":0.0},{"daylight":true,"humidity":82,"pressure":992.080017,"temperature":12.52,"visibility":16435.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":64,"perceivedPrecipitationIntensity":0.499,"precipitationIntensity":0.191,"temperatureDewPoint":9.529678,"windGust":31.676399,"temperatureApparent":9.236209,"cloudCover":100,"precipitationChance":35,"cloudCoverMidAltPct":97,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":99,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.191,"minimum":0.191,"maximum":0.191},"forecastStart":1794600000,"pressureTrend":"RISING","windDirection":206,"uvIndex":1,"windSpeed":12.549601,"snowfallIntensity":0.0},{"daylight":true,"humidity":84,"pressure":991.97998,"temperature":12.26,"visibility":12801.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":75,"perceivedPrecipitationIntensity":1.128,"precipitationIntensity":1.205,"temperatureDewPoint":9.634369,"windGust":28.656,"temperatureApparent":9.296653,"cloudCover":100,"precipitationChance":55,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.205,"minimum":1.205,"maximum":1.205},"forecastStart":1794603600,"pressureTrend":"STEADY","windDirection":201,"uvIndex":1,"windSpeed":11.6712,"snowfallIntensity":0.0},{"daylight":true,"humidity":85,"pressure":992.119995,"temperature":12.03,"visibility":9057.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":81,"perceivedPrecipitationIntensity":0.89,"precipitationIntensity":0.684,"temperatureDewPoint":9.585251,"windGust":26.046,"temperatureApparent":9.971526,"cloudCover":100,"precipitationChance":57,"cloudCoverMidAltPct":100,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":98,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.684,"minimum":0.684,"maximum":0.684},"forecastStart":1794607200,"pressureTrend":"STEADY","windDirection":194,"uvIndex":1,"windSpeed":9.234,"snowfallIntensity":0.0},{"daylight":true,"humidity":88,"pressure":992.48999,"temperature":11.76,"visibility":7366.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":1.135,"precipitationIntensity":1.224,"temperatureDewPoint":9.837143,"windGust":18.129601,"temperatureApparent":10.412608,"cloudCover":100,"precipitationChance":68,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":97,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.224,"minimum":1.224,"maximum":1.224},"forecastStart":1794610800,"pressureTrend":"STEADY","windDirection":180,"uvIndex":0,"windSpeed":7.7652,"snowfallIntensity":0.0},{"daylight":true,"humidity":90,"pressure":992.950012,"temperature":11.47,"visibility":6167.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":1.084,"precipitationIntensity":1.093,"temperatureDewPoint":9.886688,"windGust":17.326801,"temperatureApparent":11.056475,"cloudCover":100,"precipitationChance":68,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.093,"minimum":1.093,"maximum":1.093},"forecastStart":1794614400,"pressureTrend":"RISING","windDirection":158,"uvIndex":0,"windSpeed":6.4944,"snowfallIntensity":0.0},{"daylight":false,"humidity":90,"pressure":993.429993,"temperature":11.2,"visibility":10017.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":54,"perceivedPrecipitationIntensity":0.894,"precipitationIntensity":0.692,"temperatureDewPoint":9.620041,"windGust":19.764,"temperatureApparent":10.591156,"cloudCover":100,"precipitationChance":63,"cloudCoverMidAltPct":100,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":100,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.692,"minimum":0.692,"maximum":0.692},"forecastStart":1794618000,"pressureTrend":"RISING","windDirection":149,"uvIndex":0,"windSpeed":7.844399,"snowfallIntensity":0.0},{"daylight":false,"humidity":89,"pressure":993.809998,"temperature":10.85,"visibility":18581.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":39,"perceivedPrecipitationIntensity":0.274,"precipitationIntensity":0.055,"temperatureDewPoint":9.108414,"windGust":18.846001,"temperatureApparent":10.008285,"cloudCover":99,"precipitationChance":44,"cloudCoverMidAltPct":90,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":95,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.055,"minimum":0.055,"maximum":0.055},"forecastStart":1794621600,"pressureTrend":"RISING","windDirection":135,"uvIndex":0,"windSpeed":8.4348,"snowfallIntensity":0.0},{"daylight":false,"humidity":89,"pressure":994.340027,"temperature":10.49,"visibility":22953.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":17,"perceivedPrecipitationIntensity":0.203,"precipitationIntensity":0.03,"temperatureDewPoint":8.753342,"windGust":15.235199,"temperatureApparent":10.093671,"cloudCover":99,"precipitationChance":35,"cloudCoverMidAltPct":88,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.03,"minimum":0.03,"maximum":0.03},"forecastStart":1794625200,"pressureTrend":"RISING","windDirection":146,"uvIndex":0,"windSpeed":7.1712,"snowfallIntensity":0.0},{"daylight":false,"humidity":88,"pressure":994.849976,"temperature":10.28,"visibility":23999.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":23,"perceivedPrecipitationIntensity":0.352,"precipitationIntensity":0.092,"temperatureDewPoint":8.379349,"windGust":19.6416,"temperatureApparent":8.919455,"cloudCover":82,"precipitationChance":27,"cloudCoverMidAltPct":65,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.092,"minimum":0.092,"maximum":0.092},"forecastStart":1794628800,"pressureTrend":"RISING","windDirection":168,"uvIndex":0,"windSpeed":9.1692,"snowfallIntensity":0.0},{"daylight":false,"humidity":86,"pressure":995.400024,"temperature":10.2,"visibility":25448.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":38,"perceivedPrecipitationIntensity":0.192,"precipitationIntensity":0.027,"temperatureDewPoint":7.96196,"windGust":23.864401,"temperatureApparent":7.958751,"cloudCover":98,"precipitationChance":19,"cloudCoverMidAltPct":74,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.027,"minimum":0.027,"maximum":0.027},"forecastStart":1794632400,"pressureTrend":"RISING","windDirection":183,"uvIndex":0,"windSpeed":12.0564,"snowfallIntensity":0.0},{"daylight":false,"humidity":84,"pressure":996.070007,"temperature":10.02,"visibility":28076.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":33,"perceivedPrecipitationIntensity":0.242,"precipitationIntensity":0.043,"temperatureDewPoint":7.440018,"windGust":24.958801,"temperatureApparent":7.321218,"cloudCover":74,"precipitationChance":17,"cloudCoverMidAltPct":42,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.043,"minimum":0.043,"maximum":0.043},"forecastStart":1794636000,"pressureTrend":"RISING","windDirection":179,"uvIndex":0,"windSpeed":12.3696,"snowfallIntensity":0.0},{"daylight":false,"humidity":83,"pressure":996.48999,"temperature":9.93,"visibility":28703.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":62,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.176666,"windGust":28.184401,"temperatureApparent":7.196809,"cloudCover":93,"precipitationChance":0,"cloudCoverMidAltPct":58,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794639600,"pressureTrend":"RISING","windDirection":179,"uvIndex":0,"windSpeed":13.086,"snowfallIntensity":0.0},{"daylight":false,"humidity":82,"pressure":997.099976,"temperature":9.91,"visibility":22503.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":0.297,"precipitationIntensity":0.065,"temperatureDewPoint":6.980118,"windGust":36.504002,"temperatureApparent":5.957533,"cloudCover":83,"precipitationChance":13,"cloudCoverMidAltPct":68,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":31,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.065,"minimum":0.065,"maximum":0.065},"forecastStart":1794643200,"pressureTrend":"RISING","windDirection":188,"uvIndex":0,"windSpeed":16.254,"snowfallIntensity":0.0},{"daylight":false,"humidity":84,"pressure":997.929993,"temperature":9.78,"visibility":19336.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":62,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.20488,"windGust":36.144001,"temperatureApparent":5.642423,"cloudCover":79,"precipitationChance":0,"cloudCoverMidAltPct":45,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":20,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794646800,"pressureTrend":"RISING","windDirection":189,"uvIndex":0,"windSpeed":16.65,"snowfallIntensity":0.0},{"daylight":false,"humidity":86,"pressure":998.849976,"temperature":9.54,"visibility":16225.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":50,"perceivedPrecipitationIntensity":0.549,"precipitationIntensity":0.234,"temperatureDewPoint":7.313568,"windGust":32.5116,"temperatureApparent":5.722379,"cloudCover":59,"precipitationChance":24,"cloudCoverMidAltPct":30,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.234,"minimum":0.234,"maximum":0.234},"forecastStart":1794650400,"pressureTrend":"RISING","windDirection":186,"uvIndex":0,"windSpeed":14.9436,"snowfallIntensity":0.0}]},"forecastPeriodic":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"forecasts":[{"periods":[{"humidity":79,"daylight":false,"forecastEnd":1794582000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.85,"uvIndexMin":0,"temperatureApparentMin":9.818448,"windGustSpeedMax":25.4088,"perceivedPrecipitationIntensityMax":0.082,"uvIndexMax":0,"temperatureApparentMax":11.864366,"forecastStart":1794567600,"windDirection":101,"windSpeed":7.4943,"humidityMax":85,"precipitationAmountByType":[{"expected":0.005,"minimum":0.005,"maximum":0.005,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":5,"visibilityMax":32347.0,"cloudCover":88,"precipitationChance":24,"temperatureMin":10.94799,"cloudCoverMidAltPct":79,"precipitationIntensityMax":0.005,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":89,"humidityMin":71,"visibilityMin":19738.0,"precipitationType":["RAIN"],"windSpeedMax":9.324},{"humidity":77,"daylight":true,"forecastEnd":1794596400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":9.384322,"windGustSpeedMax":32.810402,"perceivedPrecipitationIntensityMax":0.568,"uvIndexMax":1,"temperatureApparentMax":11.529953,"forecastStart":1794582000,"windDirection":185,"windSpeed":11.8062,"humidityMax":82,"precipitationAmountByType":[{"expected":0.252,"minimum":0.252,"maximum":0.252,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":41,"visibilityMax":34072.0,"cloudCover":98,"precipitationChance":26,"temperatureMin":12.767698,"cloudCoverMidAltPct":87,"precipitationIntensityMax":0.252,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":41,"humidityMin":70,"visibilityMin":15831.0,"precipitationType":["RAIN"],"windSpeedMax":15.263999},{"humidity":84,"daylight":true,"forecastEnd":1794610800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.07,"uvIndexMin":0,"temperatureApparentMin":9.132,"windGustSpeedMax":31.676399,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":10.538489,"forecastStart":1794596400,"windDirection":198,"windSpeed":10.65915,"humidityMax":88,"precipitationAmountByType":[{"expected":2.139,"minimum":2.139,"maximum":2.139,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":71,"visibilityMax":16435.0,"cloudCover":100,"precipitationChance":68,"temperatureMin":11.76,"cloudCoverMidAltPct":99,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":90,"humidityMin":82,"visibilityMin":7366.0,"precipitationType":["RAIN"],"windSpeedMax":12.549601},{"humidity":89,"daylight":true,"forecastEnd":1794625200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.76,"uvIndexMin":0,"temperatureApparentMin":9.995345,"windGustSpeedMax":19.764,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":0,"temperatureApparentMax":11.058412,"forecastStart":1794610800,"windDirection":151,"windSpeed":7.560449,"humidityMax":90,"precipitationAmountByType":[{"expected":3.064,"minimum":3.064,"maximum":3.064,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":48,"visibilityMax":22953.0,"cloudCover":100,"precipitationChance":82,"temperatureMin":10.49,"cloudCoverMidAltPct":96,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":97,"humidityMin":88,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":8.4348},{"humidity":86,"daylight":false,"forecastEnd":1794639600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.49,"uvIndexMin":0,"temperatureApparentMin":7.196809,"windGustSpeedMax":28.184401,"perceivedPrecipitationIntensityMax":0.352,"uvIndexMax":0,"temperatureApparentMax":10.093671,"forecastStart":1794625200,"windDirection":175,"windSpeed":10.93095,"humidityMax":89,"precipitationAmountByType":[{"expected":0.192,"minimum":0.192,"maximum":0.192,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":33,"visibilityMax":28703.0,"cloudCover":88,"precipitationChance":49,"temperatureMin":9.93,"cloudCoverMidAltPct":64,"precipitationIntensityMax":0.092,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":72,"humidityMin":83,"visibilityMin":22953.0,"precipitationType":["RAIN"],"windSpeedMax":13.086},{"humidity":84,"daylight":false,"forecastEnd":1794654000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.93,"uvIndexMin":0,"temperatureApparentMin":5.604858,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":0.549,"uvIndexMax":0,"temperatureApparentMax":7.196809,"forecastStart":1794639600,"windDirection":186,"windSpeed":15.3558,"humidityMax":88,"precipitationAmountByType":[{"expected":0.299,"minimum":0.299,"maximum":0.299,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":56,"visibilityMax":28703.0,"cloudCover":74,"precipitationChance":28,"temperatureMin":9.2,"cloudCoverMidAltPct":47,"precipitationIntensityMax":0.234,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":21,"humidityMin":82,"visibilityMin":16225.0,"precipitationType":["RAIN"],"windSpeedMax":16.65}],"periodLength":4}]},"forecastNextHour":{"metadata":{"latitude":0,"longitude":0,"expireTime":1794571473,"sourceType":"MODELED","attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"temporarilyUnavailable":false,"providerName":"US National Oceanic & Atmospheric Administration","reportedTime":1794569160},"condition":[{"parameters":[],"startTime":1794569640,"beginCondition":"CLEAR","forecastToken":"CLEAR","endCondition":"CLEAR"}],"summary":[{"condition":["CLEAR"],"precipitationChance":0,"startTime":1794569640,"precipitationIntensity":0.0}],"minutes":[{"precipitationChance":0,"startTime":1794569640,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569700,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569760,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569820,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569880,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569940,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570000,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570060,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570120,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570180,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570240,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570300,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570360,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570420,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570480,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570540,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570600,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570660,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570720,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570780,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570840,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570900,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570960,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571020,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571080,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571140,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571200,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571260,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571320,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571380,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571440,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571500,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571560,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571620,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571680,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571740,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571800,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571860,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571920,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571980,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572040,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572100,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572160,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572220,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572280,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572340,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572400,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572460,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572520,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572580,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572640,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572700,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572760,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572820,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572880,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572940,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573000,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573060,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573120,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573180,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573240,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573300,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573360,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573420,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573480,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573540,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573600,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573660,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573720,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573780,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573840,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573900,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573960,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574020,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574080,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574140,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574200,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574260,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574320,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574380,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574440,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574500,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0}],"forecastEnd":1794574560,"forecastStart":1794569640}} diff --git a/tests/fixtures/wk3-paired/seattle-repeat/manifest.json b/tests/fixtures/wk3-paired/seattle-repeat/manifest.json new file mode 100644 index 00000000..25d243cf --- /dev/null +++ b/tests/fixtures/wk3-paired/seattle-repeat/manifest.json @@ -0,0 +1,117 @@ +{ + "schema": "lib-rc-3.0.0-b66", + "public_test_location": "seattle public city centre (not device location)", + "responses": [ + { + "headers": { + "date": [ + "Fri, 13 Nov 2026 11:34:33 GMT" + ], + "vary": [ + "Accept-Encoding", + "User-Agent, Accept" + ], + "cache-control": [ + "max-age=299, public, s-maxage=299" + ], + "x-cache": [ + "MISS KS-CLOUD" + ] + }, + "file": "apple.json", + "started": 1794569672.95542, + "finished": 1794569673.088546, + "status": 200, + "content_type": "application/json", + "bytes": 62455 + }, + { + "headers": { + "date": [ + "Fri, 13 Nov 2026 11:34:33 GMT" + ], + "vary": [ + "Accept-Encoding", + "User-Agent, Accept" + ], + "cache-control": [ + "max-age=299, public, s-maxage=299" + ], + "x-cache": [ + "MISS KS-CLOUD" + ] + }, + "file": "apple.bin", + "started": 1794569672.9554958, + "finished": 1794569673.074862, + "status": 200, + "content_type": "application/vnd.apple.flatbuffer;messageType=WK3.Weather", + "bytes": 13820 + } + ], + "sanitization": { + "coordinate_fields": [ + { + "root_slot": 0, + "latitude_offset": 13712, + "longitude_offset": 13708 + }, + { + "root_slot": 1, + "latitude_offset": 13324, + "longitude_offset": 13320 + }, + { + "root_slot": 2, + "latitude_offset": 12904, + "longitude_offset": 12900 + }, + { + "root_slot": 3, + "latitude_offset": 7748, + "longitude_offset": 7744 + }, + { + "root_slot": 4, + "latitude_offset": 4584, + "longitude_offset": 4580 + }, + { + "root_slot": 5, + "latitude_offset": 3404, + "longitude_offset": 3400 + }, + { + "root_slot": 6, + "latitude_offset": 188, + "longitude_offset": 184 + }, + { + "root_slot": 7, + "latitude_offset": 380, + "longitude_offset": 376 + }, + { + "root_slot": 9, + "latitude_offset": 1164, + "longitude_offset": 1160 + }, + { + "root_slot": 14, + "latitude_offset": 2132, + "longitude_offset": 2128 + } + ], + "coordinate_urls": 0, + "method": "Only vtable-validated Metadata latitude/longitude floats and same-length coordinate URL digits replaced. No re-encoding." + }, + "sha256": { + "apple.json": "3df2e72858dcf0a192d81d3a08d7e8f853c655a4f7615a5d196bad7867cb010c", + "apple.bin": "93ef12a168e6a154f0ce6a6c30aa6e06297bd6cc6b8874e7489ff2dccaf74d36" + }, + "schema_source": { + "weatherkit_dev": "cd9d7927094aff79906fe3430f339f39970ca46e", + "protocol_tag": "v2.0.5", + "protocol_commit": "c87c1dcd851ea9293141bcfb32fde1b2cca564b9" + } +} diff --git a/tests/fixtures/wk3-paired/seattle/apple.bin b/tests/fixtures/wk3-paired/seattle/apple.bin new file mode 100644 index 0000000000000000000000000000000000000000..f08f425670f30b58a482ec223cb1e8ebb51f190e GIT binary patch literal 13784 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 kLHbQN(~Dwe6_nhc%v_273zWsK^Z)<= literal 0 HcmV?d00001 diff --git a/tests/fixtures/wk3-paired/tianjin/apple.json b/tests/fixtures/wk3-paired/tianjin/apple.json new file mode 100644 index 00000000..27959d4a --- /dev/null +++ b/tests/fixtures/wk3-paired/tianjin/apple.json @@ -0,0 +1 @@ +{"news":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"APPLE_INTERNAL","reportedTime":1794569484},"placements":[]},"airQuality":{"metadata":{"language":"en","latitude":0,"longitude":0,"expireTime":1794573000,"sourceType":"STATION","attributionUrl":"https://www.qweather.com/air/a/00.0000,000.0000?from=AppleWeatherService&lang=en","readTime":1794569400,"temporarilyUnavailable":false,"providerName":"QWeather","reportedTime":1794564000},"index":152,"pollutants":[{"amount":47.0,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"NO2"},{"amount":0.9,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"CO"},{"amount":74.0,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"OZONE"},{"amount":116.0,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"PM2_5"},{"amount":9.0,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"SO2"},{"amount":132.0,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"PM10"}],"scale":"HJ6332012.2604","primaryPollutant":"NOT_AVAILABLE","previousDayComparison":"UNKNOWN","categoryIndex":4,"isSignificant":true},"currentWeather":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794569784,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794569484},"daylight":false,"humidity":73,"pressure":1019.21283,"temperature":10.709241,"visibility":15433.75293,"asOf":1794569484,"precipitationIntensity":0.0,"temperatureDewPoint":6.065262,"windGust":7.254264,"temperatureApparent":9.943502,"snowfallAmountPrevious6h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"snowfallAmountPrevious24h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountNext6hByType":[],"snowfallAmountNext24h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountPrevious6hByType":[],"snowfallAmountPrevious1h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"pressureTrend":"RISING","windDirection":113,"windSpeed":4.486428,"cloudCoverLowAltPct":1,"perceivedPrecipitationIntensity":0.0,"precipitationAmountPrevious1hByType":[],"cloudCover":22,"precipitationAmountNext1hByType":[],"snowfallAmountNext1h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountPrevious24hByType":[],"cloudCoverMidAltPct":23,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":16,"snowfallAmountNext6h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"uvIndex":0,"precipitationAmountNext24hByType":[]},"weatherChanges":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"changes":[{"forecastEnd":1794672000,"maxTemperatureChange":"STEADY","forecastStart":1794585600,"minTemperatureChange":"STEADY","dayPrecipitationChange":"STEADY","nightPrecipitationChange":"STEADY"},{"forecastEnd":1794758400,"maxTemperatureChange":"STEADY","forecastStart":1794672000,"minTemperatureChange":"STEADY","dayPrecipitationChange":"STEADY","nightPrecipitationChange":"STEADY"}],"forecastEnd":1794758400,"forecastStart":1794585600},"weatherAlerts":{"metadata":{"language":"en-US","latitude":0,"longitude":0,"expireTime":1794569784,"sourceType":"STATION","attributionUrl":"https://www.qweather.com","readTime":1794569484,"temporarilyUnavailable":false,"providerName":"National Early Warning Center","reportedTime":1794569484},"alerts":[]},"historicalComparisons":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"comparisons":[{"condition":"TEMPERATURE_MAX","deviation":"HIGHER","baselineValue":11.869995,"baselineStartDate":0,"currentValue":15.948572,"baselineType":"MEAN"},{"condition":"PRECIPITATION","deviation":"NORMAL","baselineValue":0.0,"baselineStartDate":0,"currentValue":0.0,"baselineType":"MEAN"}]},"forecastDaily":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"days":[{"moonrise":1794537367,"moonset":1794569781,"sunrise":1794523897,"sunset":1794560337,"forecastEnd":1794585600,"sunriseCivil":1794522195,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":15.948572,"solarMidnight":1794585336,"windSpeedAvg":2.7225,"temperatureMaxTime":1794550308,"windGustSpeedMax":8.110801,"sunriseAstronomical":1794518371,"forecastStart":1794499200,"moonPhase":"WAXING_CRESCENT","humidityMax":80,"precipitationAmountByType":[],"sunsetAstronomical":1794565866,"visibilityMax":16892.0,"precipitationChance":0,"temperatureMin":6.036857,"maxUvIndex":3,"temperatureMinTime":1794523543,"sunsetNautical":1794563969,"daytimeForecast":{"humidity":65,"daylight":true,"forecastEnd":1794567600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":15.948572,"uvIndexMin":0,"temperatureApparentMin":7.483241,"windGustSpeedMax":8.110801,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":3,"temperatureApparentMax":17.519449,"forecastStart":1794524400,"windDirection":183,"windSpeed":2.9994,"humidityMax":80,"precipitationAmountByType":[],"cloudCoverLowAltPct":22,"visibilityMax":16892.0,"cloudCover":59,"precipitationChance":0,"temperatureMin":6.08,"cloudCoverMidAltPct":34,"precipitationIntensityMax":0.0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":24,"humidityMin":51,"visibilityMin":8767.0,"precipitationType":["CLEAR"],"windSpeedMax":4.8312},"conditionCode":["PARTLY_CLOUDY"],"humidityMin":51,"solarNoon":1794542116,"visibilityMin":8767.0,"overnightForecast":{"humidity":78,"daylight":false,"forecastEnd":1794610800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.33,"uvIndexMin":0,"temperatureApparentMin":6.06018,"windGustSpeedMax":8.866799,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":10.562979,"forecastStart":1794567600,"windDirection":61,"windSpeed":4.492949,"humidityMax":82,"precipitationAmountByType":[],"cloudCoverLowAltPct":29,"visibilityMax":15686.0,"cloudCover":28,"precipitationChance":0,"temperatureMin":6.229443,"cloudCoverMidAltPct":3,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":4,"humidityMin":71,"visibilityMin":7914.0,"precipitationType":["CLEAR"],"windSpeedMax":5.6232},"precipitationType":["CLEAR"],"sunriseNautical":1794520263,"sunsetCivil":1794562046,"windSpeedMax":4.8312,"restOfDayForecast":{"humidity":76,"daylight":false,"forecastEnd":1794585600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.709241,"uvIndexMin":0,"temperatureApparentMin":7.612356,"windGustSpeedMax":7.254264,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":9.928953,"forecastStart":1794569484,"windDirection":99,"windSpeed":3.721092,"humidityMax":80,"precipitationAmountByType":[],"cloudCoverLowAltPct":1,"visibilityMax":15449.0,"cloudCover":7,"precipitationChance":0,"temperatureMin":8.18,"cloudCoverMidAltPct":4,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":8,"humidityMin":73,"visibilityMin":14781.0,"precipitationType":["CLEAR"],"windSpeedMax":4.486428}},{"moonrise":1794626336,"moonset":1794659714,"sunrise":1794610363,"sunset":1794646689,"forecastEnd":1794672000,"sunriseCivil":1794608658,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.525146,"solarMidnight":1794671745,"windSpeedAvg":3.86175,"temperatureMaxTime":1794636251,"windGustSpeedMax":9.558,"sunriseAstronomical":1794604829,"forecastStart":1794585600,"moonPhase":"WAXING_CRESCENT","humidityMax":84,"precipitationAmountByType":[],"sunsetAstronomical":1794652227,"visibilityMax":17418.0,"precipitationChance":0,"temperatureMin":6.229443,"maxUvIndex":3,"temperatureMinTime":1794610254,"sunsetNautical":1794650328,"daytimeForecast":{"humidity":74,"daylight":true,"forecastEnd":1794654000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.525146,"uvIndexMin":0,"temperatureApparentMin":6.244272,"windGustSpeedMax":9.558,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":3,"temperatureApparentMax":16.761372,"forecastStart":1794610800,"windDirection":42,"windSpeed":3.7722,"humidityMax":80,"precipitationAmountByType":[],"cloudCoverLowAltPct":28,"visibilityMax":17418.0,"cloudCover":23,"precipitationChance":0,"temperatureMin":6.24,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":1,"humidityMin":66,"visibilityMin":8031.0,"precipitationType":["CLEAR"],"windSpeedMax":4.7484},"conditionCode":["MOSTLY_CLEAR"],"humidityMin":66,"solarNoon":1794628524,"visibilityMin":7914.0,"overnightForecast":{"humidity":82,"daylight":false,"forecastEnd":1794697200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.89,"uvIndexMin":0,"temperatureApparentMin":5.9612,"windGustSpeedMax":13.1256,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":9.523725,"forecastStart":1794654000,"windDirection":6,"windSpeed":4.05435,"humidityMax":86,"precipitationAmountByType":[],"cloudCoverLowAltPct":50,"visibilityMax":16701.0,"cloudCover":72,"precipitationChance":0,"temperatureMin":6.273458,"cloudCoverMidAltPct":23,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":66,"humidityMin":77,"visibilityMin":11806.0,"precipitationType":["CLEAR"],"windSpeedMax":7.5672},"precipitationType":["CLEAR"],"sunriseNautical":1794606722,"sunsetCivil":1794648401,"windSpeedMax":5.6232},{"moonrise":1794714894,"moonset":1794749778,"sunrise":1794696830,"sunset":1794733042,"forecastEnd":1794758400,"sunriseCivil":1794695121,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.048255,"solarMidnight":1794758155,"windSpeedAvg":9.0489,"temperatureMaxTime":1794721824,"windGustSpeedMax":26.888401,"sunriseAstronomical":1794691286,"forecastStart":1794672000,"moonPhase":"WAXING_CRESCENT","humidityMax":86,"precipitationAmountByType":[],"sunsetAstronomical":1794738589,"visibilityMax":18299.0,"precipitationChance":0,"temperatureMin":6.273458,"maxUvIndex":2,"temperatureMinTime":1794690768,"sunsetNautical":1794736688,"daytimeForecast":{"humidity":60,"daylight":true,"forecastEnd":1794740400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.048255,"uvIndexMin":0,"temperatureApparentMin":5.886318,"windGustSpeedMax":26.888401,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":2,"temperatureApparentMax":9.46348,"forecastStart":1794697200,"windDirection":62,"windSpeed":10.78515,"humidityMax":80,"precipitationAmountByType":[],"cloudCoverLowAltPct":22,"visibilityMax":18299.0,"cloudCover":96,"precipitationChance":0,"temperatureMin":6.95,"cloudCoverMidAltPct":55,"precipitationIntensityMax":0.0,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":77,"humidityMin":50,"visibilityMin":11806.0,"precipitationType":["CLEAR"],"windSpeedMax":13.932},"conditionCode":["CLOUDY"],"humidityMin":50,"solarNoon":1794714934,"visibilityMin":11806.0,"overnightForecast":{"humidity":60,"daylight":false,"forecastEnd":1794783600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.38,"uvIndexMin":0,"temperatureApparentMin":3.076332,"windGustSpeedMax":24.940802,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":6.39883,"forecastStart":1794740400,"windDirection":66,"windSpeed":10.083,"humidityMax":63,"precipitationAmountByType":[],"cloudCoverLowAltPct":24,"visibilityMax":17627.0,"cloudCover":100,"precipitationChance":0,"temperatureMin":4.944714,"cloudCoverMidAltPct":99,"precipitationIntensityMax":0.0,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":83,"humidityMin":57,"visibilityMin":15513.0,"precipitationType":["CLEAR"],"windSpeedMax":11.0052},"precipitationType":["CLEAR"],"sunriseNautical":1794693181,"sunsetCivil":1794734757,"windSpeedMax":13.932},{"moonrise":1794803128,"moonset":1794839885,"sunrise":1794783296,"sunset":1794819397,"forecastEnd":1794844800,"sunriseCivil":1794781584,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.400417,"solarMidnight":1794844566,"windSpeedAvg":7.362075,"temperatureMaxTime":1794806600,"windGustSpeedMax":23.972401,"sunriseAstronomical":1794777743,"forecastStart":1794758400,"moonPhase":"WAXING_CRESCENT","humidityMax":68,"precipitationAmountByType":[],"sunsetAstronomical":1794824953,"visibilityMax":22211.0,"precipitationChance":0,"temperatureMin":4.56,"maxUvIndex":2,"temperatureMinTime":1794844800,"sunsetNautical":1794823050,"daytimeForecast":{"humidity":47,"daylight":true,"forecastEnd":1794826800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.400417,"uvIndexMin":0,"temperatureApparentMin":2.732167,"windGustSpeedMax":19.915201,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":2,"temperatureApparentMax":9.868329,"forecastStart":1794783600,"windDirection":67,"windSpeed":7.23615,"humidityMax":63,"precipitationAmountByType":[],"cloudCoverLowAltPct":9,"visibilityMax":22211.0,"cloudCover":88,"precipitationChance":0,"temperatureMin":4.95,"cloudCoverMidAltPct":64,"precipitationIntensityMax":0.0,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":61,"humidityMin":39,"visibilityMin":17627.0,"precipitationType":["CLEAR"],"windSpeedMax":10.983601},"conditionCode":["CLOUDY"],"humidityMin":39,"solarNoon":1794801345,"visibilityMin":15513.0,"overnightForecast":{"humidity":65,"daylight":false,"forecastEnd":1794870000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":6.89,"uvIndexMin":0,"temperatureApparentMin":3.673543,"windGustSpeedMax":8.4492,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":7.503468,"forecastStart":1794826800,"windDirection":243,"windSpeed":4.4913,"humidityMax":72,"precipitationAmountByType":[],"cloudCoverLowAltPct":12,"visibilityMax":21431.0,"cloudCover":79,"precipitationChance":0,"temperatureMin":3.756924,"cloudCoverMidAltPct":46,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":68,"humidityMin":55,"visibilityMin":20002.0,"precipitationType":["CLEAR"],"windSpeedMax":5.1444},"precipitationType":["CLEAR"],"sunriseNautical":1794779641,"sunsetCivil":1794821116,"windSpeedMax":11.0052},{"moonrise":1794891114,"moonset":1794930001,"sunrise":1794869762,"sunset":1794905754,"forecastEnd":1794931200,"sunriseCivil":1794868047,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.708934,"solarMidnight":1794930977,"windSpeedAvg":9.268724,"temperatureMaxTime":1794894417,"windGustSpeedMax":42.264,"sunriseAstronomical":1794864201,"forecastStart":1794844800,"moonPhase":"WAXING_CRESCENT","humidityMax":80,"precipitationAmountByType":[{"expected":1.299,"minimum":1.299,"maximum":1.299,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794911319,"visibilityMax":20751.0,"precipitationChance":33,"temperatureMin":3.756924,"maxUvIndex":2,"temperatureMinTime":1794851700,"sunsetNautical":1794909414,"daytimeForecast":{"humidity":67,"daylight":true,"forecastEnd":1794913200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.708934,"uvIndexMin":0,"temperatureApparentMin":4.476398,"windGustSpeedMax":23.410799,"perceivedPrecipitationIntensityMax":0.379,"uvIndexMax":2,"temperatureApparentMax":6.328387,"forecastStart":1794870000,"windDirection":236,"windSpeed":7.8021,"humidityMax":79,"precipitationAmountByType":[{"expected":0.549,"minimum":0.549,"maximum":0.549,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":28,"visibilityMax":20002.0,"cloudCover":86,"precipitationChance":22,"temperatureMin":5.65,"cloudCoverMidAltPct":79,"precipitationIntensityMax":0.107,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":10,"humidityMin":62,"visibilityMin":17235.0,"precipitationType":["RAIN"],"windSpeedMax":11.019601},"conditionCode":["DRIZZLE"],"humidityMin":60,"solarNoon":1794887756,"visibilityMin":14655.0,"overnightForecast":{"humidity":58,"daylight":false,"forecastEnd":1794956400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":6.3,"uvIndexMin":0,"temperatureApparentMin":-6.986949,"windGustSpeedMax":55.332001,"perceivedPrecipitationIntensityMax":0.879,"uvIndexMax":0,"temperatureApparentMax":4.476398,"forecastStart":1794913200,"windDirection":313,"windSpeed":22.26795,"humidityMax":80,"precipitationAmountByType":[{"expected":0.75,"minimum":0.75,"maximum":0.75,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":28,"visibilityMax":22174.0,"cloudCover":36,"precipitationChance":25,"temperatureMin":2.302699,"cloudCoverMidAltPct":17,"precipitationIntensityMax":0.664,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":40,"visibilityMin":14655.0,"precipitationType":["RAIN"],"windSpeedMax":25.1208},"precipitationType":["RAIN"],"sunriseNautical":1794866100,"sunsetCivil":1794907476,"windSpeedMax":23.252399},{"moonrise":1794978953,"sunrise":1794956228,"sunset":1794992113,"forecastEnd":1795017600,"sunriseCivil":1794954510,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.80324,"solarMidnight":1795017389,"windSpeedAvg":19.258276,"temperatureMaxTime":1794981824,"windGustSpeedMax":56.231998,"sunriseAstronomical":1794950658,"forecastStart":1794931200,"moonPhase":"FIRST_QUARTER","humidityMax":62,"precipitationAmountByType":[],"sunsetAstronomical":1794997686,"visibilityMax":22228.0,"precipitationChance":0,"temperatureMin":0.23,"maxUvIndex":2,"temperatureMinTime":1795017600,"sunsetNautical":1794995780,"daytimeForecast":{"humidity":30,"daylight":true,"forecastEnd":1794999600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.80324,"uvIndexMin":0,"temperatureApparentMin":-6.672721,"windGustSpeedMax":56.231998,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":2,"temperatureApparentMax":7.315022,"forecastStart":1794956400,"windDirection":314,"windSpeed":20.3811,"humidityMax":45,"precipitationAmountByType":[],"cloudCoverLowAltPct":0,"visibilityMax":22228.0,"cloudCover":4,"precipitationChance":0,"temperatureMin":2.35,"cloudCoverMidAltPct":1,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":22,"visibilityMin":21648.0,"precipitationType":["CLEAR"],"windSpeedMax":25.477201},"conditionCode":["CLEAR"],"humidityMin":22,"solarNoon":1794974168,"visibilityMin":18220.0,"overnightForecast":{"humidity":61,"daylight":false,"forecastEnd":1795042800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":3.24,"uvIndexMin":0,"temperatureApparentMin":-3.726878,"windGustSpeedMax":22.8204,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":-0.249791,"forecastStart":1794999600,"windDirection":251,"windSpeed":9.15675,"humidityMax":65,"precipitationAmountByType":[],"cloudCoverLowAltPct":0,"visibilityMax":22056.0,"cloudCover":5,"precipitationChance":0,"temperatureMin":-0.395956,"cloudCoverMidAltPct":1,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":45,"visibilityMin":20939.0,"precipitationType":["CLEAR"],"windSpeedMax":9.813601},"precipitationType":["CLEAR"],"sunriseNautical":1794952558,"sunsetCivil":1794993838,"windSpeedMax":25.477201},{"moonrise":1795066723,"moonset":1795020142,"sunrise":1795042694,"sunset":1795078473,"forecastEnd":1795104000,"sunriseCivil":1795040972,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.503553,"solarMidnight":1795103803,"windSpeedAvg":12.2721,"temperatureMaxTime":1795076004,"windGustSpeedMax":27.108,"sunriseAstronomical":1795037114,"forecastStart":1795017600,"moonPhase":"WAXING_GIBBOUS","humidityMax":65,"precipitationAmountByType":[],"sunsetAstronomical":1795084056,"visibilityMax":21819.0,"precipitationChance":0,"temperatureMin":-0.395956,"maxUvIndex":2,"temperatureMinTime":1795027447,"sunsetNautical":1795082148,"daytimeForecast":{"humidity":41,"daylight":true,"forecastEnd":1795086000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.503553,"uvIndexMin":0,"temperatureApparentMin":-0.800893,"windGustSpeedMax":26.3664,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":2,"temperatureApparentMax":8.820073,"forecastStart":1795042800,"windDirection":315,"windSpeed":13.977901,"humidityMax":57,"precipitationAmountByType":[],"cloudCoverLowAltPct":3,"visibilityMax":21819.0,"cloudCover":7,"precipitationChance":0,"temperatureMin":1.95,"cloudCoverMidAltPct":3,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":33,"visibilityMin":20224.0,"precipitationType":["CLEAR"],"windSpeedMax":16.624802},"conditionCode":["CLEAR"],"humidityMin":33,"solarNoon":1795060582,"visibilityMin":20102.0,"overnightForecast":{"humidity":61,"daylight":false,"forecastEnd":1795129200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":5.49,"uvIndexMin":0,"temperatureApparentMin":-2.58954,"windGustSpeedMax":27.108,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":0.74367,"forecastStart":1795086000,"windDirection":314,"windSpeed":10.635301,"humidityMax":64,"precipitationAmountByType":[],"cloudCoverLowAltPct":0,"visibilityMax":21805.0,"cloudCover":8,"precipitationChance":0,"temperatureMin":1.248407,"cloudCoverMidAltPct":6,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":51,"visibilityMin":20102.0,"precipitationType":["CLEAR"],"windSpeedMax":13.14},"precipitationType":["CLEAR"],"sunriseNautical":1795039017,"sunsetCivil":1795080202,"windSpeedMax":16.624802},{"moonrise":1795154498,"moonset":1795110359,"sunrise":1795129159,"sunset":1795164836,"forecastEnd":1795190400,"sunriseCivil":1795127434,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.197065,"solarMidnight":1795190217,"windSpeedAvg":11.036625,"temperatureMaxTime":1795163979,"windGustSpeedMax":37.152,"sunriseAstronomical":1795123571,"forecastStart":1795104000,"moonPhase":"WAXING_GIBBOUS","humidityMax":72,"precipitationAmountByType":[],"sunsetAstronomical":1795170428,"visibilityMax":21805.0,"precipitationChance":0,"temperatureMin":0.34,"maxUvIndex":2,"temperatureMinTime":1795190400,"sunsetNautical":1795168517,"daytimeForecast":{"humidity":50,"daylight":true,"forecastEnd":1795172400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.197065,"uvIndexMin":0,"temperatureApparentMin":-0.743232,"windGustSpeedMax":37.152,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":2,"temperatureApparentMax":4.868875,"forecastStart":1795129200,"windDirection":285,"windSpeed":12.71835,"humidityMax":62,"precipitationAmountByType":[],"cloudCoverLowAltPct":6,"visibilityMax":21441.0,"cloudCover":10,"precipitationChance":0,"temperatureMin":2.47,"cloudCoverMidAltPct":4,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":44,"visibilityMin":19909.0,"precipitationType":["CLEAR"],"windSpeedMax":16.7724},"conditionCode":["CLEAR"],"humidityMin":44,"solarNoon":1795146995,"visibilityMin":19909.0,"overnightForecast":{"humidity":66,"daylight":false,"forecastEnd":1795215600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":2.93,"uvIndexMin":0,"temperatureApparentMin":-3.410986,"windGustSpeedMax":24.893999,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":0.768481,"forecastStart":1795172400,"windDirection":7,"windSpeed":9.76455,"humidityMax":72,"precipitationAmountByType":[],"cloudCoverLowAltPct":18,"visibilityMax":20778.0,"cloudCover":34,"precipitationChance":0,"temperatureMin":-0.2056,"cloudCoverMidAltPct":17,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":56,"visibilityMin":19594.0,"precipitationType":["CLEAR"],"windSpeedMax":11.4156},"precipitationType":["CLEAR"],"sunriseNautical":1795125475,"sunsetCivil":1795166568,"windSpeedMax":16.7724},{"moonrise":1795242382,"moonset":1795200721,"sunrise":1795215624,"sunset":1795251200,"forecastEnd":1795276800,"sunriseCivil":1795213896,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.494344,"solarMidnight":1795276631,"windSpeedAvg":10.073925,"temperatureMaxTime":1795239531,"windGustSpeedMax":27.5436,"sunriseAstronomical":1795210027,"forecastStart":1795190400,"moonPhase":"WAXING_GIBBOUS","humidityMax":67,"precipitationAmountByType":[],"sunsetAstronomical":1795256801,"visibilityMax":20554.0,"precipitationChance":0,"temperatureMin":-0.2056,"maxUvIndex":2,"temperatureMinTime":1795205520,"sunsetNautical":1795254889,"daytimeForecast":{"humidity":35,"daylight":true,"forecastEnd":1795258800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.494344,"uvIndexMin":0,"temperatureApparentMin":-1.165541,"windGustSpeedMax":27.5436,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":2,"temperatureApparentMax":8.215144,"forecastStart":1795215600,"windDirection":337,"windSpeed":11.055901,"humidityMax":56,"precipitationAmountByType":[],"cloudCoverLowAltPct":19,"visibilityMax":20421.0,"cloudCover":48,"precipitationChance":0,"temperatureMin":1.13,"cloudCoverMidAltPct":30,"precipitationIntensityMax":0.0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"humidityMin":24,"visibilityMin":19541.0,"precipitationType":["CLEAR"],"windSpeedMax":14.292},"conditionCode":["PARTLY_CLOUDY"],"humidityMin":24,"solarNoon":1795233410,"visibilityMin":19541.0,"overnightForecast":{"humidity":38,"daylight":false,"forecastEnd":1795302000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":4.75,"uvIndexMin":0,"temperatureApparentMin":0.782133,"windGustSpeedMax":18.385199,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":2.097697,"forecastStart":1795258800,"windDirection":337,"windSpeed":7.31055,"humidityMax":42,"precipitationAmountByType":[],"cloudCoverLowAltPct":3,"visibilityMax":19952.0,"cloudCover":19,"precipitationChance":0,"temperatureMin":2.759989,"cloudCoverMidAltPct":18,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":9,"humidityMin":35,"visibilityMin":19690.0,"precipitationType":["CLEAR"],"windSpeedMax":8.128799},"precipitationType":["CLEAR"],"sunriseNautical":1795211933,"sunsetCivil":1795252936,"windSpeedMax":14.292},{"moonrise":1795330461,"moonset":1795291300,"sunrise":1795302089,"sunset":1795337567,"forecastEnd":1795363200,"sunriseCivil":1795300357,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.501335,"solarMidnight":1795363047,"windSpeedAvg":8.63325,"temperatureMaxTime":1795326106,"windGustSpeedMax":26.5716,"sunriseAstronomical":1795296483,"forecastStart":1795276800,"moonPhase":"WAXING_GIBBOUS","humidityMax":49,"precipitationAmountByType":[],"sunsetAstronomical":1795343177,"visibilityMax":19839.0,"precipitationChance":0,"temperatureMin":2.759989,"maxUvIndex":2,"temperatureMinTime":1795301984,"sunsetNautical":1795341262,"daytimeForecast":{"humidity":33,"daylight":true,"forecastEnd":1795345200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.501335,"uvIndexMin":0,"temperatureApparentMin":0.927409,"windGustSpeedMax":26.5716,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":2,"temperatureApparentMax":9.249003,"forecastStart":1795302000,"windDirection":284,"windSpeed":9.6852,"humidityMax":43,"precipitationAmountByType":[],"cloudCoverLowAltPct":11,"visibilityMax":19839.0,"cloudCover":11,"precipitationChance":0,"temperatureMin":2.76,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":26,"visibilityMin":18017.0,"precipitationType":["CLEAR"],"windSpeedMax":11.8944},"conditionCode":["CLEAR"],"humidityMin":26,"solarNoon":1795319826,"visibilityMin":17486.0,"overnightForecast":{"humidity":46,"daylight":false,"forecastEnd":1795388400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":4.48,"uvIndexMin":0,"temperatureApparentMin":0.112784,"windGustSpeedMax":18.594,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":1.530798,"forecastStart":1795345200,"windDirection":224,"windSpeed":8.20065,"humidityMax":49,"precipitationAmountByType":[],"cloudCoverLowAltPct":0,"visibilityMax":18017.0,"cloudCover":0,"precipitationChance":0,"temperatureMin":2.837352,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":43,"visibilityMin":16802.0,"precipitationType":["CLEAR"],"windSpeedMax":8.9244},"precipitationType":["CLEAR"],"sunriseNautical":1795298391,"sunsetCivil":1795339305,"windSpeedMax":11.8944}]},"forecastHourly":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"hours":[{"daylight":false,"humidity":71,"pressure":1019.150024,"temperature":11.33,"visibility":15686.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":3,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":6.259735,"windGust":7.7328,"temperatureApparent":10.562979,"cloudCover":34,"precipitationChance":0,"cloudCoverMidAltPct":38,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":15,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794567600,"pressureTrend":"RISING","windDirection":114,"uvIndex":0,"windSpeed":4.8312,"snowfallIntensity":0.0},{"daylight":false,"humidity":75,"pressure":1019.27002,"temperature":10.07,"visibility":15204.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":0,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":5.839401,"windGust":6.8184,"temperatureApparent":9.314911,"cloudCover":12,"precipitationChance":0,"cloudCoverMidAltPct":9,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":17,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794571200,"pressureTrend":"RISING","windDirection":113,"uvIndex":0,"windSpeed":4.1724,"snowfallIntensity":0.0},{"daylight":false,"humidity":75,"pressure":1019.469971,"temperature":9.73,"visibility":15449.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":0,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":5.510666,"windGust":4.716,"temperatureApparent":9.058333,"cloudCover":9,"precipitationChance":0,"cloudCoverMidAltPct":6,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":15,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794574800,"pressureTrend":"RISING","windDirection":107,"uvIndex":0,"windSpeed":3.7908,"snowfallIntensity":0.0},{"daylight":false,"humidity":76,"pressure":1019.549988,"temperature":9.42,"visibility":15086.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":1,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":5.401611,"windGust":3.942,"temperatureApparent":8.78021,"cloudCover":4,"precipitationChance":0,"cloudCoverMidAltPct":2,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":6,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794578400,"pressureTrend":"STEADY","windDirection":102,"uvIndex":0,"windSpeed":3.5028,"snowfallIntensity":0.0},{"daylight":false,"humidity":77,"pressure":1019.5,"temperature":8.91,"visibility":15302.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":1,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":5.095474,"windGust":4.1868,"temperatureApparent":8.290413,"cloudCover":1,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794582000,"pressureTrend":"STEADY","windDirection":86,"uvIndex":0,"windSpeed":3.4056,"snowfallIntensity":0.0},{"daylight":false,"humidity":80,"pressure":1019.27002,"temperature":8.18,"visibility":14781.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":6,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":4.93483,"windGust":5.292,"temperatureApparent":7.612356,"cloudCover":5,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794585600,"pressureTrend":"STEADY","windDirection":62,"uvIndex":0,"windSpeed":3.618,"snowfallIntensity":0.0},{"daylight":false,"humidity":81,"pressure":1019.030029,"temperature":7.63,"visibility":12829.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":24,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":4.576614,"windGust":6.9012,"temperatureApparent":6.926976,"cloudCover":18,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794589200,"pressureTrend":"STEADY","windDirection":50,"uvIndex":0,"windSpeed":4.6656,"snowfallIntensity":0.0},{"daylight":false,"humidity":82,"pressure":1018.849976,"temperature":7.26,"visibility":11536.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":52,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":4.390839,"windGust":8.28,"temperatureApparent":6.561325,"cloudCover":43,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794592800,"pressureTrend":"STEADY","windDirection":41,"uvIndex":0,"windSpeed":5.6232,"snowfallIntensity":0.0},{"daylight":false,"humidity":81,"pressure":1018.619995,"temperature":6.95,"visibility":8401.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":57,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":3.91304,"windGust":8.2044,"temperatureApparent":6.440799,"cloudCover":54,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794596400,"pressureTrend":"STEADY","windDirection":38,"uvIndex":0,"windSpeed":5.5152,"snowfallIntensity":0.0},{"daylight":false,"humidity":80,"pressure":1018.580017,"temperature":6.83,"visibility":8155.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":56,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":3.6194,"windGust":8.866799,"temperatureApparent":6.320585,"cloudCover":46,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794600000,"pressureTrend":"STEADY","windDirection":41,"uvIndex":0,"windSpeed":5.1804,"snowfallIntensity":0.0},{"daylight":false,"humidity":79,"pressure":1018.650024,"temperature":6.59,"visibility":7914.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":54,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":3.207336,"windGust":8.7372,"temperatureApparent":6.089649,"cloudCover":45,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794603600,"pressureTrend":"STEADY","windDirection":32,"uvIndex":0,"windSpeed":5.1156,"snowfallIntensity":0.0},{"daylight":false,"humidity":79,"pressure":1018.840027,"temperature":6.38,"visibility":7973.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":61,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":3.002991,"windGust":8.5932,"temperatureApparent":6.080156,"cloudCover":50,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794607200,"pressureTrend":"STEADY","windDirection":44,"uvIndex":0,"windSpeed":4.7808,"snowfallIntensity":0.0},{"daylight":true,"humidity":80,"pressure":1019.320007,"temperature":6.24,"visibility":8031.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":69,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":3.044449,"windGust":7.362,"temperatureApparent":6.244272,"cloudCover":56,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794610800,"pressureTrend":"RISING","windDirection":27,"uvIndex":0,"windSpeed":4.2588,"snowfallIntensity":0.0},{"daylight":true,"humidity":79,"pressure":1020.049988,"temperature":6.67,"visibility":10190.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":73,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":3.285187,"windGust":9.558,"temperatureApparent":7.484417,"cloudCover":58,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794614400,"pressureTrend":"RISING","windDirection":38,"uvIndex":0,"windSpeed":4.7448,"snowfallIntensity":0.0},{"daylight":true,"humidity":80,"pressure":1020.289978,"temperature":7.64,"visibility":11867.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":69,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":4.408691,"windGust":9.489599,"temperatureApparent":8.765293,"cloudCover":55,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794618000,"pressureTrend":"RISING","windDirection":39,"uvIndex":1,"windSpeed":4.7484,"snowfallIntensity":0.0},{"daylight":true,"humidity":79,"pressure":1020.359985,"temperature":8.83,"visibility":12727.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":58,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":5.386765,"windGust":9.396,"temperatureApparent":10.466646,"cloudCover":46,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794621600,"pressureTrend":"RISING","windDirection":36,"uvIndex":2,"windSpeed":4.3344,"snowfallIntensity":0.0},{"daylight":true,"humidity":80,"pressure":1020.299988,"temperature":9.58,"visibility":13540.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":50,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":6.298798,"windGust":8.686801,"temperatureApparent":11.396889,"cloudCover":39,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794625200,"pressureTrend":"STEADY","windDirection":33,"uvIndex":2,"windSpeed":4.5072,"snowfallIntensity":0.0},{"daylight":true,"humidity":74,"pressure":1019.429993,"temperature":11.24,"visibility":14931.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":35,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":6.77478,"windGust":8.186399,"temperatureApparent":13.491442,"cloudCover":27,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794628800,"pressureTrend":"FALLING","windDirection":36,"uvIndex":3,"windSpeed":3.9456,"snowfallIntensity":0.0},{"daylight":true,"humidity":69,"pressure":1018.390015,"temperature":12.77,"visibility":16874.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":13,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.224289,"windGust":7.0596,"temperatureApparent":15.818953,"cloudCover":10,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794632400,"pressureTrend":"FALLING","windDirection":51,"uvIndex":2,"windSpeed":2.7288,"snowfallIntensity":0.0},{"daylight":true,"humidity":66,"pressure":1017.789978,"temperature":13.52,"visibility":16975.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":4,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.2901,"windGust":6.6564,"temperatureApparent":16.76125,"cloudCover":4,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794636000,"pressureTrend":"FALLING","windDirection":51,"uvIndex":2,"windSpeed":2.3076,"snowfallIntensity":0.0},{"daylight":true,"humidity":68,"pressure":1017.72998,"temperature":13.07,"visibility":17103.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":4,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.297653,"windGust":6.2064,"temperatureApparent":15.873064,"cloudCover":3,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794639600,"pressureTrend":"FALLING","windDirection":33,"uvIndex":1,"windSpeed":3.1212,"snowfallIntensity":0.0},{"daylight":true,"humidity":72,"pressure":1018.01001,"temperature":12.48,"visibility":17164.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":0,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.569153,"windGust":4.824,"temperatureApparent":14.335525,"cloudCover":0,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794643200,"pressureTrend":"STEADY","windDirection":38,"uvIndex":0,"windSpeed":3.4488,"snowfallIntensity":0.0},{"daylight":false,"humidity":73,"pressure":1018.349976,"temperature":11.74,"visibility":17418.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":0,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.058548,"windGust":4.1112,"temperatureApparent":10.893111,"cloudCover":0,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794646800,"pressureTrend":"STEADY","windDirection":39,"uvIndex":0,"windSpeed":3.6504,"snowfallIntensity":0.0},{"daylight":false,"humidity":73,"pressure":1018.809998,"temperature":11.19,"visibility":17143.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":1,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":6.528549,"windGust":5.526,"temperatureApparent":10.390109,"cloudCover":5,"precipitationChance":0,"cloudCoverMidAltPct":0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":7,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794650400,"pressureTrend":"RISING","windDirection":66,"uvIndex":0,"windSpeed":3.7584,"snowfallIntensity":0.0}]},"forecastPeriodic":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"forecasts":[{"periods":[{"humidity":75,"daylight":false,"forecastEnd":1794582000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.33,"uvIndexMin":0,"temperatureApparentMin":8.290413,"windGustSpeedMax":7.7328,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":10.562979,"forecastStart":1794567600,"windDirection":106,"windSpeed":3.8961,"humidityMax":77,"precipitationAmountByType":[],"cloudCoverLowAltPct":1,"visibilityMax":15686.0,"cloudCover":11,"precipitationChance":0,"temperatureMin":8.91,"cloudCoverMidAltPct":9,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":11,"humidityMin":71,"visibilityMin":15086.0,"precipitationType":["CLEAR"],"windSpeedMax":4.8312},{"humidity":81,"daylight":false,"forecastEnd":1794596400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.91,"uvIndexMin":0,"temperatureApparentMin":6.440799,"windGustSpeedMax":8.28,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":8.290413,"forecastStart":1794582000,"windDirection":51,"windSpeed":4.5918,"humidityMax":82,"precipitationAmountByType":[],"cloudCoverLowAltPct":28,"visibilityMax":15302.0,"cloudCover":23,"precipitationChance":0,"temperatureMin":6.95,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":77,"visibilityMin":8401.0,"precipitationType":["CLEAR"],"windSpeedMax":5.6232},{"humidity":80,"daylight":false,"forecastEnd":1794610800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":6.95,"uvIndexMin":0,"temperatureApparentMin":6.06018,"windGustSpeedMax":8.866799,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":6.440799,"forecastStart":1794596400,"windDirection":38,"windSpeed":4.99095,"humidityMax":81,"precipitationAmountByType":[],"cloudCoverLowAltPct":59,"visibilityMax":8401.0,"cloudCover":49,"precipitationChance":0,"temperatureMin":6.229443,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"humidityMin":79,"visibilityMin":7914.0,"precipitationType":["CLEAR"],"windSpeedMax":5.5152},{"humidity":80,"daylight":true,"forecastEnd":1794625200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.58,"uvIndexMin":0,"temperatureApparentMin":6.244272,"windGustSpeedMax":9.558,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":2,"temperatureApparentMax":11.396889,"forecastStart":1794610800,"windDirection":36,"windSpeed":4.55265,"humidityMax":80,"precipitationAmountByType":[],"cloudCoverLowAltPct":65,"visibilityMax":13540.0,"cloudCover":52,"precipitationChance":0,"temperatureMin":6.24,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"humidityMin":79,"visibilityMin":8031.0,"precipitationType":["CLEAR"],"windSpeedMax":4.7484},{"humidity":71,"daylight":true,"forecastEnd":1794639600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.525146,"uvIndexMin":1,"temperatureApparentMin":11.396889,"windGustSpeedMax":8.686801,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":3,"temperatureApparentMax":16.761372,"forecastStart":1794625200,"windDirection":41,"windSpeed":3.19905,"humidityMax":80,"precipitationAmountByType":[],"cloudCoverLowAltPct":20,"visibilityMax":17103.0,"cloudCover":16,"precipitationChance":0,"temperatureMin":9.58,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":66,"visibilityMin":13540.0,"precipitationType":["CLEAR"],"windSpeedMax":4.5072},{"humidity":73,"daylight":true,"forecastEnd":1794654000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.07,"uvIndexMin":0,"temperatureApparentMin":9.259305,"windGustSpeedMax":6.2064,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":15.873064,"forecastStart":1794639600,"windDirection":51,"windSpeed":3.5649,"humidityMax":77,"precipitationAmountByType":[],"cloudCoverLowAltPct":1,"visibilityMax":17418.0,"cloudCover":3,"precipitationChance":0,"temperatureMin":9.89,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":3,"humidityMin":68,"visibilityMin":16701.0,"precipitationType":["CLEAR"],"windSpeedMax":3.7584}],"periodLength":4}]}} diff --git a/tests/fixtures/wk3-paired/tianjin/manifest.json b/tests/fixtures/wk3-paired/tianjin/manifest.json new file mode 100644 index 00000000..f8ddb6de --- /dev/null +++ b/tests/fixtures/wk3-paired/tianjin/manifest.json @@ -0,0 +1,82 @@ +{ + "schema": "lib-rc-3.0.0-b66", + "public_test_location": "tianjin public city centre (not device location)", + "responses": [ + { + "file": "apple.json", + "started": 1794569484.057322, + "finished": 1794569484.268827, + "status": 200, + "content_type": "application/json", + "bytes": 50569 + }, + { + "file": "apple.bin", + "started": 1794569484.057463, + "finished": 1794569484.256683, + "status": 200, + "content_type": "application/vnd.apple.flatbuffer;messageType=WK3.Weather", + "bytes": 10160 + } + ], + "sanitization": { + "coordinate_fields": [ + { + "root_slot": 0, + "latitude_offset": 10032, + "longitude_offset": 10028 + }, + { + "root_slot": 1, + "latitude_offset": 9684, + "longitude_offset": 9680 + }, + { + "root_slot": 2, + "latitude_offset": 9308, + "longitude_offset": 9304 + }, + { + "root_slot": 3, + "latitude_offset": 4368, + "longitude_offset": 4364 + }, + { + "root_slot": 4, + "latitude_offset": 1576, + "longitude_offset": 1572 + }, + { + "root_slot": 6, + "latitude_offset": 184, + "longitude_offset": 180 + }, + { + "root_slot": 7, + "latitude_offset": 376, + "longitude_offset": 372 + }, + { + "root_slot": 9, + "latitude_offset": 516, + "longitude_offset": 512 + }, + { + "root_slot": 14, + "latitude_offset": 648, + "longitude_offset": 644 + } + ], + "coordinate_urls": 1, + "method": "Only vtable-validated Metadata latitude/longitude floats and same-length coordinate URL digits replaced. No re-encoding." + }, + "sha256": { + "apple.json": "6265de605b8c576f9522fc8500e0fbb1e306b7c8b630f7742171f000f9b65952", + "apple.bin": "0b283195ef9d51d4e79e6126b63ceacb695cf31352aa325b2c1f58f1aab2181c" + }, + "schema_source": { + "weatherkit_dev": "cd9d7927094aff79906fe3430f339f39970ca46e", + "protocol_tag": "v2.0.5", + "protocol_commit": "c87c1dcd851ea9293141bcfb32fde1b2cca564b9" + } +} diff --git a/tests/weatherKit3Paired.test.mjs b/tests/weatherKit3Paired.test.mjs new file mode 100644 index 00000000..820c8f43 --- /dev/null +++ b/tests/weatherKit3Paired.test.mjs @@ -0,0 +1,48 @@ +import assert from "node:assert/strict"; +import { createHash } from "node:crypto"; +import fs from "node:fs"; +import test from "node:test"; +import { comparePair } from "../scripts/compare-wk3-pair.mjs"; + +for (const city of ["hangzhou", "tianjin", "seattle", "seattle-repeat"]) { + test(`27.3 paired ${city}: current schema agrees with the raw Apple fields apart from recorded gaps`, () => { + const dir = new URL(`./fixtures/wk3-paired/${city}/`, import.meta.url); + const result = comparePair(dir.pathname); + assert.deepEqual(result.failures, []); + assert.equal( + result.rows.some(row => row.reason.startsWith("值不一致") || row.reason === "缺字段:当前 codec 未输出此字段"), + false, + ); + const metadata = JSON.parse(fs.readFileSync(new URL("manifest.json", dir))); + assert.ok(Math.abs(metadata.responses[0].started - metadata.responses[1].started) < 0.002); + for (const [file, expected] of Object.entries(metadata.sha256)) + assert.equal( + createHash("sha256") + .update(fs.readFileSync(new URL(file, dir))) + .digest("hex"), + expected, + ); + const apple = JSON.parse(fs.readFileSync(new URL("apple.json", dir))); + for (const product of Object.values(apple)) + if (product.metadata) { + assert.equal(product.metadata.latitude, 0); + assert.equal(product.metadata.longitude, 0); + } + assert.equal(result.decoded.airQuality.metadata.expireTime, result.raw.aqExpiry); + assert.equal(result.rows.filter(row => !row.equal && row.reason.includes("deprecated")).length, city.startsWith("seattle") ? 1 : 0); + if (city === "seattle") { + assert.equal(result.raw.minuteCount, 81); + assert.equal(result.decoded.forecastNextHour.forecastEnd, apple.forecastNextHour.forecastEnd); + assert.equal(result.decoded.weatherAlerts.alerts.length, 1); + assert.equal(result.decoded.weatherAlerts.alerts[0].severity, "MINOR"); + assert.equal(result.decoded.weatherAlerts.alerts[0].importance, "LOW"); + assert.deepEqual(result.decoded.weatherAlerts.alerts[0].responses, ["MONITOR"]); + } + if (city === "seattle-repeat") { + assert.equal(apple.forecastNextHour.minutes.length, 82); + assert.equal(result.raw.minuteCount, 84); + assert.equal(result.raw.reportedTime - apple.forecastNextHour.metadata.reportedTime, 120); + assert.equal(result.raw.forecastEnd - apple.forecastNextHour.forecastEnd, 120); + } + }); +} From fe1b6d626dbf1fa92722bd0c90b58ce71f0f6b06 Mon Sep 17 00:00:00 2001 From: hhh2210 Date: Sat, 14 Nov 2026 17:29:03 +0800 Subject: [PATCH 6/8] =?UTF-8?q?test(wk3):=20=E9=AA=8C=E8=AF=81=20JSON=20?= =?UTF-8?q?=E4=BC=98=E5=85=88=E5=B9=B6=E8=A1=94=E6=8E=A5=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=20codec?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/wk3-paired-validation.md | 23 ++++++++++++++++------- docs/wk3-weather-json.md | 19 +++++++++++++++++++ scripts/compare-wk3-pair.mjs | 3 ++- tests/weatherKit3JSON.test.mjs | 18 ++++++++++++------ tests/weatherKit3Paired.test.mjs | 8 ++++++-- 5 files changed, 55 insertions(+), 16 deletions(-) diff --git a/docs/wk3-paired-validation.md b/docs/wk3-paired-validation.md index 84dad152..52c6d022 100644 --- a/docs/wk3-paired-validation.md +++ b/docs/wk3-paired-validation.md @@ -1,10 +1,19 @@ -# 27.3 JSON / FlatBuffer 成对验证 +# 27.3 JSON / FlatBuffer 成对验证(2026-11-13 基线) 2026-11-13,macOS 27.3 (26C5035r)。杭州、天津、西雅图及西雅图复测共四组, 每组同 URL / 地点 / 请求参数,仅改变 Accept;启动差小于 2 ms。 -抓取时旁路改写,恢复后继续使用 WK3 Preview。使用当前 dev 的三个产品 codec +抓取时旁路改写,恢复后继续使用 WK3 Preview。使用当时 dev 的三个产品 codec 解码,并独立读取原始 vtable 的时间整数与分钟向量长度。 +## 后续进展(2026-11-14) + +下表记录 v2.0.5 局部 schema 的基线结果。后续 +[apple.WeatherKit #1](https://github.com/NSRingo/apple.WeatherKit/pull/1) 已定义 15 个根产品, +并根据原生访问器把分钟摘要 condition 补为 UInt8 向量; +[WeatherKit #111](https://github.com/NSRingo/WeatherKit/pull/111) 已接入三类天气替换。 +这些基线缺项不再代表新 codec 的现状。成对测试同时支持局部 schema 和完整 schema: +有 condition 访问器时必须逐值对齐,不再期待 deprecated 缺项。 + ## 结果 | 样本 | 完整字段行数 | 已对齐 | 当前产品 codec 缺失 | 摘要 condition 缺失 | 返回值/版本差异 | @@ -38,15 +47,15 @@ 列为字段名、JSON 值、FlatBuffer 解码值、是否一致及原因,并带样本名。 四组成对脱敏响应和 SHA-256 已存入 `tests/fixtures/wk3-paired/`,可重复生成表格。 -## 已定位与下一步 +## 基线问题与处理状态 - cloudCover 在彩云 provider 边界修正为百分比,覆盖小时与日间/夜间预报; 0.5 → 50、0.8 → 80,回归另覆盖 0、0.005、1。 - 三个已实现产品中,样本内的枚举和单位标签逐项对齐;发现的时间差直接存在于原始 整数中。复测的 reportedTime 和 forecastEnd 同时相差 120 秒,记录为不同产品版本, 不归因于枚举或单位换算。 -- 要输出分钟摘要 condition,需要在协议包补充槽 2 的向量定义和读取器;当前样本是 - 单元素 CLEAR,确定元素宽度还需多元素摘要样本。 -- 要解码当前/逐日/逐小时等其余产品,需要在协议包定义其表和 codec,再用本组样本 - 重跑全字段表。当前 8110 项记录为 schema/codec 缺项。 +- 分钟摘要 condition 已在协议包 PR 补为 UInt8 向量,依据原生向量访问器的单字节寻址, + 并用独立 flatc 写出的多元素向量做回归。 +- 当前/逐日/逐小时等其余产品已在协议包 PR 定义并完成成对样本解码和往返; + 本报告的 8110 项保留为原始基线记录,完整 codec 验证见协议包 PR。 - 当前分钟雨样本的雨强为零;检验非零雨强数值换算,需要追加正在降雨地区的原始成对样本。 diff --git a/docs/wk3-weather-json.md b/docs/wk3-weather-json.md index b40ebfb4..cafbaf8f 100644 --- a/docs/wk3-weather-json.md +++ b/docs/wk3-weather-json.md @@ -21,6 +21,25 @@ 表示适配依据 [PR #107 的固定版本与原生观察](https://github.com/hhhoratioxu/WeatherKit/blob/355b5f5dad9d01cb13167949f8334a489b301811/docs/loon-v3-compatibility.md)。 派生代码保留作者及 Apache-2.0 声明;未引入该 PR 的缓存、备用来源、地理判定和算法重构。 +## 与协议包和二进制接入的分工 + +三项改动组成同一条请求/响应链: + +| 层次 | PR | 职责 | +| --- | --- | --- | +| 协议模型 | [apple.WeatherKit #1](https://github.com/NSRingo/apple.WeatherKit/pull/1) | 提供 WK3 Schema/Codec,不决定客户端路由 | +| JSON 协商和处理 | [WeatherKit #110](https://github.com/NSRingo/WeatherKit/pull/110) | 符合设置的主 App 请求协商 JSON,JSON 响应复用注入函数 | +| FlatBuffer 响应处理 | [WeatherKit #111](https://github.com/NSRingo/WeatherKit/pull/111) | 对实际返回的 FlatBuffer 调用 Codec,保留其他产品的原始数据 | + +两条响应路径按 Content-Type 分流。JSON 分支返回后不会进入二进制分支,也不会为同一 +产品重复请求供应商。回归在正常 Request → Response 调用中检查 Accept=application/json、 +二进制 decode/encode 均未调用、每种供应商产品只调用一次。 + +#110 可独立合并;#1 发布后,#111 更新协议依赖并合并。建议继续以本 PR 的 JSON 协商 +作为主 App 默认路径,由维护者确认长期策略。#111 中主 App 的二进制实测是专用模块下的 +codec 兼容性验收,不改变正常路由。新增 JSON 客户端只需扩展本 PR 的协商边界及验收, +无需修改协议包或维护第二份供应商逻辑。 + ## 验证 ```sh diff --git a/scripts/compare-wk3-pair.mjs b/scripts/compare-wk3-pair.mjs index c2bfea74..ad808682 100644 --- a/scripts/compare-wk3-pair.mjs +++ b/scripts/compare-wk3-pair.mjs @@ -8,6 +8,7 @@ globalThis.$persistentStore ??= { read: () => null, write: () => true }; const { Console } = await import("@nsnanocat/util"); Console.logLevel = "OFF"; const { default: WeatherKit3 } = await import("../src/class/WeatherKit3.mjs"); +// Retain the original three-product baseline; full-schema coverage lives in apple.WeatherKit. const supported = ["airQuality", "forecastNextHour", "weatherAlerts"]; const missing = ""; const floatFields = new Set(["latitude", "longitude", "amount", "precipitationIntensity", "perceivedPrecipitationIntensity"]); @@ -53,7 +54,7 @@ export function comparePair(directory) { let equal = JSON.stringify(x) === JSON.stringify(y), reason = equal ? "一致" : "值不一致:需定位单位/枚举/偏移"; const root = field.split(/[.[]/)[0]; - if (!supported.includes(root)) reason = "缺字段:当前 dev 未实现该产品的 WK3 codec"; + if (!supported.includes(root)) reason = "基线范围:该产品未纳入本脚本的三个产品比较"; else if (floatFields.has(field.split(".").at(-1)) && typeof x === "number" && typeof y === "number" && Math.fround(x) === Math.fround(y)) { equal = true; reason = x === y ? "一致" : "一致:JSON 十进制与 float32 表示精度"; diff --git a/tests/weatherKit3JSON.test.mjs b/tests/weatherKit3JSON.test.mjs index 673e4fc4..f195264f 100644 --- a/tests/weatherKit3JSON.test.mjs +++ b/tests/weatherKit3JSON.test.mjs @@ -5,9 +5,10 @@ globalThis.$environment = { "surge-version": "test" }; globalThis.$persistentStore = { read: () => null, write: () => true }; globalThis.$argument = { LogLevel: "OFF", Storage: "Argument" }; -const [{ Request }, { Response }, { default: ColorfulClouds }, { default: QWeather }, { adaptWeatherKit3JSON, replaceWeatherKit3JSON }] = await Promise.all([ +const [{ Request }, { Response }, { default: WeatherKit3 }, { default: ColorfulClouds }, { default: QWeather }, { adaptWeatherKit3JSON, replaceWeatherKit3JSON }] = await Promise.all([ import("../src/process/Request.dev.mjs"), import("../src/process/Response.dev.mjs"), + import("../src/class/WeatherKit3.mjs"), import("../src/class/ColorfulClouds.mjs"), import("../src/class/QWeather.mjs"), import("../src/function/weatherKit3JSON.mjs"), @@ -101,12 +102,17 @@ test("JSON negotiation is restricted by client, version, method, country, provid assert.equal((await Request(input)).$request.headers.Accept, "application/json"); }); -test("WK3 JSON reuses Caiyun current, daily and hourly replacements and preserves other roots", async t => { - t.mock.method(ColorfulClouds.prototype, "CurrentWeather", async () => ({ metadata: { providerName: "彩云天气" }, temperature: 27, humidity: 65.4, conditionCode: "CLEAR" })); - t.mock.method(ColorfulClouds.prototype, "Daily", async () => ({ metadata: { providerName: "彩云天气" }, days: [{ forecastStart: time, temperatureMax: 30, conditionCode: "CLEAR" }] })); - t.mock.method(ColorfulClouds.prototype, "ForecastHourly", async () => ({ metadata: { providerName: "彩云天气" }, hours: [{ forecastStart: time, temperature: 28, conditionCode: "CLEAR" }] })); +test("WK3 JSON reuses Caiyun once per product without entering the binary codec", async t => { + t.mock.method(WeatherKit3, "decodeWithReport", () => assert.fail("negotiated JSON must not enter the FlatBuffer decoder")); + t.mock.method(WeatherKit3, "encode", () => assert.fail("negotiated JSON must not enter the FlatBuffer encoder")); + const now = t.mock.method(ColorfulClouds.prototype, "CurrentWeather", async () => ({ metadata: { providerName: "彩云天气" }, temperature: 27, humidity: 65.4, conditionCode: "CLEAR" })); + const daily = t.mock.method(ColorfulClouds.prototype, "Daily", async () => ({ metadata: { providerName: "彩云天气" }, days: [{ forecastStart: time, temperatureMax: 30, conditionCode: "CLEAR" }] })); + const hourly = t.mock.method(ColorfulClouds.prototype, "ForecastHourly", async () => ({ metadata: { providerName: "彩云天气" }, hours: [{ forecastStart: time, temperature: 28, conditionCode: "CLEAR" }] })); const input = response(); - const output = await Response(request(), input); + const outgoing = (await Request(request())).$request; + assert.equal(outgoing.headers.Accept, "application/json"); + const output = await Response(outgoing, input); + for (const provider of [now, daily, hourly]) assert.equal(provider.mock.callCount(), 1); const body = JSON.parse(output.body); assert.equal(body.currentWeather.temperature, 27); assert.equal(body.currentWeather.humidity, 65); diff --git a/tests/weatherKit3Paired.test.mjs b/tests/weatherKit3Paired.test.mjs index 820c8f43..3a4859ee 100644 --- a/tests/weatherKit3Paired.test.mjs +++ b/tests/weatherKit3Paired.test.mjs @@ -2,10 +2,11 @@ import assert from "node:assert/strict"; import { createHash } from "node:crypto"; import fs from "node:fs"; import test from "node:test"; +import { WK3 } from "@nsringo/weatherkit"; import { comparePair } from "../scripts/compare-wk3-pair.mjs"; for (const city of ["hangzhou", "tianjin", "seattle", "seattle-repeat"]) { - test(`27.3 paired ${city}: current schema agrees with the raw Apple fields apart from recorded gaps`, () => { + test(`27.3 paired ${city}: baseline products agree with the raw Apple fields apart from recorded gaps`, () => { const dir = new URL(`./fixtures/wk3-paired/${city}/`, import.meta.url); const result = comparePair(dir.pathname); assert.deepEqual(result.failures, []); @@ -29,7 +30,10 @@ for (const city of ["hangzhou", "tianjin", "seattle", "seattle-repeat"]) { assert.equal(product.metadata.longitude, 0); } assert.equal(result.decoded.airQuality.metadata.expireTime, result.raw.aqExpiry); - assert.equal(result.rows.filter(row => !row.equal && row.reason.includes("deprecated")).length, city.startsWith("seattle") ? 1 : 0); + const hasSummaryCondition = typeof WK3.ForecastPeriodSummary.prototype.condition === "function"; + assert.equal(result.rows.filter(row => !row.equal && row.reason.includes("deprecated")).length, !hasSummaryCondition && city.startsWith("seattle") ? 1 : 0); + if (hasSummaryCondition && city.startsWith("seattle")) + assert.deepEqual(result.decoded.forecastNextHour.summary.map(item => item.condition), apple.forecastNextHour.summary.map(item => item.condition)); if (city === "seattle") { assert.equal(result.raw.minuteCount, 81); assert.equal(result.decoded.forecastNextHour.forecastEnd, apple.forecastNextHour.forecastEnd); From 6e68f0effb12310990791b01aca6bb61dfcecffb Mon Sep 17 00:00:00 2001 From: hhh2210 Date: Sat, 14 Nov 2026 18:14:22 +0800 Subject: [PATCH 7/8] test(wk3): redact attribution coordinates and alert tokens --- tests/fixtures/wk3-paired/README.md | 4 ++++ .../wk3-paired/seattle-repeat/apple.bin | Bin 13820 -> 13820 bytes .../wk3-paired/seattle-repeat/apple.json | 2 +- .../wk3-paired/seattle-repeat/manifest.json | 18 +++++++++++++++--- tests/fixtures/wk3-paired/seattle/apple.bin | Bin 13784 -> 13784 bytes tests/fixtures/wk3-paired/seattle/apple.json | 2 +- .../fixtures/wk3-paired/seattle/manifest.json | 18 +++++++++++++++--- 7 files changed, 36 insertions(+), 8 deletions(-) diff --git a/tests/fixtures/wk3-paired/README.md b/tests/fixtures/wk3-paired/README.md index 3ac9ea87..0bed8b0b 100644 --- a/tests/fixtures/wk3-paired/README.md +++ b/tests/fixtures/wk3-paired/README.md @@ -34,3 +34,7 @@ equal, reason), decoded JSON and summary counts. Pollutants are keyed by species because the two formats return them in opposite orders. Float32 equivalence is used only for schema float fields, never timestamps; UUIDs and omitted defaults have explicit comparison rules. Integer mismatches are checked against direct vtable reads. + +Additional audit: the Seattle attribution URL coordinates and alert tokens are +redacted in JSON and in-place in the binary. Each manifest records the modified +string byte ranges and updated SHA-256 hashes. diff --git a/tests/fixtures/wk3-paired/seattle-repeat/apple.bin b/tests/fixtures/wk3-paired/seattle-repeat/apple.bin index acdda2fd44aa0e3e1fa8065589e3921125df224b..9ef661b80da4f3c541aee49f6e0dc23470ef0f7c 100644 GIT binary patch delta 70 zcmey9{U>`v0<&0`v0<)O2zhiKSqffk>kH5c5yrWB)XRv=z8u ZBO^UyV1^`Eb7GMAX diff --git a/tests/fixtures/wk3-paired/seattle-repeat/apple.json b/tests/fixtures/wk3-paired/seattle-repeat/apple.json index a3fcf266..f2386971 100644 --- a/tests/fixtures/wk3-paired/seattle-repeat/apple.json +++ b/tests/fixtures/wk3-paired/seattle-repeat/apple.json @@ -1 +1 @@ -{"news":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"APPLE_INTERNAL","reportedTime":1794569673},"placements":[{"priority":2,"articles":[{"id":"A6ajisfZkSH-TzT_j18WQJQ","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How the UV index helps you know when it’s safe to have fun in the sun","alertIds":[]}],"placement":["UV_DETAILS"]},{"priority":2,"articles":[{"id":"AxDHjEelNRh-tGqDejqtusw","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How to prepare and stay safe if high winds are in your forecast","alertIds":[]}],"placement":["WIND_DETAILS"]},{"priority":2,"articles":[{"id":"A2uodtK8zT8qsl9ZTqOSsuw","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How to use the air quality index to protect yourself from pollution and smoke","alertIds":[]}],"placement":["AIR_QUALITY_DETAILS"]}]},"airQuality":{"metadata":{"latitude":0,"longitude":0,"expireTime":1794571287,"sourceType":"MODELED","attributionUrl":"https://dynamic-link.breezometer.com/?lat=47.606&lon=-122.332&partner=apple","readTime":1794569673,"temporarilyUnavailable":false,"providerName":"BreezoMeter","reportedTime":1794567600},"index":59,"pollutants":[{"amount":5.0,"units":"PARTS_PER_BILLION","pollutantType":"OZONE"},{"amount":14.707169,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"PM2_5"},{"amount":32.544106,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"PM10"},{"amount":300.0,"units":"PARTS_PER_BILLION","pollutantType":"CO"},{"amount":24.375298,"units":"PARTS_PER_BILLION","pollutantType":"NO2"},{"amount":5.560594,"units":"PARTS_PER_BILLION","pollutantType":"NO"},{"amount":0.8,"units":"PARTS_PER_BILLION","pollutantType":"SO2"},{"amount":23.047903,"units":"PARTS_PER_BILLION","pollutantType":"NOX"}],"scale":"EPA_NowCast.2604","primaryPollutant":"PM2_5","previousDayComparison":"SAME","categoryIndex":2,"isSignificant":false},"currentWeather":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794569973,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794569673},"daylight":false,"humidity":84,"pressure":992.896606,"temperature":11.151289,"visibility":20750.910156,"asOf":1794569673,"precipitationIntensity":0.0,"temperatureDewPoint":8.548309,"windGust":10.370301,"temperatureApparent":10.537592,"snowfallAmountPrevious6h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"snowfallAmountPrevious24h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountNext6hByType":[],"snowfallAmountNext24h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountPrevious6hByType":[],"snowfallAmountPrevious1h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"pressureTrend":"FALLING","windDirection":94,"windSpeed":7.099107,"cloudCoverLowAltPct":3,"perceivedPrecipitationIntensity":0.0,"precipitationAmountPrevious1hByType":[],"cloudCover":84,"precipitationAmountNext1hByType":[],"snowfallAmountNext1h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountPrevious24hByType":[],"cloudCoverMidAltPct":86,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":97,"snowfallAmountNext6h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"uvIndex":0,"precipitationAmountNext24hByType":[{"expected":5.984974,"minimum":5.984974,"maximum":5.984974,"precipitationType":["RAIN"]}]},"weatherChanges":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"changes":[{"forecastEnd":1794729600,"maxTemperatureChange":"STEADY","forecastStart":1794643200,"minTemperatureChange":"STEADY","dayPrecipitationChange":"DEC","nightPrecipitationChange":"INC"},{"forecastEnd":1794816000,"maxTemperatureChange":"STEADY","forecastStart":1794729600,"minTemperatureChange":"STEADY","dayPrecipitationChange":"INC","nightPrecipitationChange":"DEC"}],"forecastEnd":1794816000,"forecastStart":1794643200},"weatherAlerts":{"metadata":{"language":"en","latitude":0,"longitude":0,"expireTime":1794569973,"sourceType":"STATION","attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"temporarilyUnavailable":false,"providerName":"National Weather Service","reportedTime":1794538320},"alerts":[{"id":{"bytes":[190,12,153,147,104,54,83,236,165,44,137,30,51,142,238,251]},"description":"Coastal Flood Advisory","token":"COASTAL_FLOOD_ADVISORY","phenomenon":"Flood","severity":"MINOR","significance":"ADVISORY","source":"National Weather Service","urgency":"EXPECTED","certainty":"LIKELY","importance":"LOW","responses":["MONITOR"],"eventOnsetTime":1794578400,"detailsUrl":"https://weatherkit.apple.com/alertDetails/index.html?ids=be0c9993-6836-53ec-a52c-891e338eeefb&lang=en-US&timezone=America/Los_Angeles&party=apple","effectiveTime":1794538320,"issuedTime":1794538320,"eventSource":"US","areaId":"waz315","expireTime":1794574800,"countryCode":"US","eventEndTime":1794600000,"attributionUrl":"https://www.weather.gov"}],"detailsUrl":"https://weatherkit.apple.com/alertDetails/index.html?ids=be0c9993-6836-53ec-a52c-891e338eeefb&lang=en-US&timezone=America/Los_Angeles&party=apple"},"historicalComparisons":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"comparisons":[{"condition":"TEMPERATURE_MAX","deviation":"NORMAL","baselineValue":10.839996,"baselineStartDate":0,"currentValue":13.64015,"baselineType":"MEAN"},{"condition":"PRECIPITATION","deviation":"NORMAL","baselineValue":0.0,"baselineStartDate":0,"currentValue":0.0,"baselineType":"MEAN"}]},"forecastDaily":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"days":[{"moonrise":1794598874,"moonset":1794627382,"sunrise":1794582705,"sunset":1794616505,"forecastEnd":1794643200,"sunriseCivil":1794580706,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"solarMidnight":1794642825,"windSpeedAvg":9.337426,"temperatureMaxTime":1794585564,"windGustSpeedMax":36.504002,"sunriseAstronomical":1794576293,"forecastStart":1794556800,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":5.652,"minimum":5.652,"maximum":5.652,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794622910,"visibilityMax":34072.0,"precipitationChance":86,"temperatureMin":9.91,"maxUvIndex":1,"temperatureMinTime":1794643200,"sunsetNautical":1794620737,"daytimeForecast":{"humidity":83,"daylight":true,"forecastEnd":1794625200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":9.132,"windGustSpeedMax":32.810402,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":11.529953,"forecastStart":1794582000,"windDirection":181,"windSpeed":10.008599,"humidityMax":90,"precipitationAmountByType":[{"expected":5.455,"minimum":5.455,"maximum":5.455,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":53,"visibilityMax":34072.0,"cloudCover":99,"precipitationChance":79,"temperatureMin":10.49,"cloudCoverMidAltPct":94,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":76,"humidityMin":70,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":15.263999},"conditionCode":["RAIN"],"humidityMin":70,"solarNoon":1794599599,"visibilityMin":6167.0,"overnightForecast":{"humidity":86,"daylight":false,"forecastEnd":1794668400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.49,"uvIndexMin":0,"temperatureApparentMin":5.112798,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":0.549,"uvIndexMax":0,"temperatureApparentMax":10.093671,"forecastStart":1794625200,"windDirection":183,"windSpeed":13.7466,"humidityMax":89,"precipitationAmountByType":[{"expected":0.71,"minimum":0.71,"maximum":0.71,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":49,"visibilityMax":28703.0,"cloudCover":74,"precipitationChance":65,"temperatureMin":9.009192,"cloudCoverMidAltPct":49,"precipitationIntensityMax":0.234,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":31,"humidityMin":82,"visibilityMin":16190.0,"precipitationType":["RAIN"],"windSpeedMax":16.65},"precipitationType":["RAIN"],"sunriseNautical":1794578462,"sunsetCivil":1794618498,"windSpeedMax":16.254,"restOfDayForecast":{"humidity":83,"daylight":false,"forecastEnd":1794643200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":5.957533,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":11.864366,"forecastStart":1794569673,"windDirection":171,"windSpeed":10.008805,"humidityMax":90,"precipitationAmountByType":[{"expected":5.652,"minimum":5.652,"maximum":5.652,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":42,"visibilityMax":34072.0,"cloudCover":95,"precipitationChance":84,"temperatureMin":9.91,"cloudCoverMidAltPct":84,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":76,"humidityMin":70,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":16.254}},{"moonrise":1794687261,"moonset":1794717746,"sunrise":1794669195,"sunset":1794702834,"forecastEnd":1794729600,"sunriseCivil":1794667189,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.170017,"solarMidnight":1794729234,"windSpeedAvg":13.5183,"temperatureMaxTime":1794689975,"windGustSpeedMax":36.504002,"sunriseAstronomical":1794662769,"forecastStart":1794643200,"moonPhase":"WAXING_CRESCENT","humidityMax":88,"precipitationAmountByType":[{"expected":5.55,"minimum":5.55,"maximum":5.55,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794709253,"visibilityMax":29373.0,"precipitationChance":85,"temperatureMin":9.009192,"maxUvIndex":1,"temperatureMinTime":1794668269,"sunsetNautical":1794707078,"daytimeForecast":{"humidity":79,"daylight":true,"forecastEnd":1794711600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.170017,"uvIndexMin":0,"temperatureApparentMin":5.696423,"windGustSpeedMax":33.551998,"perceivedPrecipitationIntensityMax":0.503,"uvIndexMax":1,"temperatureApparentMax":9.767292,"forecastStart":1794668400,"windDirection":166,"windSpeed":13.39695,"humidityMax":86,"precipitationAmountByType":[{"expected":0.96,"minimum":0.96,"maximum":0.96,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":59,"visibilityMax":29373.0,"cloudCover":89,"precipitationChance":55,"temperatureMin":9.01,"cloudCoverMidAltPct":72,"precipitationIntensityMax":0.194,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":64,"humidityMin":76,"visibilityMin":15078.0,"precipitationType":["RAIN"],"windSpeedMax":14.860799},"conditionCode":["RAIN"],"humidityMin":76,"solarNoon":1794686008,"visibilityMin":4069.0,"overnightForecast":{"humidity":84,"daylight":false,"forecastEnd":1794754800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.48,"uvIndexMin":0,"temperatureApparentMin":5.973359,"windGustSpeedMax":38.952,"perceivedPrecipitationIntensityMax":1.473,"uvIndexMax":0,"temperatureApparentMax":9.430315,"forecastStart":1794711600,"windDirection":155,"windSpeed":14.398049,"humidityMax":88,"precipitationAmountByType":[{"expected":8.279,"minimum":8.279,"maximum":8.279,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":67,"visibilityMax":25393.0,"cloudCover":94,"precipitationChance":87,"temperatureMin":10.038711,"cloudCoverMidAltPct":84,"precipitationIntensityMax":2.419,"conditionCode":["RAIN"],"cloudCoverHighAltPct":31,"humidityMin":78,"visibilityMin":4069.0,"precipitationType":["RAIN"],"windSpeedMax":17.780401},"precipitationType":["RAIN"],"sunriseNautical":1794664941,"sunsetCivil":1794704834,"windSpeedMax":16.65},{"moonrise":1794775225,"moonset":1794808239,"sunrise":1794755684,"sunset":1794789166,"forecastEnd":1794816000,"sunriseCivil":1794753672,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.499799,"solarMidnight":1794815645,"windSpeedAvg":13.973175,"temperatureMaxTime":1794775537,"windGustSpeedMax":38.952,"sunriseAstronomical":1794749245,"forecastStart":1794729600,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":7.270999,"minimum":7.270999,"maximum":7.270999,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794795599,"visibilityMax":27960.0,"precipitationChance":94,"temperatureMin":7.48,"maxUvIndex":1,"temperatureMinTime":1794816000,"sunsetNautical":1794793421,"daytimeForecast":{"humidity":79,"daylight":true,"forecastEnd":1794798000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.499799,"uvIndexMin":0,"temperatureApparentMin":5.879239,"windGustSpeedMax":35.748001,"perceivedPrecipitationIntensityMax":0.775,"uvIndexMax":1,"temperatureApparentMax":9.362825,"forecastStart":1794754800,"windDirection":199,"windSpeed":15.284551,"humidityMax":86,"precipitationAmountByType":[{"expected":3.041,"minimum":3.041,"maximum":3.041,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":37,"visibilityMax":27960.0,"cloudCover":64,"precipitationChance":79,"temperatureMin":9.24,"cloudCoverMidAltPct":53,"precipitationIntensityMax":0.499,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":0,"humidityMin":73,"visibilityMin":13909.0,"precipitationType":["RAIN"],"windSpeedMax":18.6192},"conditionCode":["RAIN"],"humidityMin":73,"solarNoon":1794772418,"visibilityMin":7974.0,"overnightForecast":{"humidity":89,"daylight":false,"forecastEnd":1794841200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.24,"uvIndexMin":0,"temperatureApparentMin":4.984706,"windGustSpeedMax":20.1276,"perceivedPrecipitationIntensityMax":1.093,"uvIndexMax":0,"temperatureApparentMax":8.094274,"forecastStart":1794798000,"windDirection":167,"windSpeed":7.06065,"humidityMax":90,"precipitationAmountByType":[{"expected":2.986,"minimum":2.986,"maximum":2.986,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":36,"visibilityMax":26518.0,"cloudCover":63,"precipitationChance":51,"temperatureMin":6.209458,"cloudCoverMidAltPct":37,"precipitationIntensityMax":1.117,"conditionCode":["RAIN"],"cloudCoverHighAltPct":4,"humidityMin":83,"visibilityMin":16329.0,"precipitationType":["RAIN"],"windSpeedMax":8.186399},"precipitationType":["RAIN"],"sunriseNautical":1794751419,"sunsetCivil":1794791172,"windSpeedMax":18.6192},{"moonrise":1794862879,"moonset":1794898770,"sunrise":1794842173,"sunset":1794875500,"forecastEnd":1794902400,"sunriseCivil":1794840154,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.921954,"solarMidnight":1794902056,"windSpeedAvg":8.8203,"temperatureMaxTime":1794864861,"windGustSpeedMax":25.909199,"sunriseAstronomical":1794835720,"forecastStart":1794816000,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":4.384,"minimum":4.384,"maximum":4.384,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794881947,"visibilityMax":31734.0,"precipitationChance":67,"temperatureMin":6.209458,"maxUvIndex":1,"temperatureMinTime":1794840092,"sunsetNautical":1794879767,"daytimeForecast":{"humidity":80,"daylight":true,"forecastEnd":1794884400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.921954,"uvIndexMin":0,"temperatureApparentMin":5.026797,"windGustSpeedMax":25.909199,"perceivedPrecipitationIntensityMax":0.808,"uvIndexMax":1,"temperatureApparentMax":10.102699,"forecastStart":1794841200,"windDirection":182,"windSpeed":9.35655,"humidityMax":90,"precipitationAmountByType":[{"expected":0.895,"minimum":0.895,"maximum":0.895,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":45,"visibilityMax":31734.0,"cloudCover":73,"precipitationChance":36,"temperatureMin":6.24,"cloudCoverMidAltPct":57,"precipitationIntensityMax":0.548,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":16,"humidityMin":73,"visibilityMin":16596.0,"precipitationType":["RAIN"],"windSpeedMax":12.225599},"conditionCode":["RAIN"],"humidityMin":73,"solarNoon":1794858830,"visibilityMin":16329.0,"overnightForecast":{"humidity":88,"daylight":false,"forecastEnd":1794927600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.71,"uvIndexMin":0,"temperatureApparentMin":4.863145,"windGustSpeedMax":25.909199,"perceivedPrecipitationIntensityMax":0.751,"uvIndexMax":0,"temperatureApparentMax":6.049259,"forecastStart":1794884400,"windDirection":169,"windSpeed":8.89755,"humidityMax":89,"precipitationAmountByType":[{"expected":0.568,"minimum":0.568,"maximum":0.568,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":56,"visibilityMax":28122.0,"cloudCover":60,"precipitationChance":50,"temperatureMin":5.989975,"cloudCoverMidAltPct":7,"precipitationIntensityMax":0.465,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":1,"humidityMin":85,"visibilityMin":16596.0,"precipitationType":["RAIN"],"windSpeedMax":11.7612},"precipitationType":["RAIN"],"sunriseNautical":1794837897,"sunsetCivil":1794877511,"windSpeedMax":12.225599},{"moonrise":1794950358,"sunrise":1794928662,"sunset":1794961836,"forecastEnd":1794988800,"sunriseCivil":1794926635,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.845637,"solarMidnight":1794988468,"windSpeedAvg":6.440775,"temperatureMaxTime":1794953467,"windGustSpeedMax":18.273602,"sunriseAstronomical":1794922194,"forecastStart":1794902400,"moonPhase":"FIRST_QUARTER","humidityMax":89,"precipitationAmountByType":[{"expected":0.341,"minimum":0.341,"maximum":0.341,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794968297,"visibilityMax":29733.0,"precipitationChance":53,"temperatureMin":5.98,"maxUvIndex":1,"temperatureMinTime":1794988800,"sunsetNautical":1794966114,"daytimeForecast":{"humidity":72,"daylight":true,"forecastEnd":1794970800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.845637,"uvIndexMin":0,"temperatureApparentMin":5.082117,"windGustSpeedMax":17.006401,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":12.097757,"forecastStart":1794927600,"windDirection":154,"windSpeed":5.87355,"humidityMax":87,"precipitationAmountByType":[],"cloudCoverLowAltPct":15,"visibilityMax":29733.0,"cloudCover":29,"precipitationChance":0,"temperatureMin":6.13,"cloudCoverMidAltPct":1,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":6,"humidityMin":62,"visibilityMin":17780.0,"precipitationType":["CLEAR"],"windSpeedMax":7.1748},"conditionCode":["DRIZZLE"],"humidityMin":62,"solarNoon":1794945242,"visibilityMin":17780.0,"overnightForecast":{"humidity":82,"daylight":false,"forecastEnd":1795014000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.72,"uvIndexMin":0,"temperatureApparentMin":2.451838,"windGustSpeedMax":25.2936,"perceivedPrecipitationIntensityMax":0.95,"uvIndexMax":0,"temperatureApparentMax":7.151364,"forecastStart":1794970800,"windDirection":133,"windSpeed":7.62915,"humidityMax":89,"precipitationAmountByType":[{"expected":4.327,"minimum":4.327,"maximum":4.327,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":31,"visibilityMax":25857.0,"cloudCover":92,"precipitationChance":50,"temperatureMin":4.947516,"cloudCoverMidAltPct":66,"precipitationIntensityMax":0.798,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":89,"humidityMin":74,"visibilityMin":10859.0,"precipitationType":["RAIN"],"windSpeedMax":12.204},"precipitationType":["RAIN"],"sunriseNautical":1794924375,"sunsetCivil":1794963853,"windSpeedMax":8.9928},{"moonrise":1795037733,"moonset":1794989335,"sunrise":1795015150,"sunset":1795048175,"forecastEnd":1795075200,"sunriseCivil":1795013116,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.020019,"solarMidnight":1795074881,"windSpeedAvg":10.204425,"temperatureMaxTime":1795042826,"windGustSpeedMax":25.7724,"sunriseAstronomical":1795008667,"forecastStart":1794988800,"moonPhase":"WAXING_GIBBOUS","humidityMax":94,"precipitationAmountByType":[{"expected":6.641001,"minimum":6.641001,"maximum":6.641001,"precipitationType":["RAIN"]}],"sunsetAstronomical":1795054649,"visibilityMax":30421.0,"precipitationChance":74,"temperatureMin":4.947516,"maxUvIndex":1,"temperatureMinTime":1795009991,"sunsetNautical":1795052464,"daytimeForecast":{"humidity":81,"daylight":true,"forecastEnd":1795057200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.020019,"uvIndexMin":0,"temperatureApparentMin":2.416847,"windGustSpeedMax":25.7724,"perceivedPrecipitationIntensityMax":0.866,"uvIndexMax":1,"temperatureApparentMax":6.052989,"forecastStart":1795014000,"windDirection":182,"windSpeed":12.15015,"humidityMax":88,"precipitationAmountByType":[{"expected":2.276,"minimum":2.276,"maximum":2.276,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":60,"visibilityMax":30421.0,"cloudCover":82,"precipitationChance":66,"temperatureMin":5.11,"cloudCoverMidAltPct":76,"precipitationIntensityMax":0.643,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":50,"humidityMin":76,"visibilityMin":14677.0,"precipitationType":["RAIN"],"windSpeedMax":13.608},"conditionCode":["DRIZZLE"],"humidityMin":76,"solarNoon":1795031654,"visibilityMin":10859.0,"overnightForecast":{"humidity":92,"daylight":false,"forecastEnd":1795100400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.9,"uvIndexMin":0,"temperatureApparentMin":5.690445,"windGustSpeedMax":17.945999,"perceivedPrecipitationIntensityMax":0.327,"uvIndexMax":0,"temperatureApparentMax":6.35371,"forecastStart":1795057200,"windDirection":158,"windSpeed":5.645401,"humidityMax":95,"precipitationAmountByType":[{"expected":0.478,"minimum":0.478,"maximum":0.478,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":62,"visibilityMax":25229.0,"cloudCover":82,"precipitationChance":50,"temperatureMin":5.36,"cloudCoverMidAltPct":55,"precipitationIntensityMax":0.079,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":8,"humidityMin":82,"visibilityMin":12901.0,"precipitationType":["RAIN"],"windSpeedMax":9.774},"precipitationType":["RAIN"],"sunriseNautical":1795010851,"sunsetCivil":1795050198,"windSpeedMax":13.608},{"moonrise":1795125079,"moonset":1795079963,"sunrise":1795101637,"sunset":1795134515,"forecastEnd":1795161600,"sunriseCivil":1795099597,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.116987,"solarMidnight":1795161294,"windSpeedAvg":5.149725,"temperatureMaxTime":1795135920,"windGustSpeedMax":12.852,"sunriseAstronomical":1795095140,"forecastStart":1795075200,"moonPhase":"WAXING_GIBBOUS","humidityMax":96,"precipitationAmountByType":[{"expected":0.141,"minimum":0.141,"maximum":0.141,"precipitationType":["RAIN"]}],"sunsetAstronomical":1795141003,"visibilityMax":32204.0,"precipitationChance":53,"temperatureMin":5.36,"maxUvIndex":1,"temperatureMinTime":1795082400,"sunsetNautical":1795138815,"daytimeForecast":{"humidity":83,"daylight":true,"forecastEnd":1795143600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.116987,"uvIndexMin":0,"temperatureApparentMin":6.35371,"windGustSpeedMax":12.852,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":10.070161,"forecastStart":1795100400,"windDirection":4,"windSpeed":6.0135,"humidityMax":93,"precipitationAmountByType":[],"cloudCoverLowAltPct":44,"visibilityMax":32204.0,"cloudCover":63,"precipitationChance":0,"temperatureMin":6.03,"cloudCoverMidAltPct":2,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":0,"humidityMin":77,"visibilityMin":12901.0,"precipitationType":["CLEAR"],"windSpeedMax":7.8264},"conditionCode":["DRIZZLE"],"humidityMin":77,"solarNoon":1795118068,"visibilityMin":12901.0,"overnightForecast":{"humidity":94,"daylight":false,"forecastEnd":1795186800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.52,"uvIndexMin":0,"temperatureApparentMin":4.634763,"windGustSpeedMax":9.4392,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":8.422463,"forecastStart":1795143600,"windDirection":44,"windSpeed":3.7053,"humidityMax":97,"precipitationAmountByType":[],"cloudCoverLowAltPct":34,"visibilityMax":28680.0,"cloudCover":52,"precipitationChance":0,"temperatureMin":4.006788,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"humidityMin":85,"visibilityMin":9083.0,"precipitationType":["CLEAR"],"windSpeedMax":4.0212},"precipitationType":["RAIN"],"sunriseNautical":1795097328,"sunsetCivil":1795136544,"windSpeedMax":7.8264},{"moonrise":1795212479,"moonset":1795170725,"sunrise":1795188123,"sunset":1795220858,"forecastEnd":1795248000,"sunriseCivil":1795186076,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.763362,"solarMidnight":1795247709,"windSpeedAvg":4.930575,"temperatureMaxTime":1795216005,"windGustSpeedMax":14.482799,"sunriseAstronomical":1795181613,"forecastStart":1795161600,"moonPhase":"WAXING_GIBBOUS","humidityMax":97,"precipitationAmountByType":[],"sunsetAstronomical":1795227360,"visibilityMax":17821.0,"precipitationChance":0,"temperatureMin":4.006788,"maxUvIndex":1,"temperatureMinTime":1795177699,"sunsetNautical":1795225170,"daytimeForecast":{"humidity":77,"daylight":true,"forecastEnd":1795230000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.763362,"uvIndexMin":0,"temperatureApparentMin":5.128633,"windGustSpeedMax":14.482799,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":11.921696,"forecastStart":1795186800,"windDirection":9,"windSpeed":6.00165,"humidityMax":92,"precipitationAmountByType":[],"cloudCoverLowAltPct":16,"visibilityMax":13937.0,"cloudCover":19,"precipitationChance":0,"temperatureMin":4.73,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":69,"visibilityMin":9448.0,"precipitationType":["CLEAR"],"windSpeedMax":7.5348},"conditionCode":["MOSTLY_CLEAR"],"humidityMin":69,"solarNoon":1795204483,"visibilityMin":9083.0,"overnightForecast":{"humidity":78,"daylight":false,"forecastEnd":1795273200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.8,"uvIndexMin":0,"temperatureApparentMin":3.108699,"windGustSpeedMax":12.618,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":6.648598,"forecastStart":1795230000,"windDirection":63,"windSpeed":5.1837,"humidityMax":84,"precipitationAmountByType":[],"cloudCoverLowAltPct":7,"visibilityMax":24474.0,"cloudCover":10,"precipitationChance":0,"temperatureMin":4.249874,"cloudCoverMidAltPct":1,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":3,"humidityMin":66,"visibilityMin":13937.0,"precipitationType":["CLEAR"],"windSpeedMax":6.4764},"precipitationType":["CLEAR"],"sunriseNautical":1795183803,"sunsetCivil":1795222893,"windSpeedMax":7.5348},{"moonrise":1795300029,"moonset":1795261701,"sunrise":1795274609,"sunset":1795307204,"forecastEnd":1795334400,"sunriseCivil":1795272555,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.168908,"solarMidnight":1795334124,"windSpeedAvg":5.365725,"temperatureMaxTime":1795299642,"windGustSpeedMax":13.5252,"sunriseAstronomical":1795268084,"forecastStart":1795248000,"moonPhase":"WAXING_GIBBOUS","humidityMax":83,"precipitationAmountByType":[],"sunsetAstronomical":1795313719,"visibilityMax":26954.0,"precipitationChance":0,"temperatureMin":4.249874,"maxUvIndex":1,"temperatureMinTime":1795255291,"sunsetNautical":1795311526,"daytimeForecast":{"humidity":62,"daylight":true,"forecastEnd":1795316400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.168908,"uvIndexMin":0,"temperatureApparentMin":4.959615,"windGustSpeedMax":12.459599,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":13.309563,"forecastStart":1795273200,"windDirection":135,"windSpeed":4.4259,"humidityMax":66,"precipitationAmountByType":[],"cloudCoverLowAltPct":2,"visibilityMax":26954.0,"cloudCover":19,"precipitationChance":0,"temperatureMin":6.57,"cloudCoverMidAltPct":17,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":60,"visibilityMin":8662.0,"precipitationType":["CLEAR"],"windSpeedMax":6.372},"conditionCode":["MOSTLY_CLEAR"],"humidityMin":60,"solarNoon":1795290898,"visibilityMin":8662.0,"overnightForecast":{"humidity":71,"daylight":false,"forecastEnd":1795359600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.71,"uvIndexMin":0,"temperatureApparentMin":3.380726,"windGustSpeedMax":13.5252,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":7.205438,"forecastStart":1795316400,"windDirection":154,"windSpeed":5.82615,"humidityMax":77,"precipitationAmountByType":[],"cloudCoverLowAltPct":0,"visibilityMax":22708.0,"cloudCover":12,"precipitationChance":0,"temperatureMin":4.10744,"cloudCoverMidAltPct":4,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":64,"visibilityMin":10503.0,"precipitationType":["CLEAR"],"windSpeedMax":7.487999},"precipitationType":["CLEAR"],"sunriseNautical":1795270278,"sunsetCivil":1795309245,"windSpeedMax":7.487999}]},"forecastHourly":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"hours":[{"daylight":false,"humidity":85,"pressure":993.530029,"temperature":11.51,"visibility":22126.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":1,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":9.07518,"windGust":6.9768,"temperatureApparent":10.747892,"cloudCover":68,"precipitationChance":0,"cloudCoverMidAltPct":89,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":100,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794567600,"pressureTrend":"FALLING","windDirection":131,"uvIndex":0,"windSpeed":6.9768,"snowfallIntensity":0.0},{"daylight":false,"humidity":83,"pressure":992.429993,"temperature":10.95,"visibility":19738.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":4,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":8.174545,"windGust":12.87,"temperatureApparent":10.448459,"cloudCover":96,"precipitationChance":0,"cloudCoverMidAltPct":83,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":94,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794571200,"pressureTrend":"FALLING","windDirection":69,"uvIndex":0,"windSpeed":7.1892,"snowfallIntensity":0.0},{"daylight":false,"humidity":79,"pressure":990.97998,"temperature":11.34,"visibility":21981.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":4,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.828262,"windGust":15.4296,"temperatureApparent":9.860982,"cloudCover":74,"precipitationChance":0,"cloudCoverMidAltPct":48,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":67,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794574800,"pressureTrend":"FALLING","windDirection":83,"uvIndex":0,"windSpeed":9.0468,"snowfallIntensity":0.0},{"daylight":false,"humidity":74,"pressure":990.539978,"temperature":11.79,"visibility":26370.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":8,"perceivedPrecipitationIntensity":0.082,"precipitationIntensity":0.005,"temperatureDewPoint":7.305634,"windGust":17.848801,"temperatureApparent":11.730489,"cloudCover":100,"precipitationChance":5,"cloudCoverMidAltPct":95,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":98,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.005,"minimum":0.005,"maximum":0.005},"forecastStart":1794578400,"pressureTrend":"FALLING","windDirection":152,"uvIndex":0,"windSpeed":5.5908,"snowfallIntensity":0.0},{"daylight":false,"humidity":71,"pressure":989.789978,"temperature":12.85,"visibility":32347.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":6,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.719589,"windGust":25.4088,"temperatureApparent":11.529953,"cloudCover":97,"precipitationChance":0,"cloudCoverMidAltPct":92,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":97,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794582000,"pressureTrend":"FALLING","windDirection":107,"uvIndex":0,"windSpeed":9.324,"snowfallIntensity":0.0},{"daylight":true,"humidity":70,"pressure":990.130005,"temperature":13.64,"visibility":34072.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":24,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":8.26889,"windGust":31.352398,"temperatureApparent":10.051039,"cloudCover":99,"precipitationChance":0,"cloudCoverMidAltPct":96,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":56,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794585600,"pressureTrend":"FALLING","windDirection":131,"uvIndex":0,"windSpeed":15.263999,"snowfallIntensity":0.0},{"daylight":true,"humidity":80,"pressure":991.099976,"temperature":12.79,"visibility":20931.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":66,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":9.425461,"windGust":32.810402,"temperatureApparent":9.430462,"cloudCover":96,"precipitationChance":0,"cloudCoverMidAltPct":60,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":22,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794589200,"pressureTrend":"STEADY","windDirection":239,"uvIndex":0,"windSpeed":13.521601,"snowfallIntensity":0.0},{"daylight":true,"humidity":81,"pressure":991.559998,"temperature":13.02,"visibility":15831.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":39,"perceivedPrecipitationIntensity":0.568,"precipitationIntensity":0.252,"temperatureDewPoint":9.834717,"windGust":27.719999,"temperatureApparent":11.22246,"cloudCover":100,"precipitationChance":20,"cloudCoverMidAltPct":98,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":19,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.252,"minimum":0.252,"maximum":0.252},"forecastStart":1794592800,"pressureTrend":"RISING","windDirection":221,"uvIndex":1,"windSpeed":8.478,"snowfallIntensity":0.0},{"daylight":true,"humidity":82,"pressure":991.630005,"temperature":13.07,"visibility":16011.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":67,"perceivedPrecipitationIntensity":0.283,"precipitationIntensity":0.059,"temperatureDewPoint":10.066879,"windGust":30.477598,"temperatureApparent":10.538489,"cloudCover":100,"precipitationChance":23,"cloudCoverMidAltPct":96,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":34,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.059,"minimum":0.059,"maximum":0.059},"forecastStart":1794596400,"pressureTrend":"RISING","windDirection":194,"uvIndex":1,"windSpeed":10.5984,"snowfallIntensity":0.0},{"daylight":true,"humidity":82,"pressure":992.080017,"temperature":12.52,"visibility":16435.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":64,"perceivedPrecipitationIntensity":0.499,"precipitationIntensity":0.191,"temperatureDewPoint":9.529678,"windGust":31.676399,"temperatureApparent":9.236209,"cloudCover":100,"precipitationChance":35,"cloudCoverMidAltPct":97,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":99,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.191,"minimum":0.191,"maximum":0.191},"forecastStart":1794600000,"pressureTrend":"RISING","windDirection":206,"uvIndex":1,"windSpeed":12.549601,"snowfallIntensity":0.0},{"daylight":true,"humidity":84,"pressure":991.97998,"temperature":12.26,"visibility":12801.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":75,"perceivedPrecipitationIntensity":1.128,"precipitationIntensity":1.205,"temperatureDewPoint":9.634369,"windGust":28.656,"temperatureApparent":9.296653,"cloudCover":100,"precipitationChance":55,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.205,"minimum":1.205,"maximum":1.205},"forecastStart":1794603600,"pressureTrend":"STEADY","windDirection":201,"uvIndex":1,"windSpeed":11.6712,"snowfallIntensity":0.0},{"daylight":true,"humidity":85,"pressure":992.119995,"temperature":12.03,"visibility":9057.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":81,"perceivedPrecipitationIntensity":0.89,"precipitationIntensity":0.684,"temperatureDewPoint":9.585251,"windGust":26.046,"temperatureApparent":9.971526,"cloudCover":100,"precipitationChance":57,"cloudCoverMidAltPct":100,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":98,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.684,"minimum":0.684,"maximum":0.684},"forecastStart":1794607200,"pressureTrend":"STEADY","windDirection":194,"uvIndex":1,"windSpeed":9.234,"snowfallIntensity":0.0},{"daylight":true,"humidity":88,"pressure":992.48999,"temperature":11.76,"visibility":7366.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":1.135,"precipitationIntensity":1.224,"temperatureDewPoint":9.837143,"windGust":18.129601,"temperatureApparent":10.412608,"cloudCover":100,"precipitationChance":68,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":97,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.224,"minimum":1.224,"maximum":1.224},"forecastStart":1794610800,"pressureTrend":"STEADY","windDirection":180,"uvIndex":0,"windSpeed":7.7652,"snowfallIntensity":0.0},{"daylight":true,"humidity":90,"pressure":992.950012,"temperature":11.47,"visibility":6167.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":1.084,"precipitationIntensity":1.093,"temperatureDewPoint":9.886688,"windGust":17.326801,"temperatureApparent":11.056475,"cloudCover":100,"precipitationChance":68,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.093,"minimum":1.093,"maximum":1.093},"forecastStart":1794614400,"pressureTrend":"RISING","windDirection":158,"uvIndex":0,"windSpeed":6.4944,"snowfallIntensity":0.0},{"daylight":false,"humidity":90,"pressure":993.429993,"temperature":11.2,"visibility":10017.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":54,"perceivedPrecipitationIntensity":0.894,"precipitationIntensity":0.692,"temperatureDewPoint":9.620041,"windGust":19.764,"temperatureApparent":10.591156,"cloudCover":100,"precipitationChance":63,"cloudCoverMidAltPct":100,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":100,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.692,"minimum":0.692,"maximum":0.692},"forecastStart":1794618000,"pressureTrend":"RISING","windDirection":149,"uvIndex":0,"windSpeed":7.844399,"snowfallIntensity":0.0},{"daylight":false,"humidity":89,"pressure":993.809998,"temperature":10.85,"visibility":18581.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":39,"perceivedPrecipitationIntensity":0.274,"precipitationIntensity":0.055,"temperatureDewPoint":9.108414,"windGust":18.846001,"temperatureApparent":10.008285,"cloudCover":99,"precipitationChance":44,"cloudCoverMidAltPct":90,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":95,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.055,"minimum":0.055,"maximum":0.055},"forecastStart":1794621600,"pressureTrend":"RISING","windDirection":135,"uvIndex":0,"windSpeed":8.4348,"snowfallIntensity":0.0},{"daylight":false,"humidity":89,"pressure":994.340027,"temperature":10.49,"visibility":22953.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":17,"perceivedPrecipitationIntensity":0.203,"precipitationIntensity":0.03,"temperatureDewPoint":8.753342,"windGust":15.235199,"temperatureApparent":10.093671,"cloudCover":99,"precipitationChance":35,"cloudCoverMidAltPct":88,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.03,"minimum":0.03,"maximum":0.03},"forecastStart":1794625200,"pressureTrend":"RISING","windDirection":146,"uvIndex":0,"windSpeed":7.1712,"snowfallIntensity":0.0},{"daylight":false,"humidity":88,"pressure":994.849976,"temperature":10.28,"visibility":23999.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":23,"perceivedPrecipitationIntensity":0.352,"precipitationIntensity":0.092,"temperatureDewPoint":8.379349,"windGust":19.6416,"temperatureApparent":8.919455,"cloudCover":82,"precipitationChance":27,"cloudCoverMidAltPct":65,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.092,"minimum":0.092,"maximum":0.092},"forecastStart":1794628800,"pressureTrend":"RISING","windDirection":168,"uvIndex":0,"windSpeed":9.1692,"snowfallIntensity":0.0},{"daylight":false,"humidity":86,"pressure":995.400024,"temperature":10.2,"visibility":25448.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":38,"perceivedPrecipitationIntensity":0.192,"precipitationIntensity":0.027,"temperatureDewPoint":7.96196,"windGust":23.864401,"temperatureApparent":7.958751,"cloudCover":98,"precipitationChance":19,"cloudCoverMidAltPct":74,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.027,"minimum":0.027,"maximum":0.027},"forecastStart":1794632400,"pressureTrend":"RISING","windDirection":183,"uvIndex":0,"windSpeed":12.0564,"snowfallIntensity":0.0},{"daylight":false,"humidity":84,"pressure":996.070007,"temperature":10.02,"visibility":28076.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":33,"perceivedPrecipitationIntensity":0.242,"precipitationIntensity":0.043,"temperatureDewPoint":7.440018,"windGust":24.958801,"temperatureApparent":7.321218,"cloudCover":74,"precipitationChance":17,"cloudCoverMidAltPct":42,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.043,"minimum":0.043,"maximum":0.043},"forecastStart":1794636000,"pressureTrend":"RISING","windDirection":179,"uvIndex":0,"windSpeed":12.3696,"snowfallIntensity":0.0},{"daylight":false,"humidity":83,"pressure":996.48999,"temperature":9.93,"visibility":28703.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":62,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.176666,"windGust":28.184401,"temperatureApparent":7.196809,"cloudCover":93,"precipitationChance":0,"cloudCoverMidAltPct":58,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794639600,"pressureTrend":"RISING","windDirection":179,"uvIndex":0,"windSpeed":13.086,"snowfallIntensity":0.0},{"daylight":false,"humidity":82,"pressure":997.099976,"temperature":9.91,"visibility":22503.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":0.297,"precipitationIntensity":0.065,"temperatureDewPoint":6.980118,"windGust":36.504002,"temperatureApparent":5.957533,"cloudCover":83,"precipitationChance":13,"cloudCoverMidAltPct":68,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":31,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.065,"minimum":0.065,"maximum":0.065},"forecastStart":1794643200,"pressureTrend":"RISING","windDirection":188,"uvIndex":0,"windSpeed":16.254,"snowfallIntensity":0.0},{"daylight":false,"humidity":84,"pressure":997.929993,"temperature":9.78,"visibility":19336.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":62,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.20488,"windGust":36.144001,"temperatureApparent":5.642423,"cloudCover":79,"precipitationChance":0,"cloudCoverMidAltPct":45,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":20,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794646800,"pressureTrend":"RISING","windDirection":189,"uvIndex":0,"windSpeed":16.65,"snowfallIntensity":0.0},{"daylight":false,"humidity":86,"pressure":998.849976,"temperature":9.54,"visibility":16225.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":50,"perceivedPrecipitationIntensity":0.549,"precipitationIntensity":0.234,"temperatureDewPoint":7.313568,"windGust":32.5116,"temperatureApparent":5.722379,"cloudCover":59,"precipitationChance":24,"cloudCoverMidAltPct":30,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.234,"minimum":0.234,"maximum":0.234},"forecastStart":1794650400,"pressureTrend":"RISING","windDirection":186,"uvIndex":0,"windSpeed":14.9436,"snowfallIntensity":0.0}]},"forecastPeriodic":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"forecasts":[{"periods":[{"humidity":79,"daylight":false,"forecastEnd":1794582000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.85,"uvIndexMin":0,"temperatureApparentMin":9.818448,"windGustSpeedMax":25.4088,"perceivedPrecipitationIntensityMax":0.082,"uvIndexMax":0,"temperatureApparentMax":11.864366,"forecastStart":1794567600,"windDirection":101,"windSpeed":7.4943,"humidityMax":85,"precipitationAmountByType":[{"expected":0.005,"minimum":0.005,"maximum":0.005,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":5,"visibilityMax":32347.0,"cloudCover":88,"precipitationChance":24,"temperatureMin":10.94799,"cloudCoverMidAltPct":79,"precipitationIntensityMax":0.005,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":89,"humidityMin":71,"visibilityMin":19738.0,"precipitationType":["RAIN"],"windSpeedMax":9.324},{"humidity":77,"daylight":true,"forecastEnd":1794596400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":9.384322,"windGustSpeedMax":32.810402,"perceivedPrecipitationIntensityMax":0.568,"uvIndexMax":1,"temperatureApparentMax":11.529953,"forecastStart":1794582000,"windDirection":185,"windSpeed":11.8062,"humidityMax":82,"precipitationAmountByType":[{"expected":0.252,"minimum":0.252,"maximum":0.252,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":41,"visibilityMax":34072.0,"cloudCover":98,"precipitationChance":26,"temperatureMin":12.767698,"cloudCoverMidAltPct":87,"precipitationIntensityMax":0.252,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":41,"humidityMin":70,"visibilityMin":15831.0,"precipitationType":["RAIN"],"windSpeedMax":15.263999},{"humidity":84,"daylight":true,"forecastEnd":1794610800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.07,"uvIndexMin":0,"temperatureApparentMin":9.132,"windGustSpeedMax":31.676399,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":10.538489,"forecastStart":1794596400,"windDirection":198,"windSpeed":10.65915,"humidityMax":88,"precipitationAmountByType":[{"expected":2.139,"minimum":2.139,"maximum":2.139,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":71,"visibilityMax":16435.0,"cloudCover":100,"precipitationChance":68,"temperatureMin":11.76,"cloudCoverMidAltPct":99,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":90,"humidityMin":82,"visibilityMin":7366.0,"precipitationType":["RAIN"],"windSpeedMax":12.549601},{"humidity":89,"daylight":true,"forecastEnd":1794625200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.76,"uvIndexMin":0,"temperatureApparentMin":9.995345,"windGustSpeedMax":19.764,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":0,"temperatureApparentMax":11.058412,"forecastStart":1794610800,"windDirection":151,"windSpeed":7.560449,"humidityMax":90,"precipitationAmountByType":[{"expected":3.064,"minimum":3.064,"maximum":3.064,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":48,"visibilityMax":22953.0,"cloudCover":100,"precipitationChance":82,"temperatureMin":10.49,"cloudCoverMidAltPct":96,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":97,"humidityMin":88,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":8.4348},{"humidity":86,"daylight":false,"forecastEnd":1794639600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.49,"uvIndexMin":0,"temperatureApparentMin":7.196809,"windGustSpeedMax":28.184401,"perceivedPrecipitationIntensityMax":0.352,"uvIndexMax":0,"temperatureApparentMax":10.093671,"forecastStart":1794625200,"windDirection":175,"windSpeed":10.93095,"humidityMax":89,"precipitationAmountByType":[{"expected":0.192,"minimum":0.192,"maximum":0.192,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":33,"visibilityMax":28703.0,"cloudCover":88,"precipitationChance":49,"temperatureMin":9.93,"cloudCoverMidAltPct":64,"precipitationIntensityMax":0.092,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":72,"humidityMin":83,"visibilityMin":22953.0,"precipitationType":["RAIN"],"windSpeedMax":13.086},{"humidity":84,"daylight":false,"forecastEnd":1794654000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.93,"uvIndexMin":0,"temperatureApparentMin":5.604858,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":0.549,"uvIndexMax":0,"temperatureApparentMax":7.196809,"forecastStart":1794639600,"windDirection":186,"windSpeed":15.3558,"humidityMax":88,"precipitationAmountByType":[{"expected":0.299,"minimum":0.299,"maximum":0.299,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":56,"visibilityMax":28703.0,"cloudCover":74,"precipitationChance":28,"temperatureMin":9.2,"cloudCoverMidAltPct":47,"precipitationIntensityMax":0.234,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":21,"humidityMin":82,"visibilityMin":16225.0,"precipitationType":["RAIN"],"windSpeedMax":16.65}],"periodLength":4}]},"forecastNextHour":{"metadata":{"latitude":0,"longitude":0,"expireTime":1794571473,"sourceType":"MODELED","attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"temporarilyUnavailable":false,"providerName":"US National Oceanic & Atmospheric Administration","reportedTime":1794569160},"condition":[{"parameters":[],"startTime":1794569640,"beginCondition":"CLEAR","forecastToken":"CLEAR","endCondition":"CLEAR"}],"summary":[{"condition":["CLEAR"],"precipitationChance":0,"startTime":1794569640,"precipitationIntensity":0.0}],"minutes":[{"precipitationChance":0,"startTime":1794569640,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569700,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569760,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569820,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569880,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569940,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570000,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570060,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570120,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570180,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570240,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570300,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570360,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570420,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570480,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570540,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570600,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570660,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570720,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570780,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570840,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570900,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570960,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571020,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571080,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571140,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571200,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571260,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571320,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571380,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571440,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571500,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571560,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571620,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571680,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571740,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571800,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571860,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571920,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571980,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572040,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572100,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572160,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572220,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572280,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572340,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572400,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572460,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572520,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572580,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572640,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572700,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572760,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572820,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572880,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572940,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573000,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573060,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573120,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573180,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573240,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573300,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573360,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573420,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573480,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573540,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573600,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573660,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573720,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573780,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573840,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573900,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573960,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574020,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574080,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574140,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574200,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574260,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574320,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574380,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574440,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574500,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0}],"forecastEnd":1794574560,"forecastStart":1794569640}} +{"news":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"APPLE_INTERNAL","reportedTime":1794569673},"placements":[{"priority":2,"articles":[{"id":"A6ajisfZkSH-TzT_j18WQJQ","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How the UV index helps you know when it’s safe to have fun in the sun","alertIds":[]}],"placement":["UV_DETAILS"]},{"priority":2,"articles":[{"id":"AxDHjEelNRh-tGqDejqtusw","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How to prepare and stay safe if high winds are in your forecast","alertIds":[]}],"placement":["WIND_DETAILS"]},{"priority":2,"articles":[{"id":"A2uodtK8zT8qsl9ZTqOSsuw","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How to use the air quality index to protect yourself from pollution and smoke","alertIds":[]}],"placement":["AIR_QUALITY_DETAILS"]}]},"airQuality":{"metadata":{"latitude":0,"longitude":0,"expireTime":1794571287,"sourceType":"MODELED","attributionUrl":"https://dynamic-link.breezometer.com/?lat=00.000&lon=-000.000&partner=apple","readTime":1794569673,"temporarilyUnavailable":false,"providerName":"BreezoMeter","reportedTime":1794567600},"index":59,"pollutants":[{"amount":5.0,"units":"PARTS_PER_BILLION","pollutantType":"OZONE"},{"amount":14.707169,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"PM2_5"},{"amount":32.544106,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"PM10"},{"amount":300.0,"units":"PARTS_PER_BILLION","pollutantType":"CO"},{"amount":24.375298,"units":"PARTS_PER_BILLION","pollutantType":"NO2"},{"amount":5.560594,"units":"PARTS_PER_BILLION","pollutantType":"NO"},{"amount":0.8,"units":"PARTS_PER_BILLION","pollutantType":"SO2"},{"amount":23.047903,"units":"PARTS_PER_BILLION","pollutantType":"NOX"}],"scale":"EPA_NowCast.2604","primaryPollutant":"PM2_5","previousDayComparison":"SAME","categoryIndex":2,"isSignificant":false},"currentWeather":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794569973,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794569673},"daylight":false,"humidity":84,"pressure":992.896606,"temperature":11.151289,"visibility":20750.910156,"asOf":1794569673,"precipitationIntensity":0.0,"temperatureDewPoint":8.548309,"windGust":10.370301,"temperatureApparent":10.537592,"snowfallAmountPrevious6h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"snowfallAmountPrevious24h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountNext6hByType":[],"snowfallAmountNext24h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountPrevious6hByType":[],"snowfallAmountPrevious1h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"pressureTrend":"FALLING","windDirection":94,"windSpeed":7.099107,"cloudCoverLowAltPct":3,"perceivedPrecipitationIntensity":0.0,"precipitationAmountPrevious1hByType":[],"cloudCover":84,"precipitationAmountNext1hByType":[],"snowfallAmountNext1h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountPrevious24hByType":[],"cloudCoverMidAltPct":86,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":97,"snowfallAmountNext6h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"uvIndex":0,"precipitationAmountNext24hByType":[{"expected":5.984974,"minimum":5.984974,"maximum":5.984974,"precipitationType":["RAIN"]}]},"weatherChanges":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"changes":[{"forecastEnd":1794729600,"maxTemperatureChange":"STEADY","forecastStart":1794643200,"minTemperatureChange":"STEADY","dayPrecipitationChange":"DEC","nightPrecipitationChange":"INC"},{"forecastEnd":1794816000,"maxTemperatureChange":"STEADY","forecastStart":1794729600,"minTemperatureChange":"STEADY","dayPrecipitationChange":"INC","nightPrecipitationChange":"DEC"}],"forecastEnd":1794816000,"forecastStart":1794643200},"weatherAlerts":{"metadata":{"language":"en","latitude":0,"longitude":0,"expireTime":1794569973,"sourceType":"STATION","attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"temporarilyUnavailable":false,"providerName":"National Weather Service","reportedTime":1794538320},"alerts":[{"id":{"bytes":[190,12,153,147,104,54,83,236,165,44,137,30,51,142,238,251]},"description":"Coastal Flood Advisory","token":"REDACTED______________","phenomenon":"Flood","severity":"MINOR","significance":"ADVISORY","source":"National Weather Service","urgency":"EXPECTED","certainty":"LIKELY","importance":"LOW","responses":["MONITOR"],"eventOnsetTime":1794578400,"detailsUrl":"https://weatherkit.apple.com/alertDetails/index.html?ids=be0c9993-6836-53ec-a52c-891e338eeefb&lang=en-US&timezone=America/Los_Angeles&party=apple","effectiveTime":1794538320,"issuedTime":1794538320,"eventSource":"US","areaId":"waz315","expireTime":1794574800,"countryCode":"US","eventEndTime":1794600000,"attributionUrl":"https://www.weather.gov"}],"detailsUrl":"https://weatherkit.apple.com/alertDetails/index.html?ids=be0c9993-6836-53ec-a52c-891e338eeefb&lang=en-US&timezone=America/Los_Angeles&party=apple"},"historicalComparisons":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"comparisons":[{"condition":"TEMPERATURE_MAX","deviation":"NORMAL","baselineValue":10.839996,"baselineStartDate":0,"currentValue":13.64015,"baselineType":"MEAN"},{"condition":"PRECIPITATION","deviation":"NORMAL","baselineValue":0.0,"baselineStartDate":0,"currentValue":0.0,"baselineType":"MEAN"}]},"forecastDaily":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"days":[{"moonrise":1794598874,"moonset":1794627382,"sunrise":1794582705,"sunset":1794616505,"forecastEnd":1794643200,"sunriseCivil":1794580706,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"solarMidnight":1794642825,"windSpeedAvg":9.337426,"temperatureMaxTime":1794585564,"windGustSpeedMax":36.504002,"sunriseAstronomical":1794576293,"forecastStart":1794556800,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":5.652,"minimum":5.652,"maximum":5.652,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794622910,"visibilityMax":34072.0,"precipitationChance":86,"temperatureMin":9.91,"maxUvIndex":1,"temperatureMinTime":1794643200,"sunsetNautical":1794620737,"daytimeForecast":{"humidity":83,"daylight":true,"forecastEnd":1794625200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":9.132,"windGustSpeedMax":32.810402,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":11.529953,"forecastStart":1794582000,"windDirection":181,"windSpeed":10.008599,"humidityMax":90,"precipitationAmountByType":[{"expected":5.455,"minimum":5.455,"maximum":5.455,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":53,"visibilityMax":34072.0,"cloudCover":99,"precipitationChance":79,"temperatureMin":10.49,"cloudCoverMidAltPct":94,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":76,"humidityMin":70,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":15.263999},"conditionCode":["RAIN"],"humidityMin":70,"solarNoon":1794599599,"visibilityMin":6167.0,"overnightForecast":{"humidity":86,"daylight":false,"forecastEnd":1794668400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.49,"uvIndexMin":0,"temperatureApparentMin":5.112798,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":0.549,"uvIndexMax":0,"temperatureApparentMax":10.093671,"forecastStart":1794625200,"windDirection":183,"windSpeed":13.7466,"humidityMax":89,"precipitationAmountByType":[{"expected":0.71,"minimum":0.71,"maximum":0.71,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":49,"visibilityMax":28703.0,"cloudCover":74,"precipitationChance":65,"temperatureMin":9.009192,"cloudCoverMidAltPct":49,"precipitationIntensityMax":0.234,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":31,"humidityMin":82,"visibilityMin":16190.0,"precipitationType":["RAIN"],"windSpeedMax":16.65},"precipitationType":["RAIN"],"sunriseNautical":1794578462,"sunsetCivil":1794618498,"windSpeedMax":16.254,"restOfDayForecast":{"humidity":83,"daylight":false,"forecastEnd":1794643200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":5.957533,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":11.864366,"forecastStart":1794569673,"windDirection":171,"windSpeed":10.008805,"humidityMax":90,"precipitationAmountByType":[{"expected":5.652,"minimum":5.652,"maximum":5.652,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":42,"visibilityMax":34072.0,"cloudCover":95,"precipitationChance":84,"temperatureMin":9.91,"cloudCoverMidAltPct":84,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":76,"humidityMin":70,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":16.254}},{"moonrise":1794687261,"moonset":1794717746,"sunrise":1794669195,"sunset":1794702834,"forecastEnd":1794729600,"sunriseCivil":1794667189,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.170017,"solarMidnight":1794729234,"windSpeedAvg":13.5183,"temperatureMaxTime":1794689975,"windGustSpeedMax":36.504002,"sunriseAstronomical":1794662769,"forecastStart":1794643200,"moonPhase":"WAXING_CRESCENT","humidityMax":88,"precipitationAmountByType":[{"expected":5.55,"minimum":5.55,"maximum":5.55,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794709253,"visibilityMax":29373.0,"precipitationChance":85,"temperatureMin":9.009192,"maxUvIndex":1,"temperatureMinTime":1794668269,"sunsetNautical":1794707078,"daytimeForecast":{"humidity":79,"daylight":true,"forecastEnd":1794711600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.170017,"uvIndexMin":0,"temperatureApparentMin":5.696423,"windGustSpeedMax":33.551998,"perceivedPrecipitationIntensityMax":0.503,"uvIndexMax":1,"temperatureApparentMax":9.767292,"forecastStart":1794668400,"windDirection":166,"windSpeed":13.39695,"humidityMax":86,"precipitationAmountByType":[{"expected":0.96,"minimum":0.96,"maximum":0.96,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":59,"visibilityMax":29373.0,"cloudCover":89,"precipitationChance":55,"temperatureMin":9.01,"cloudCoverMidAltPct":72,"precipitationIntensityMax":0.194,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":64,"humidityMin":76,"visibilityMin":15078.0,"precipitationType":["RAIN"],"windSpeedMax":14.860799},"conditionCode":["RAIN"],"humidityMin":76,"solarNoon":1794686008,"visibilityMin":4069.0,"overnightForecast":{"humidity":84,"daylight":false,"forecastEnd":1794754800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.48,"uvIndexMin":0,"temperatureApparentMin":5.973359,"windGustSpeedMax":38.952,"perceivedPrecipitationIntensityMax":1.473,"uvIndexMax":0,"temperatureApparentMax":9.430315,"forecastStart":1794711600,"windDirection":155,"windSpeed":14.398049,"humidityMax":88,"precipitationAmountByType":[{"expected":8.279,"minimum":8.279,"maximum":8.279,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":67,"visibilityMax":25393.0,"cloudCover":94,"precipitationChance":87,"temperatureMin":10.038711,"cloudCoverMidAltPct":84,"precipitationIntensityMax":2.419,"conditionCode":["RAIN"],"cloudCoverHighAltPct":31,"humidityMin":78,"visibilityMin":4069.0,"precipitationType":["RAIN"],"windSpeedMax":17.780401},"precipitationType":["RAIN"],"sunriseNautical":1794664941,"sunsetCivil":1794704834,"windSpeedMax":16.65},{"moonrise":1794775225,"moonset":1794808239,"sunrise":1794755684,"sunset":1794789166,"forecastEnd":1794816000,"sunriseCivil":1794753672,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.499799,"solarMidnight":1794815645,"windSpeedAvg":13.973175,"temperatureMaxTime":1794775537,"windGustSpeedMax":38.952,"sunriseAstronomical":1794749245,"forecastStart":1794729600,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":7.270999,"minimum":7.270999,"maximum":7.270999,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794795599,"visibilityMax":27960.0,"precipitationChance":94,"temperatureMin":7.48,"maxUvIndex":1,"temperatureMinTime":1794816000,"sunsetNautical":1794793421,"daytimeForecast":{"humidity":79,"daylight":true,"forecastEnd":1794798000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.499799,"uvIndexMin":0,"temperatureApparentMin":5.879239,"windGustSpeedMax":35.748001,"perceivedPrecipitationIntensityMax":0.775,"uvIndexMax":1,"temperatureApparentMax":9.362825,"forecastStart":1794754800,"windDirection":199,"windSpeed":15.284551,"humidityMax":86,"precipitationAmountByType":[{"expected":3.041,"minimum":3.041,"maximum":3.041,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":37,"visibilityMax":27960.0,"cloudCover":64,"precipitationChance":79,"temperatureMin":9.24,"cloudCoverMidAltPct":53,"precipitationIntensityMax":0.499,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":0,"humidityMin":73,"visibilityMin":13909.0,"precipitationType":["RAIN"],"windSpeedMax":18.6192},"conditionCode":["RAIN"],"humidityMin":73,"solarNoon":1794772418,"visibilityMin":7974.0,"overnightForecast":{"humidity":89,"daylight":false,"forecastEnd":1794841200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.24,"uvIndexMin":0,"temperatureApparentMin":4.984706,"windGustSpeedMax":20.1276,"perceivedPrecipitationIntensityMax":1.093,"uvIndexMax":0,"temperatureApparentMax":8.094274,"forecastStart":1794798000,"windDirection":167,"windSpeed":7.06065,"humidityMax":90,"precipitationAmountByType":[{"expected":2.986,"minimum":2.986,"maximum":2.986,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":36,"visibilityMax":26518.0,"cloudCover":63,"precipitationChance":51,"temperatureMin":6.209458,"cloudCoverMidAltPct":37,"precipitationIntensityMax":1.117,"conditionCode":["RAIN"],"cloudCoverHighAltPct":4,"humidityMin":83,"visibilityMin":16329.0,"precipitationType":["RAIN"],"windSpeedMax":8.186399},"precipitationType":["RAIN"],"sunriseNautical":1794751419,"sunsetCivil":1794791172,"windSpeedMax":18.6192},{"moonrise":1794862879,"moonset":1794898770,"sunrise":1794842173,"sunset":1794875500,"forecastEnd":1794902400,"sunriseCivil":1794840154,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.921954,"solarMidnight":1794902056,"windSpeedAvg":8.8203,"temperatureMaxTime":1794864861,"windGustSpeedMax":25.909199,"sunriseAstronomical":1794835720,"forecastStart":1794816000,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":4.384,"minimum":4.384,"maximum":4.384,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794881947,"visibilityMax":31734.0,"precipitationChance":67,"temperatureMin":6.209458,"maxUvIndex":1,"temperatureMinTime":1794840092,"sunsetNautical":1794879767,"daytimeForecast":{"humidity":80,"daylight":true,"forecastEnd":1794884400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.921954,"uvIndexMin":0,"temperatureApparentMin":5.026797,"windGustSpeedMax":25.909199,"perceivedPrecipitationIntensityMax":0.808,"uvIndexMax":1,"temperatureApparentMax":10.102699,"forecastStart":1794841200,"windDirection":182,"windSpeed":9.35655,"humidityMax":90,"precipitationAmountByType":[{"expected":0.895,"minimum":0.895,"maximum":0.895,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":45,"visibilityMax":31734.0,"cloudCover":73,"precipitationChance":36,"temperatureMin":6.24,"cloudCoverMidAltPct":57,"precipitationIntensityMax":0.548,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":16,"humidityMin":73,"visibilityMin":16596.0,"precipitationType":["RAIN"],"windSpeedMax":12.225599},"conditionCode":["RAIN"],"humidityMin":73,"solarNoon":1794858830,"visibilityMin":16329.0,"overnightForecast":{"humidity":88,"daylight":false,"forecastEnd":1794927600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.71,"uvIndexMin":0,"temperatureApparentMin":4.863145,"windGustSpeedMax":25.909199,"perceivedPrecipitationIntensityMax":0.751,"uvIndexMax":0,"temperatureApparentMax":6.049259,"forecastStart":1794884400,"windDirection":169,"windSpeed":8.89755,"humidityMax":89,"precipitationAmountByType":[{"expected":0.568,"minimum":0.568,"maximum":0.568,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":56,"visibilityMax":28122.0,"cloudCover":60,"precipitationChance":50,"temperatureMin":5.989975,"cloudCoverMidAltPct":7,"precipitationIntensityMax":0.465,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":1,"humidityMin":85,"visibilityMin":16596.0,"precipitationType":["RAIN"],"windSpeedMax":11.7612},"precipitationType":["RAIN"],"sunriseNautical":1794837897,"sunsetCivil":1794877511,"windSpeedMax":12.225599},{"moonrise":1794950358,"sunrise":1794928662,"sunset":1794961836,"forecastEnd":1794988800,"sunriseCivil":1794926635,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.845637,"solarMidnight":1794988468,"windSpeedAvg":6.440775,"temperatureMaxTime":1794953467,"windGustSpeedMax":18.273602,"sunriseAstronomical":1794922194,"forecastStart":1794902400,"moonPhase":"FIRST_QUARTER","humidityMax":89,"precipitationAmountByType":[{"expected":0.341,"minimum":0.341,"maximum":0.341,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794968297,"visibilityMax":29733.0,"precipitationChance":53,"temperatureMin":5.98,"maxUvIndex":1,"temperatureMinTime":1794988800,"sunsetNautical":1794966114,"daytimeForecast":{"humidity":72,"daylight":true,"forecastEnd":1794970800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.845637,"uvIndexMin":0,"temperatureApparentMin":5.082117,"windGustSpeedMax":17.006401,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":12.097757,"forecastStart":1794927600,"windDirection":154,"windSpeed":5.87355,"humidityMax":87,"precipitationAmountByType":[],"cloudCoverLowAltPct":15,"visibilityMax":29733.0,"cloudCover":29,"precipitationChance":0,"temperatureMin":6.13,"cloudCoverMidAltPct":1,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":6,"humidityMin":62,"visibilityMin":17780.0,"precipitationType":["CLEAR"],"windSpeedMax":7.1748},"conditionCode":["DRIZZLE"],"humidityMin":62,"solarNoon":1794945242,"visibilityMin":17780.0,"overnightForecast":{"humidity":82,"daylight":false,"forecastEnd":1795014000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.72,"uvIndexMin":0,"temperatureApparentMin":2.451838,"windGustSpeedMax":25.2936,"perceivedPrecipitationIntensityMax":0.95,"uvIndexMax":0,"temperatureApparentMax":7.151364,"forecastStart":1794970800,"windDirection":133,"windSpeed":7.62915,"humidityMax":89,"precipitationAmountByType":[{"expected":4.327,"minimum":4.327,"maximum":4.327,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":31,"visibilityMax":25857.0,"cloudCover":92,"precipitationChance":50,"temperatureMin":4.947516,"cloudCoverMidAltPct":66,"precipitationIntensityMax":0.798,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":89,"humidityMin":74,"visibilityMin":10859.0,"precipitationType":["RAIN"],"windSpeedMax":12.204},"precipitationType":["RAIN"],"sunriseNautical":1794924375,"sunsetCivil":1794963853,"windSpeedMax":8.9928},{"moonrise":1795037733,"moonset":1794989335,"sunrise":1795015150,"sunset":1795048175,"forecastEnd":1795075200,"sunriseCivil":1795013116,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.020019,"solarMidnight":1795074881,"windSpeedAvg":10.204425,"temperatureMaxTime":1795042826,"windGustSpeedMax":25.7724,"sunriseAstronomical":1795008667,"forecastStart":1794988800,"moonPhase":"WAXING_GIBBOUS","humidityMax":94,"precipitationAmountByType":[{"expected":6.641001,"minimum":6.641001,"maximum":6.641001,"precipitationType":["RAIN"]}],"sunsetAstronomical":1795054649,"visibilityMax":30421.0,"precipitationChance":74,"temperatureMin":4.947516,"maxUvIndex":1,"temperatureMinTime":1795009991,"sunsetNautical":1795052464,"daytimeForecast":{"humidity":81,"daylight":true,"forecastEnd":1795057200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.020019,"uvIndexMin":0,"temperatureApparentMin":2.416847,"windGustSpeedMax":25.7724,"perceivedPrecipitationIntensityMax":0.866,"uvIndexMax":1,"temperatureApparentMax":6.052989,"forecastStart":1795014000,"windDirection":182,"windSpeed":12.15015,"humidityMax":88,"precipitationAmountByType":[{"expected":2.276,"minimum":2.276,"maximum":2.276,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":60,"visibilityMax":30421.0,"cloudCover":82,"precipitationChance":66,"temperatureMin":5.11,"cloudCoverMidAltPct":76,"precipitationIntensityMax":0.643,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":50,"humidityMin":76,"visibilityMin":14677.0,"precipitationType":["RAIN"],"windSpeedMax":13.608},"conditionCode":["DRIZZLE"],"humidityMin":76,"solarNoon":1795031654,"visibilityMin":10859.0,"overnightForecast":{"humidity":92,"daylight":false,"forecastEnd":1795100400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.9,"uvIndexMin":0,"temperatureApparentMin":5.690445,"windGustSpeedMax":17.945999,"perceivedPrecipitationIntensityMax":0.327,"uvIndexMax":0,"temperatureApparentMax":6.35371,"forecastStart":1795057200,"windDirection":158,"windSpeed":5.645401,"humidityMax":95,"precipitationAmountByType":[{"expected":0.478,"minimum":0.478,"maximum":0.478,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":62,"visibilityMax":25229.0,"cloudCover":82,"precipitationChance":50,"temperatureMin":5.36,"cloudCoverMidAltPct":55,"precipitationIntensityMax":0.079,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":8,"humidityMin":82,"visibilityMin":12901.0,"precipitationType":["RAIN"],"windSpeedMax":9.774},"precipitationType":["RAIN"],"sunriseNautical":1795010851,"sunsetCivil":1795050198,"windSpeedMax":13.608},{"moonrise":1795125079,"moonset":1795079963,"sunrise":1795101637,"sunset":1795134515,"forecastEnd":1795161600,"sunriseCivil":1795099597,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.116987,"solarMidnight":1795161294,"windSpeedAvg":5.149725,"temperatureMaxTime":1795135920,"windGustSpeedMax":12.852,"sunriseAstronomical":1795095140,"forecastStart":1795075200,"moonPhase":"WAXING_GIBBOUS","humidityMax":96,"precipitationAmountByType":[{"expected":0.141,"minimum":0.141,"maximum":0.141,"precipitationType":["RAIN"]}],"sunsetAstronomical":1795141003,"visibilityMax":32204.0,"precipitationChance":53,"temperatureMin":5.36,"maxUvIndex":1,"temperatureMinTime":1795082400,"sunsetNautical":1795138815,"daytimeForecast":{"humidity":83,"daylight":true,"forecastEnd":1795143600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.116987,"uvIndexMin":0,"temperatureApparentMin":6.35371,"windGustSpeedMax":12.852,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":10.070161,"forecastStart":1795100400,"windDirection":4,"windSpeed":6.0135,"humidityMax":93,"precipitationAmountByType":[],"cloudCoverLowAltPct":44,"visibilityMax":32204.0,"cloudCover":63,"precipitationChance":0,"temperatureMin":6.03,"cloudCoverMidAltPct":2,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":0,"humidityMin":77,"visibilityMin":12901.0,"precipitationType":["CLEAR"],"windSpeedMax":7.8264},"conditionCode":["DRIZZLE"],"humidityMin":77,"solarNoon":1795118068,"visibilityMin":12901.0,"overnightForecast":{"humidity":94,"daylight":false,"forecastEnd":1795186800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.52,"uvIndexMin":0,"temperatureApparentMin":4.634763,"windGustSpeedMax":9.4392,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":8.422463,"forecastStart":1795143600,"windDirection":44,"windSpeed":3.7053,"humidityMax":97,"precipitationAmountByType":[],"cloudCoverLowAltPct":34,"visibilityMax":28680.0,"cloudCover":52,"precipitationChance":0,"temperatureMin":4.006788,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"humidityMin":85,"visibilityMin":9083.0,"precipitationType":["CLEAR"],"windSpeedMax":4.0212},"precipitationType":["RAIN"],"sunriseNautical":1795097328,"sunsetCivil":1795136544,"windSpeedMax":7.8264},{"moonrise":1795212479,"moonset":1795170725,"sunrise":1795188123,"sunset":1795220858,"forecastEnd":1795248000,"sunriseCivil":1795186076,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.763362,"solarMidnight":1795247709,"windSpeedAvg":4.930575,"temperatureMaxTime":1795216005,"windGustSpeedMax":14.482799,"sunriseAstronomical":1795181613,"forecastStart":1795161600,"moonPhase":"WAXING_GIBBOUS","humidityMax":97,"precipitationAmountByType":[],"sunsetAstronomical":1795227360,"visibilityMax":17821.0,"precipitationChance":0,"temperatureMin":4.006788,"maxUvIndex":1,"temperatureMinTime":1795177699,"sunsetNautical":1795225170,"daytimeForecast":{"humidity":77,"daylight":true,"forecastEnd":1795230000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.763362,"uvIndexMin":0,"temperatureApparentMin":5.128633,"windGustSpeedMax":14.482799,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":11.921696,"forecastStart":1795186800,"windDirection":9,"windSpeed":6.00165,"humidityMax":92,"precipitationAmountByType":[],"cloudCoverLowAltPct":16,"visibilityMax":13937.0,"cloudCover":19,"precipitationChance":0,"temperatureMin":4.73,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":69,"visibilityMin":9448.0,"precipitationType":["CLEAR"],"windSpeedMax":7.5348},"conditionCode":["MOSTLY_CLEAR"],"humidityMin":69,"solarNoon":1795204483,"visibilityMin":9083.0,"overnightForecast":{"humidity":78,"daylight":false,"forecastEnd":1795273200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.8,"uvIndexMin":0,"temperatureApparentMin":3.108699,"windGustSpeedMax":12.618,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":6.648598,"forecastStart":1795230000,"windDirection":63,"windSpeed":5.1837,"humidityMax":84,"precipitationAmountByType":[],"cloudCoverLowAltPct":7,"visibilityMax":24474.0,"cloudCover":10,"precipitationChance":0,"temperatureMin":4.249874,"cloudCoverMidAltPct":1,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":3,"humidityMin":66,"visibilityMin":13937.0,"precipitationType":["CLEAR"],"windSpeedMax":6.4764},"precipitationType":["CLEAR"],"sunriseNautical":1795183803,"sunsetCivil":1795222893,"windSpeedMax":7.5348},{"moonrise":1795300029,"moonset":1795261701,"sunrise":1795274609,"sunset":1795307204,"forecastEnd":1795334400,"sunriseCivil":1795272555,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.168908,"solarMidnight":1795334124,"windSpeedAvg":5.365725,"temperatureMaxTime":1795299642,"windGustSpeedMax":13.5252,"sunriseAstronomical":1795268084,"forecastStart":1795248000,"moonPhase":"WAXING_GIBBOUS","humidityMax":83,"precipitationAmountByType":[],"sunsetAstronomical":1795313719,"visibilityMax":26954.0,"precipitationChance":0,"temperatureMin":4.249874,"maxUvIndex":1,"temperatureMinTime":1795255291,"sunsetNautical":1795311526,"daytimeForecast":{"humidity":62,"daylight":true,"forecastEnd":1795316400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.168908,"uvIndexMin":0,"temperatureApparentMin":4.959615,"windGustSpeedMax":12.459599,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":13.309563,"forecastStart":1795273200,"windDirection":135,"windSpeed":4.4259,"humidityMax":66,"precipitationAmountByType":[],"cloudCoverLowAltPct":2,"visibilityMax":26954.0,"cloudCover":19,"precipitationChance":0,"temperatureMin":6.57,"cloudCoverMidAltPct":17,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":60,"visibilityMin":8662.0,"precipitationType":["CLEAR"],"windSpeedMax":6.372},"conditionCode":["MOSTLY_CLEAR"],"humidityMin":60,"solarNoon":1795290898,"visibilityMin":8662.0,"overnightForecast":{"humidity":71,"daylight":false,"forecastEnd":1795359600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.71,"uvIndexMin":0,"temperatureApparentMin":3.380726,"windGustSpeedMax":13.5252,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":7.205438,"forecastStart":1795316400,"windDirection":154,"windSpeed":5.82615,"humidityMax":77,"precipitationAmountByType":[],"cloudCoverLowAltPct":0,"visibilityMax":22708.0,"cloudCover":12,"precipitationChance":0,"temperatureMin":4.10744,"cloudCoverMidAltPct":4,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":64,"visibilityMin":10503.0,"precipitationType":["CLEAR"],"windSpeedMax":7.487999},"precipitationType":["CLEAR"],"sunriseNautical":1795270278,"sunsetCivil":1795309245,"windSpeedMax":7.487999}]},"forecastHourly":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"hours":[{"daylight":false,"humidity":85,"pressure":993.530029,"temperature":11.51,"visibility":22126.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":1,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":9.07518,"windGust":6.9768,"temperatureApparent":10.747892,"cloudCover":68,"precipitationChance":0,"cloudCoverMidAltPct":89,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":100,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794567600,"pressureTrend":"FALLING","windDirection":131,"uvIndex":0,"windSpeed":6.9768,"snowfallIntensity":0.0},{"daylight":false,"humidity":83,"pressure":992.429993,"temperature":10.95,"visibility":19738.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":4,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":8.174545,"windGust":12.87,"temperatureApparent":10.448459,"cloudCover":96,"precipitationChance":0,"cloudCoverMidAltPct":83,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":94,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794571200,"pressureTrend":"FALLING","windDirection":69,"uvIndex":0,"windSpeed":7.1892,"snowfallIntensity":0.0},{"daylight":false,"humidity":79,"pressure":990.97998,"temperature":11.34,"visibility":21981.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":4,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.828262,"windGust":15.4296,"temperatureApparent":9.860982,"cloudCover":74,"precipitationChance":0,"cloudCoverMidAltPct":48,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":67,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794574800,"pressureTrend":"FALLING","windDirection":83,"uvIndex":0,"windSpeed":9.0468,"snowfallIntensity":0.0},{"daylight":false,"humidity":74,"pressure":990.539978,"temperature":11.79,"visibility":26370.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":8,"perceivedPrecipitationIntensity":0.082,"precipitationIntensity":0.005,"temperatureDewPoint":7.305634,"windGust":17.848801,"temperatureApparent":11.730489,"cloudCover":100,"precipitationChance":5,"cloudCoverMidAltPct":95,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":98,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.005,"minimum":0.005,"maximum":0.005},"forecastStart":1794578400,"pressureTrend":"FALLING","windDirection":152,"uvIndex":0,"windSpeed":5.5908,"snowfallIntensity":0.0},{"daylight":false,"humidity":71,"pressure":989.789978,"temperature":12.85,"visibility":32347.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":6,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.719589,"windGust":25.4088,"temperatureApparent":11.529953,"cloudCover":97,"precipitationChance":0,"cloudCoverMidAltPct":92,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":97,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794582000,"pressureTrend":"FALLING","windDirection":107,"uvIndex":0,"windSpeed":9.324,"snowfallIntensity":0.0},{"daylight":true,"humidity":70,"pressure":990.130005,"temperature":13.64,"visibility":34072.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":24,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":8.26889,"windGust":31.352398,"temperatureApparent":10.051039,"cloudCover":99,"precipitationChance":0,"cloudCoverMidAltPct":96,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":56,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794585600,"pressureTrend":"FALLING","windDirection":131,"uvIndex":0,"windSpeed":15.263999,"snowfallIntensity":0.0},{"daylight":true,"humidity":80,"pressure":991.099976,"temperature":12.79,"visibility":20931.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":66,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":9.425461,"windGust":32.810402,"temperatureApparent":9.430462,"cloudCover":96,"precipitationChance":0,"cloudCoverMidAltPct":60,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":22,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794589200,"pressureTrend":"STEADY","windDirection":239,"uvIndex":0,"windSpeed":13.521601,"snowfallIntensity":0.0},{"daylight":true,"humidity":81,"pressure":991.559998,"temperature":13.02,"visibility":15831.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":39,"perceivedPrecipitationIntensity":0.568,"precipitationIntensity":0.252,"temperatureDewPoint":9.834717,"windGust":27.719999,"temperatureApparent":11.22246,"cloudCover":100,"precipitationChance":20,"cloudCoverMidAltPct":98,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":19,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.252,"minimum":0.252,"maximum":0.252},"forecastStart":1794592800,"pressureTrend":"RISING","windDirection":221,"uvIndex":1,"windSpeed":8.478,"snowfallIntensity":0.0},{"daylight":true,"humidity":82,"pressure":991.630005,"temperature":13.07,"visibility":16011.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":67,"perceivedPrecipitationIntensity":0.283,"precipitationIntensity":0.059,"temperatureDewPoint":10.066879,"windGust":30.477598,"temperatureApparent":10.538489,"cloudCover":100,"precipitationChance":23,"cloudCoverMidAltPct":96,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":34,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.059,"minimum":0.059,"maximum":0.059},"forecastStart":1794596400,"pressureTrend":"RISING","windDirection":194,"uvIndex":1,"windSpeed":10.5984,"snowfallIntensity":0.0},{"daylight":true,"humidity":82,"pressure":992.080017,"temperature":12.52,"visibility":16435.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":64,"perceivedPrecipitationIntensity":0.499,"precipitationIntensity":0.191,"temperatureDewPoint":9.529678,"windGust":31.676399,"temperatureApparent":9.236209,"cloudCover":100,"precipitationChance":35,"cloudCoverMidAltPct":97,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":99,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.191,"minimum":0.191,"maximum":0.191},"forecastStart":1794600000,"pressureTrend":"RISING","windDirection":206,"uvIndex":1,"windSpeed":12.549601,"snowfallIntensity":0.0},{"daylight":true,"humidity":84,"pressure":991.97998,"temperature":12.26,"visibility":12801.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":75,"perceivedPrecipitationIntensity":1.128,"precipitationIntensity":1.205,"temperatureDewPoint":9.634369,"windGust":28.656,"temperatureApparent":9.296653,"cloudCover":100,"precipitationChance":55,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.205,"minimum":1.205,"maximum":1.205},"forecastStart":1794603600,"pressureTrend":"STEADY","windDirection":201,"uvIndex":1,"windSpeed":11.6712,"snowfallIntensity":0.0},{"daylight":true,"humidity":85,"pressure":992.119995,"temperature":12.03,"visibility":9057.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":81,"perceivedPrecipitationIntensity":0.89,"precipitationIntensity":0.684,"temperatureDewPoint":9.585251,"windGust":26.046,"temperatureApparent":9.971526,"cloudCover":100,"precipitationChance":57,"cloudCoverMidAltPct":100,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":98,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.684,"minimum":0.684,"maximum":0.684},"forecastStart":1794607200,"pressureTrend":"STEADY","windDirection":194,"uvIndex":1,"windSpeed":9.234,"snowfallIntensity":0.0},{"daylight":true,"humidity":88,"pressure":992.48999,"temperature":11.76,"visibility":7366.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":1.135,"precipitationIntensity":1.224,"temperatureDewPoint":9.837143,"windGust":18.129601,"temperatureApparent":10.412608,"cloudCover":100,"precipitationChance":68,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":97,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.224,"minimum":1.224,"maximum":1.224},"forecastStart":1794610800,"pressureTrend":"STEADY","windDirection":180,"uvIndex":0,"windSpeed":7.7652,"snowfallIntensity":0.0},{"daylight":true,"humidity":90,"pressure":992.950012,"temperature":11.47,"visibility":6167.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":1.084,"precipitationIntensity":1.093,"temperatureDewPoint":9.886688,"windGust":17.326801,"temperatureApparent":11.056475,"cloudCover":100,"precipitationChance":68,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.093,"minimum":1.093,"maximum":1.093},"forecastStart":1794614400,"pressureTrend":"RISING","windDirection":158,"uvIndex":0,"windSpeed":6.4944,"snowfallIntensity":0.0},{"daylight":false,"humidity":90,"pressure":993.429993,"temperature":11.2,"visibility":10017.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":54,"perceivedPrecipitationIntensity":0.894,"precipitationIntensity":0.692,"temperatureDewPoint":9.620041,"windGust":19.764,"temperatureApparent":10.591156,"cloudCover":100,"precipitationChance":63,"cloudCoverMidAltPct":100,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":100,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.692,"minimum":0.692,"maximum":0.692},"forecastStart":1794618000,"pressureTrend":"RISING","windDirection":149,"uvIndex":0,"windSpeed":7.844399,"snowfallIntensity":0.0},{"daylight":false,"humidity":89,"pressure":993.809998,"temperature":10.85,"visibility":18581.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":39,"perceivedPrecipitationIntensity":0.274,"precipitationIntensity":0.055,"temperatureDewPoint":9.108414,"windGust":18.846001,"temperatureApparent":10.008285,"cloudCover":99,"precipitationChance":44,"cloudCoverMidAltPct":90,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":95,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.055,"minimum":0.055,"maximum":0.055},"forecastStart":1794621600,"pressureTrend":"RISING","windDirection":135,"uvIndex":0,"windSpeed":8.4348,"snowfallIntensity":0.0},{"daylight":false,"humidity":89,"pressure":994.340027,"temperature":10.49,"visibility":22953.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":17,"perceivedPrecipitationIntensity":0.203,"precipitationIntensity":0.03,"temperatureDewPoint":8.753342,"windGust":15.235199,"temperatureApparent":10.093671,"cloudCover":99,"precipitationChance":35,"cloudCoverMidAltPct":88,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.03,"minimum":0.03,"maximum":0.03},"forecastStart":1794625200,"pressureTrend":"RISING","windDirection":146,"uvIndex":0,"windSpeed":7.1712,"snowfallIntensity":0.0},{"daylight":false,"humidity":88,"pressure":994.849976,"temperature":10.28,"visibility":23999.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":23,"perceivedPrecipitationIntensity":0.352,"precipitationIntensity":0.092,"temperatureDewPoint":8.379349,"windGust":19.6416,"temperatureApparent":8.919455,"cloudCover":82,"precipitationChance":27,"cloudCoverMidAltPct":65,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.092,"minimum":0.092,"maximum":0.092},"forecastStart":1794628800,"pressureTrend":"RISING","windDirection":168,"uvIndex":0,"windSpeed":9.1692,"snowfallIntensity":0.0},{"daylight":false,"humidity":86,"pressure":995.400024,"temperature":10.2,"visibility":25448.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":38,"perceivedPrecipitationIntensity":0.192,"precipitationIntensity":0.027,"temperatureDewPoint":7.96196,"windGust":23.864401,"temperatureApparent":7.958751,"cloudCover":98,"precipitationChance":19,"cloudCoverMidAltPct":74,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.027,"minimum":0.027,"maximum":0.027},"forecastStart":1794632400,"pressureTrend":"RISING","windDirection":183,"uvIndex":0,"windSpeed":12.0564,"snowfallIntensity":0.0},{"daylight":false,"humidity":84,"pressure":996.070007,"temperature":10.02,"visibility":28076.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":33,"perceivedPrecipitationIntensity":0.242,"precipitationIntensity":0.043,"temperatureDewPoint":7.440018,"windGust":24.958801,"temperatureApparent":7.321218,"cloudCover":74,"precipitationChance":17,"cloudCoverMidAltPct":42,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.043,"minimum":0.043,"maximum":0.043},"forecastStart":1794636000,"pressureTrend":"RISING","windDirection":179,"uvIndex":0,"windSpeed":12.3696,"snowfallIntensity":0.0},{"daylight":false,"humidity":83,"pressure":996.48999,"temperature":9.93,"visibility":28703.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":62,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.176666,"windGust":28.184401,"temperatureApparent":7.196809,"cloudCover":93,"precipitationChance":0,"cloudCoverMidAltPct":58,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794639600,"pressureTrend":"RISING","windDirection":179,"uvIndex":0,"windSpeed":13.086,"snowfallIntensity":0.0},{"daylight":false,"humidity":82,"pressure":997.099976,"temperature":9.91,"visibility":22503.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":0.297,"precipitationIntensity":0.065,"temperatureDewPoint":6.980118,"windGust":36.504002,"temperatureApparent":5.957533,"cloudCover":83,"precipitationChance":13,"cloudCoverMidAltPct":68,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":31,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.065,"minimum":0.065,"maximum":0.065},"forecastStart":1794643200,"pressureTrend":"RISING","windDirection":188,"uvIndex":0,"windSpeed":16.254,"snowfallIntensity":0.0},{"daylight":false,"humidity":84,"pressure":997.929993,"temperature":9.78,"visibility":19336.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":62,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.20488,"windGust":36.144001,"temperatureApparent":5.642423,"cloudCover":79,"precipitationChance":0,"cloudCoverMidAltPct":45,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":20,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794646800,"pressureTrend":"RISING","windDirection":189,"uvIndex":0,"windSpeed":16.65,"snowfallIntensity":0.0},{"daylight":false,"humidity":86,"pressure":998.849976,"temperature":9.54,"visibility":16225.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":50,"perceivedPrecipitationIntensity":0.549,"precipitationIntensity":0.234,"temperatureDewPoint":7.313568,"windGust":32.5116,"temperatureApparent":5.722379,"cloudCover":59,"precipitationChance":24,"cloudCoverMidAltPct":30,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.234,"minimum":0.234,"maximum":0.234},"forecastStart":1794650400,"pressureTrend":"RISING","windDirection":186,"uvIndex":0,"windSpeed":14.9436,"snowfallIntensity":0.0}]},"forecastPeriodic":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"expireTime":1794573273,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"forecasts":[{"periods":[{"humidity":79,"daylight":false,"forecastEnd":1794582000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.85,"uvIndexMin":0,"temperatureApparentMin":9.818448,"windGustSpeedMax":25.4088,"perceivedPrecipitationIntensityMax":0.082,"uvIndexMax":0,"temperatureApparentMax":11.864366,"forecastStart":1794567600,"windDirection":101,"windSpeed":7.4943,"humidityMax":85,"precipitationAmountByType":[{"expected":0.005,"minimum":0.005,"maximum":0.005,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":5,"visibilityMax":32347.0,"cloudCover":88,"precipitationChance":24,"temperatureMin":10.94799,"cloudCoverMidAltPct":79,"precipitationIntensityMax":0.005,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":89,"humidityMin":71,"visibilityMin":19738.0,"precipitationType":["RAIN"],"windSpeedMax":9.324},{"humidity":77,"daylight":true,"forecastEnd":1794596400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":9.384322,"windGustSpeedMax":32.810402,"perceivedPrecipitationIntensityMax":0.568,"uvIndexMax":1,"temperatureApparentMax":11.529953,"forecastStart":1794582000,"windDirection":185,"windSpeed":11.8062,"humidityMax":82,"precipitationAmountByType":[{"expected":0.252,"minimum":0.252,"maximum":0.252,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":41,"visibilityMax":34072.0,"cloudCover":98,"precipitationChance":26,"temperatureMin":12.767698,"cloudCoverMidAltPct":87,"precipitationIntensityMax":0.252,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":41,"humidityMin":70,"visibilityMin":15831.0,"precipitationType":["RAIN"],"windSpeedMax":15.263999},{"humidity":84,"daylight":true,"forecastEnd":1794610800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.07,"uvIndexMin":0,"temperatureApparentMin":9.132,"windGustSpeedMax":31.676399,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":10.538489,"forecastStart":1794596400,"windDirection":198,"windSpeed":10.65915,"humidityMax":88,"precipitationAmountByType":[{"expected":2.139,"minimum":2.139,"maximum":2.139,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":71,"visibilityMax":16435.0,"cloudCover":100,"precipitationChance":68,"temperatureMin":11.76,"cloudCoverMidAltPct":99,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":90,"humidityMin":82,"visibilityMin":7366.0,"precipitationType":["RAIN"],"windSpeedMax":12.549601},{"humidity":89,"daylight":true,"forecastEnd":1794625200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.76,"uvIndexMin":0,"temperatureApparentMin":9.995345,"windGustSpeedMax":19.764,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":0,"temperatureApparentMax":11.058412,"forecastStart":1794610800,"windDirection":151,"windSpeed":7.560449,"humidityMax":90,"precipitationAmountByType":[{"expected":3.064,"minimum":3.064,"maximum":3.064,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":48,"visibilityMax":22953.0,"cloudCover":100,"precipitationChance":82,"temperatureMin":10.49,"cloudCoverMidAltPct":96,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":97,"humidityMin":88,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":8.4348},{"humidity":86,"daylight":false,"forecastEnd":1794639600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.49,"uvIndexMin":0,"temperatureApparentMin":7.196809,"windGustSpeedMax":28.184401,"perceivedPrecipitationIntensityMax":0.352,"uvIndexMax":0,"temperatureApparentMax":10.093671,"forecastStart":1794625200,"windDirection":175,"windSpeed":10.93095,"humidityMax":89,"precipitationAmountByType":[{"expected":0.192,"minimum":0.192,"maximum":0.192,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":33,"visibilityMax":28703.0,"cloudCover":88,"precipitationChance":49,"temperatureMin":9.93,"cloudCoverMidAltPct":64,"precipitationIntensityMax":0.092,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":72,"humidityMin":83,"visibilityMin":22953.0,"precipitationType":["RAIN"],"windSpeedMax":13.086},{"humidity":84,"daylight":false,"forecastEnd":1794654000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.93,"uvIndexMin":0,"temperatureApparentMin":5.604858,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":0.549,"uvIndexMax":0,"temperatureApparentMax":7.196809,"forecastStart":1794639600,"windDirection":186,"windSpeed":15.3558,"humidityMax":88,"precipitationAmountByType":[{"expected":0.299,"minimum":0.299,"maximum":0.299,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":56,"visibilityMax":28703.0,"cloudCover":74,"precipitationChance":28,"temperatureMin":9.2,"cloudCoverMidAltPct":47,"precipitationIntensityMax":0.234,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":21,"humidityMin":82,"visibilityMin":16225.0,"precipitationType":["RAIN"],"windSpeedMax":16.65}],"periodLength":4}]},"forecastNextHour":{"metadata":{"latitude":0,"longitude":0,"expireTime":1794571473,"sourceType":"MODELED","attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569673,"temporarilyUnavailable":false,"providerName":"US National Oceanic & Atmospheric Administration","reportedTime":1794569160},"condition":[{"parameters":[],"startTime":1794569640,"beginCondition":"CLEAR","forecastToken":"CLEAR","endCondition":"CLEAR"}],"summary":[{"condition":["CLEAR"],"precipitationChance":0,"startTime":1794569640,"precipitationIntensity":0.0}],"minutes":[{"precipitationChance":0,"startTime":1794569640,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569700,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569760,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569820,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569880,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569940,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570000,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570060,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570120,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570180,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570240,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570300,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570360,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570420,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570480,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570540,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570600,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570660,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570720,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570780,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570840,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570900,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570960,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571020,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571080,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571140,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571200,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571260,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571320,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571380,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571440,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571500,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571560,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571620,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571680,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571740,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571800,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571860,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571920,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571980,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572040,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572100,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572160,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572220,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572280,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572340,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572400,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572460,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572520,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572580,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572640,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572700,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572760,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572820,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572880,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572940,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573000,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573060,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573120,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573180,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573240,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573300,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573360,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573420,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573480,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573540,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573600,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573660,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573720,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573780,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573840,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573900,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573960,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574020,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574080,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574140,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574200,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574260,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574320,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574380,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574440,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574500,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0}],"forecastEnd":1794574560,"forecastStart":1794569640}} diff --git a/tests/fixtures/wk3-paired/seattle-repeat/manifest.json b/tests/fixtures/wk3-paired/seattle-repeat/manifest.json index 25d243cf..911b31ef 100644 --- a/tests/fixtures/wk3-paired/seattle-repeat/manifest.json +++ b/tests/fixtures/wk3-paired/seattle-repeat/manifest.json @@ -106,12 +106,24 @@ "method": "Only vtable-validated Metadata latitude/longitude floats and same-length coordinate URL digits replaced. No re-encoding." }, "sha256": { - "apple.json": "3df2e72858dcf0a192d81d3a08d7e8f853c655a4f7615a5d196bad7867cb010c", - "apple.bin": "93ef12a168e6a154f0ce6a6c30aa6e06297bd6cc6b8874e7489ff2dccaf74d36" + "apple.json": "e961c5e04f369cfd933b7b7c1065f87b918ffdaa8c01c55869226fc9925cd06a", + "apple.bin": "3614704af05dcb1c420ed4725bb8378f964e8df2b71150592389ae031e7d9ca1" }, "schema_source": { "weatherkit_dev": "cd9d7927094aff79906fe3430f339f39970ca46e", "protocol_tag": "v2.0.5", "protocol_commit": "c87c1dcd851ea9293141bcfb32fde1b2cca564b9" - } + }, + "additional_redactions": [ + { + "kind": "coordinate-url", + "offset": 13744, + "bytes": 75 + }, + { + "kind": "weather-alert-token", + "offset": 864, + "bytes": 22 + } + ] } diff --git a/tests/fixtures/wk3-paired/seattle/apple.bin b/tests/fixtures/wk3-paired/seattle/apple.bin index f08f425670f30b58a482ec223cb1e8ebb51f190e..e216730f72fbba7d18a91f39225ea4ec3bb23e95 100644 GIT binary patch delta 70 zcmcbSeIt8A0<&0|ms1V4!DUV4#+hpJ%HJWPmvZiA5!OsYSMl J1qC^&3;<5d7L))0 delta 70 zcmcbSeIt8A0<)O2zhiKSqffk>kH5c5yrWB)XRv=z8u ZBO^UyV1^_PR74!fA diff --git a/tests/fixtures/wk3-paired/seattle/apple.json b/tests/fixtures/wk3-paired/seattle/apple.json index fa3f8c5c..b7206dd4 100644 --- a/tests/fixtures/wk3-paired/seattle/apple.json +++ b/tests/fixtures/wk3-paired/seattle/apple.json @@ -1 +1 @@ -{"news":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"APPLE_INTERNAL","reportedTime":1794569484},"placements":[{"priority":2,"articles":[{"id":"A6ajisfZkSH-TzT_j18WQJQ","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How the UV index helps you know when it’s safe to have fun in the sun","alertIds":[]}],"placement":["UV_DETAILS"]},{"priority":2,"articles":[{"id":"AxDHjEelNRh-tGqDejqtusw","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How to prepare and stay safe if high winds are in your forecast","alertIds":[]}],"placement":["WIND_DETAILS"]},{"priority":2,"articles":[{"id":"A2uodtK8zT8qsl9ZTqOSsuw","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How to use the air quality index to protect yourself from pollution and smoke","alertIds":[]}],"placement":["AIR_QUALITY_DETAILS"]}]},"airQuality":{"metadata":{"latitude":0,"longitude":0,"expireTime":1794571344,"sourceType":"MODELED","attributionUrl":"https://dynamic-link.breezometer.com/?lat=47.606&lon=-122.332&partner=apple","readTime":1794569484,"temporarilyUnavailable":false,"providerName":"BreezoMeter","reportedTime":1794567600},"index":59,"pollutants":[{"amount":5.0,"units":"PARTS_PER_BILLION","pollutantType":"OZONE"},{"amount":14.707169,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"PM2_5"},{"amount":32.544106,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"PM10"},{"amount":300.0,"units":"PARTS_PER_BILLION","pollutantType":"CO"},{"amount":24.375298,"units":"PARTS_PER_BILLION","pollutantType":"NO2"},{"amount":5.560594,"units":"PARTS_PER_BILLION","pollutantType":"NO"},{"amount":0.8,"units":"PARTS_PER_BILLION","pollutantType":"SO2"},{"amount":23.047903,"units":"PARTS_PER_BILLION","pollutantType":"NOX"}],"scale":"EPA_NowCast.2604","primaryPollutant":"PM2_5","previousDayComparison":"SAME","categoryIndex":2,"isSignificant":false},"currentWeather":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794569784,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794569484},"daylight":false,"humidity":84,"pressure":992.954346,"temperature":11.190001,"visibility":20876.279297,"asOf":1794569484,"precipitationIntensity":0.0,"temperatureDewPoint":8.586227,"windGust":10.060907,"temperatureApparent":10.568842,"snowfallAmountPrevious6h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"snowfallAmountPrevious24h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountNext6hByType":[],"snowfallAmountNext24h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountPrevious6hByType":[],"snowfallAmountPrevious1h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"pressureTrend":"FALLING","windDirection":97,"windSpeed":7.087955,"cloudCoverLowAltPct":3,"perceivedPrecipitationIntensity":0.0,"precipitationAmountPrevious1hByType":[],"cloudCover":83,"precipitationAmountNext1hByType":[],"snowfallAmountNext1h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountPrevious24hByType":[],"cloudCoverMidAltPct":86,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":97,"snowfallAmountNext6h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"uvIndex":0,"precipitationAmountNext24hByType":[{"expected":5.981877,"minimum":5.981877,"maximum":5.981877,"precipitationType":["RAIN"]}]},"weatherChanges":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"changes":[{"forecastEnd":1794729600,"maxTemperatureChange":"STEADY","forecastStart":1794643200,"minTemperatureChange":"STEADY","dayPrecipitationChange":"DEC","nightPrecipitationChange":"INC"},{"forecastEnd":1794816000,"maxTemperatureChange":"STEADY","forecastStart":1794729600,"minTemperatureChange":"STEADY","dayPrecipitationChange":"INC","nightPrecipitationChange":"DEC"}],"forecastEnd":1794816000,"forecastStart":1794643200},"weatherAlerts":{"metadata":{"language":"en","latitude":0,"longitude":0,"expireTime":1794569784,"sourceType":"STATION","attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"temporarilyUnavailable":false,"providerName":"National Weather Service","reportedTime":1794538320},"alerts":[{"id":{"bytes":[190,12,153,147,104,54,83,236,165,44,137,30,51,142,238,251]},"description":"Coastal Flood Advisory","token":"COASTAL_FLOOD_ADVISORY","phenomenon":"Flood","severity":"MINOR","significance":"ADVISORY","source":"National Weather Service","urgency":"EXPECTED","certainty":"LIKELY","importance":"LOW","responses":["MONITOR"],"eventOnsetTime":1794578400,"detailsUrl":"https://weatherkit.apple.com/alertDetails/index.html?ids=be0c9993-6836-53ec-a52c-891e338eeefb&lang=en-US&timezone=America/Los_Angeles&party=apple","effectiveTime":1794538320,"issuedTime":1794538320,"eventSource":"US","areaId":"waz315","expireTime":1794574800,"countryCode":"US","eventEndTime":1794600000,"attributionUrl":"https://www.weather.gov"}],"detailsUrl":"https://weatherkit.apple.com/alertDetails/index.html?ids=be0c9993-6836-53ec-a52c-891e338eeefb&lang=en-US&timezone=America/Los_Angeles&party=apple"},"historicalComparisons":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"comparisons":[{"condition":"TEMPERATURE_MAX","deviation":"NORMAL","baselineValue":10.839996,"baselineStartDate":0,"currentValue":13.64015,"baselineType":"MEAN"},{"condition":"PRECIPITATION","deviation":"NORMAL","baselineValue":0.0,"baselineStartDate":0,"currentValue":0.0,"baselineType":"MEAN"}]},"forecastDaily":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"days":[{"moonrise":1794598874,"moonset":1794627382,"sunrise":1794582705,"sunset":1794616505,"forecastEnd":1794643200,"sunriseCivil":1794580706,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"solarMidnight":1794642825,"windSpeedAvg":9.337426,"temperatureMaxTime":1794585564,"windGustSpeedMax":36.504002,"sunriseAstronomical":1794576293,"forecastStart":1794556800,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":5.652,"minimum":5.652,"maximum":5.652,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794622910,"visibilityMax":34072.0,"precipitationChance":86,"temperatureMin":9.91,"maxUvIndex":1,"temperatureMinTime":1794643200,"sunsetNautical":1794620737,"daytimeForecast":{"humidity":83,"daylight":true,"forecastEnd":1794625200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":9.132,"windGustSpeedMax":32.810402,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":11.529953,"forecastStart":1794582000,"windDirection":181,"windSpeed":10.008599,"humidityMax":90,"precipitationAmountByType":[{"expected":5.455,"minimum":5.455,"maximum":5.455,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":53,"visibilityMax":34072.0,"cloudCover":99,"precipitationChance":79,"temperatureMin":10.49,"cloudCoverMidAltPct":94,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":76,"humidityMin":70,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":15.263999},"conditionCode":["RAIN"],"humidityMin":70,"solarNoon":1794599599,"visibilityMin":6167.0,"overnightForecast":{"humidity":86,"daylight":false,"forecastEnd":1794668400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.49,"uvIndexMin":0,"temperatureApparentMin":5.112798,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":0.549,"uvIndexMax":0,"temperatureApparentMax":10.093671,"forecastStart":1794625200,"windDirection":183,"windSpeed":13.7466,"humidityMax":89,"precipitationAmountByType":[{"expected":0.71,"minimum":0.71,"maximum":0.71,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":49,"visibilityMax":28703.0,"cloudCover":74,"precipitationChance":65,"temperatureMin":9.009192,"cloudCoverMidAltPct":49,"precipitationIntensityMax":0.234,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":31,"humidityMin":82,"visibilityMin":16190.0,"precipitationType":["RAIN"],"windSpeedMax":16.65},"precipitationType":["RAIN"],"sunriseNautical":1794578462,"sunsetCivil":1794618498,"windSpeedMax":16.254,"restOfDayForecast":{"humidity":83,"daylight":false,"forecastEnd":1794643200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":5.957533,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":11.864366,"forecastStart":1794569484,"windDirection":171,"windSpeed":10.001331,"humidityMax":90,"precipitationAmountByType":[{"expected":5.652,"minimum":5.652,"maximum":5.652,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":42,"visibilityMax":34072.0,"cloudCover":95,"precipitationChance":84,"temperatureMin":9.91,"cloudCoverMidAltPct":84,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":76,"humidityMin":70,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":16.254}},{"moonrise":1794687261,"moonset":1794717746,"sunrise":1794669195,"sunset":1794702834,"forecastEnd":1794729600,"sunriseCivil":1794667189,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.170017,"solarMidnight":1794729234,"windSpeedAvg":13.5183,"temperatureMaxTime":1794689975,"windGustSpeedMax":36.504002,"sunriseAstronomical":1794662769,"forecastStart":1794643200,"moonPhase":"WAXING_CRESCENT","humidityMax":88,"precipitationAmountByType":[{"expected":5.55,"minimum":5.55,"maximum":5.55,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794709253,"visibilityMax":29373.0,"precipitationChance":85,"temperatureMin":9.009192,"maxUvIndex":1,"temperatureMinTime":1794668269,"sunsetNautical":1794707078,"daytimeForecast":{"humidity":79,"daylight":true,"forecastEnd":1794711600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.170017,"uvIndexMin":0,"temperatureApparentMin":5.696423,"windGustSpeedMax":33.551998,"perceivedPrecipitationIntensityMax":0.503,"uvIndexMax":1,"temperatureApparentMax":9.767292,"forecastStart":1794668400,"windDirection":166,"windSpeed":13.39695,"humidityMax":86,"precipitationAmountByType":[{"expected":0.96,"minimum":0.96,"maximum":0.96,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":59,"visibilityMax":29373.0,"cloudCover":89,"precipitationChance":55,"temperatureMin":9.01,"cloudCoverMidAltPct":72,"precipitationIntensityMax":0.194,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":64,"humidityMin":76,"visibilityMin":15078.0,"precipitationType":["RAIN"],"windSpeedMax":14.860799},"conditionCode":["RAIN"],"humidityMin":76,"solarNoon":1794686008,"visibilityMin":4069.0,"overnightForecast":{"humidity":84,"daylight":false,"forecastEnd":1794754800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.48,"uvIndexMin":0,"temperatureApparentMin":5.973359,"windGustSpeedMax":38.952,"perceivedPrecipitationIntensityMax":1.473,"uvIndexMax":0,"temperatureApparentMax":9.430315,"forecastStart":1794711600,"windDirection":155,"windSpeed":14.398049,"humidityMax":88,"precipitationAmountByType":[{"expected":8.279,"minimum":8.279,"maximum":8.279,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":67,"visibilityMax":25393.0,"cloudCover":94,"precipitationChance":87,"temperatureMin":10.038711,"cloudCoverMidAltPct":84,"precipitationIntensityMax":2.419,"conditionCode":["RAIN"],"cloudCoverHighAltPct":31,"humidityMin":78,"visibilityMin":4069.0,"precipitationType":["RAIN"],"windSpeedMax":17.780401},"precipitationType":["RAIN"],"sunriseNautical":1794664941,"sunsetCivil":1794704834,"windSpeedMax":16.65},{"moonrise":1794775225,"moonset":1794808239,"sunrise":1794755684,"sunset":1794789166,"forecastEnd":1794816000,"sunriseCivil":1794753672,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.499799,"solarMidnight":1794815645,"windSpeedAvg":13.973175,"temperatureMaxTime":1794775537,"windGustSpeedMax":38.952,"sunriseAstronomical":1794749245,"forecastStart":1794729600,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":7.270999,"minimum":7.270999,"maximum":7.270999,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794795599,"visibilityMax":27960.0,"precipitationChance":94,"temperatureMin":7.48,"maxUvIndex":1,"temperatureMinTime":1794816000,"sunsetNautical":1794793421,"daytimeForecast":{"humidity":79,"daylight":true,"forecastEnd":1794798000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.499799,"uvIndexMin":0,"temperatureApparentMin":5.879239,"windGustSpeedMax":35.748001,"perceivedPrecipitationIntensityMax":0.775,"uvIndexMax":1,"temperatureApparentMax":9.362825,"forecastStart":1794754800,"windDirection":199,"windSpeed":15.284551,"humidityMax":86,"precipitationAmountByType":[{"expected":3.041,"minimum":3.041,"maximum":3.041,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":37,"visibilityMax":27960.0,"cloudCover":64,"precipitationChance":79,"temperatureMin":9.24,"cloudCoverMidAltPct":53,"precipitationIntensityMax":0.499,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":0,"humidityMin":73,"visibilityMin":13909.0,"precipitationType":["RAIN"],"windSpeedMax":18.6192},"conditionCode":["RAIN"],"humidityMin":73,"solarNoon":1794772418,"visibilityMin":7974.0,"overnightForecast":{"humidity":89,"daylight":false,"forecastEnd":1794841200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.24,"uvIndexMin":0,"temperatureApparentMin":4.984706,"windGustSpeedMax":20.1276,"perceivedPrecipitationIntensityMax":1.093,"uvIndexMax":0,"temperatureApparentMax":8.094274,"forecastStart":1794798000,"windDirection":167,"windSpeed":7.06065,"humidityMax":90,"precipitationAmountByType":[{"expected":2.986,"minimum":2.986,"maximum":2.986,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":36,"visibilityMax":26518.0,"cloudCover":63,"precipitationChance":51,"temperatureMin":6.209458,"cloudCoverMidAltPct":37,"precipitationIntensityMax":1.117,"conditionCode":["RAIN"],"cloudCoverHighAltPct":4,"humidityMin":83,"visibilityMin":16329.0,"precipitationType":["RAIN"],"windSpeedMax":8.186399},"precipitationType":["RAIN"],"sunriseNautical":1794751419,"sunsetCivil":1794791172,"windSpeedMax":18.6192},{"moonrise":1794862879,"moonset":1794898770,"sunrise":1794842173,"sunset":1794875500,"forecastEnd":1794902400,"sunriseCivil":1794840154,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.921954,"solarMidnight":1794902056,"windSpeedAvg":8.8203,"temperatureMaxTime":1794864861,"windGustSpeedMax":25.909199,"sunriseAstronomical":1794835720,"forecastStart":1794816000,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":4.384,"minimum":4.384,"maximum":4.384,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794881947,"visibilityMax":31734.0,"precipitationChance":67,"temperatureMin":6.209458,"maxUvIndex":1,"temperatureMinTime":1794840092,"sunsetNautical":1794879767,"daytimeForecast":{"humidity":80,"daylight":true,"forecastEnd":1794884400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.921954,"uvIndexMin":0,"temperatureApparentMin":5.026797,"windGustSpeedMax":25.909199,"perceivedPrecipitationIntensityMax":0.808,"uvIndexMax":1,"temperatureApparentMax":10.102699,"forecastStart":1794841200,"windDirection":182,"windSpeed":9.35655,"humidityMax":90,"precipitationAmountByType":[{"expected":0.895,"minimum":0.895,"maximum":0.895,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":45,"visibilityMax":31734.0,"cloudCover":73,"precipitationChance":36,"temperatureMin":6.24,"cloudCoverMidAltPct":57,"precipitationIntensityMax":0.548,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":16,"humidityMin":73,"visibilityMin":16596.0,"precipitationType":["RAIN"],"windSpeedMax":12.225599},"conditionCode":["RAIN"],"humidityMin":73,"solarNoon":1794858830,"visibilityMin":16329.0,"overnightForecast":{"humidity":88,"daylight":false,"forecastEnd":1794927600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.71,"uvIndexMin":0,"temperatureApparentMin":4.863145,"windGustSpeedMax":25.909199,"perceivedPrecipitationIntensityMax":0.751,"uvIndexMax":0,"temperatureApparentMax":6.049259,"forecastStart":1794884400,"windDirection":169,"windSpeed":8.89755,"humidityMax":89,"precipitationAmountByType":[{"expected":0.568,"minimum":0.568,"maximum":0.568,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":56,"visibilityMax":28122.0,"cloudCover":60,"precipitationChance":50,"temperatureMin":5.989975,"cloudCoverMidAltPct":7,"precipitationIntensityMax":0.465,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":1,"humidityMin":85,"visibilityMin":16596.0,"precipitationType":["RAIN"],"windSpeedMax":11.7612},"precipitationType":["RAIN"],"sunriseNautical":1794837897,"sunsetCivil":1794877511,"windSpeedMax":12.225599},{"moonrise":1794950358,"sunrise":1794928662,"sunset":1794961836,"forecastEnd":1794988800,"sunriseCivil":1794926635,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.845637,"solarMidnight":1794988468,"windSpeedAvg":6.440775,"temperatureMaxTime":1794953467,"windGustSpeedMax":18.273602,"sunriseAstronomical":1794922194,"forecastStart":1794902400,"moonPhase":"FIRST_QUARTER","humidityMax":89,"precipitationAmountByType":[{"expected":0.341,"minimum":0.341,"maximum":0.341,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794968297,"visibilityMax":29733.0,"precipitationChance":53,"temperatureMin":5.98,"maxUvIndex":1,"temperatureMinTime":1794988800,"sunsetNautical":1794966114,"daytimeForecast":{"humidity":72,"daylight":true,"forecastEnd":1794970800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.845637,"uvIndexMin":0,"temperatureApparentMin":5.082117,"windGustSpeedMax":17.006401,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":12.097757,"forecastStart":1794927600,"windDirection":154,"windSpeed":5.87355,"humidityMax":87,"precipitationAmountByType":[],"cloudCoverLowAltPct":15,"visibilityMax":29733.0,"cloudCover":29,"precipitationChance":0,"temperatureMin":6.13,"cloudCoverMidAltPct":1,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":6,"humidityMin":62,"visibilityMin":17780.0,"precipitationType":["CLEAR"],"windSpeedMax":7.1748},"conditionCode":["DRIZZLE"],"humidityMin":62,"solarNoon":1794945242,"visibilityMin":17780.0,"overnightForecast":{"humidity":82,"daylight":false,"forecastEnd":1795014000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.72,"uvIndexMin":0,"temperatureApparentMin":2.451838,"windGustSpeedMax":25.2936,"perceivedPrecipitationIntensityMax":0.95,"uvIndexMax":0,"temperatureApparentMax":7.151364,"forecastStart":1794970800,"windDirection":133,"windSpeed":7.62915,"humidityMax":89,"precipitationAmountByType":[{"expected":4.327,"minimum":4.327,"maximum":4.327,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":31,"visibilityMax":25857.0,"cloudCover":92,"precipitationChance":50,"temperatureMin":4.947516,"cloudCoverMidAltPct":66,"precipitationIntensityMax":0.798,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":89,"humidityMin":74,"visibilityMin":10859.0,"precipitationType":["RAIN"],"windSpeedMax":12.204},"precipitationType":["RAIN"],"sunriseNautical":1794924375,"sunsetCivil":1794963853,"windSpeedMax":8.9928},{"moonrise":1795037733,"moonset":1794989335,"sunrise":1795015150,"sunset":1795048175,"forecastEnd":1795075200,"sunriseCivil":1795013116,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.020019,"solarMidnight":1795074881,"windSpeedAvg":10.204425,"temperatureMaxTime":1795042826,"windGustSpeedMax":25.7724,"sunriseAstronomical":1795008667,"forecastStart":1794988800,"moonPhase":"WAXING_GIBBOUS","humidityMax":94,"precipitationAmountByType":[{"expected":6.641001,"minimum":6.641001,"maximum":6.641001,"precipitationType":["RAIN"]}],"sunsetAstronomical":1795054649,"visibilityMax":30421.0,"precipitationChance":74,"temperatureMin":4.947516,"maxUvIndex":1,"temperatureMinTime":1795009991,"sunsetNautical":1795052464,"daytimeForecast":{"humidity":81,"daylight":true,"forecastEnd":1795057200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.020019,"uvIndexMin":0,"temperatureApparentMin":2.416847,"windGustSpeedMax":25.7724,"perceivedPrecipitationIntensityMax":0.866,"uvIndexMax":1,"temperatureApparentMax":6.052989,"forecastStart":1795014000,"windDirection":182,"windSpeed":12.15015,"humidityMax":88,"precipitationAmountByType":[{"expected":2.276,"minimum":2.276,"maximum":2.276,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":60,"visibilityMax":30421.0,"cloudCover":82,"precipitationChance":66,"temperatureMin":5.11,"cloudCoverMidAltPct":76,"precipitationIntensityMax":0.643,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":50,"humidityMin":76,"visibilityMin":14677.0,"precipitationType":["RAIN"],"windSpeedMax":13.608},"conditionCode":["DRIZZLE"],"humidityMin":76,"solarNoon":1795031654,"visibilityMin":10859.0,"overnightForecast":{"humidity":92,"daylight":false,"forecastEnd":1795100400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.9,"uvIndexMin":0,"temperatureApparentMin":5.690445,"windGustSpeedMax":17.945999,"perceivedPrecipitationIntensityMax":0.327,"uvIndexMax":0,"temperatureApparentMax":6.35371,"forecastStart":1795057200,"windDirection":158,"windSpeed":5.645401,"humidityMax":95,"precipitationAmountByType":[{"expected":0.478,"minimum":0.478,"maximum":0.478,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":62,"visibilityMax":25229.0,"cloudCover":82,"precipitationChance":50,"temperatureMin":5.36,"cloudCoverMidAltPct":55,"precipitationIntensityMax":0.079,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":8,"humidityMin":82,"visibilityMin":12901.0,"precipitationType":["RAIN"],"windSpeedMax":9.774},"precipitationType":["RAIN"],"sunriseNautical":1795010851,"sunsetCivil":1795050198,"windSpeedMax":13.608},{"moonrise":1795125079,"moonset":1795079963,"sunrise":1795101637,"sunset":1795134515,"forecastEnd":1795161600,"sunriseCivil":1795099597,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.116987,"solarMidnight":1795161294,"windSpeedAvg":5.149725,"temperatureMaxTime":1795135920,"windGustSpeedMax":12.852,"sunriseAstronomical":1795095140,"forecastStart":1795075200,"moonPhase":"WAXING_GIBBOUS","humidityMax":96,"precipitationAmountByType":[{"expected":0.141,"minimum":0.141,"maximum":0.141,"precipitationType":["RAIN"]}],"sunsetAstronomical":1795141003,"visibilityMax":32204.0,"precipitationChance":53,"temperatureMin":5.36,"maxUvIndex":1,"temperatureMinTime":1795082400,"sunsetNautical":1795138815,"daytimeForecast":{"humidity":83,"daylight":true,"forecastEnd":1795143600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.116987,"uvIndexMin":0,"temperatureApparentMin":6.35371,"windGustSpeedMax":12.852,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":10.070161,"forecastStart":1795100400,"windDirection":4,"windSpeed":6.0135,"humidityMax":93,"precipitationAmountByType":[],"cloudCoverLowAltPct":44,"visibilityMax":32204.0,"cloudCover":63,"precipitationChance":0,"temperatureMin":6.03,"cloudCoverMidAltPct":2,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":0,"humidityMin":77,"visibilityMin":12901.0,"precipitationType":["CLEAR"],"windSpeedMax":7.8264},"conditionCode":["DRIZZLE"],"humidityMin":77,"solarNoon":1795118068,"visibilityMin":12901.0,"overnightForecast":{"humidity":94,"daylight":false,"forecastEnd":1795186800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.52,"uvIndexMin":0,"temperatureApparentMin":4.634763,"windGustSpeedMax":9.4392,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":8.422463,"forecastStart":1795143600,"windDirection":44,"windSpeed":3.7053,"humidityMax":97,"precipitationAmountByType":[],"cloudCoverLowAltPct":34,"visibilityMax":28680.0,"cloudCover":52,"precipitationChance":0,"temperatureMin":4.006788,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"humidityMin":85,"visibilityMin":9083.0,"precipitationType":["CLEAR"],"windSpeedMax":4.0212},"precipitationType":["RAIN"],"sunriseNautical":1795097328,"sunsetCivil":1795136544,"windSpeedMax":7.8264},{"moonrise":1795212479,"moonset":1795170725,"sunrise":1795188123,"sunset":1795220858,"forecastEnd":1795248000,"sunriseCivil":1795186076,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.763362,"solarMidnight":1795247709,"windSpeedAvg":4.930575,"temperatureMaxTime":1795216005,"windGustSpeedMax":14.482799,"sunriseAstronomical":1795181613,"forecastStart":1795161600,"moonPhase":"WAXING_GIBBOUS","humidityMax":97,"precipitationAmountByType":[],"sunsetAstronomical":1795227360,"visibilityMax":17821.0,"precipitationChance":0,"temperatureMin":4.006788,"maxUvIndex":1,"temperatureMinTime":1795177699,"sunsetNautical":1795225170,"daytimeForecast":{"humidity":77,"daylight":true,"forecastEnd":1795230000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.763362,"uvIndexMin":0,"temperatureApparentMin":5.128633,"windGustSpeedMax":14.482799,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":11.921696,"forecastStart":1795186800,"windDirection":9,"windSpeed":6.00165,"humidityMax":92,"precipitationAmountByType":[],"cloudCoverLowAltPct":16,"visibilityMax":13937.0,"cloudCover":19,"precipitationChance":0,"temperatureMin":4.73,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":69,"visibilityMin":9448.0,"precipitationType":["CLEAR"],"windSpeedMax":7.5348},"conditionCode":["MOSTLY_CLEAR"],"humidityMin":69,"solarNoon":1795204483,"visibilityMin":9083.0,"overnightForecast":{"humidity":78,"daylight":false,"forecastEnd":1795273200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.8,"uvIndexMin":0,"temperatureApparentMin":3.108699,"windGustSpeedMax":12.618,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":6.648598,"forecastStart":1795230000,"windDirection":63,"windSpeed":5.1837,"humidityMax":84,"precipitationAmountByType":[],"cloudCoverLowAltPct":7,"visibilityMax":24474.0,"cloudCover":10,"precipitationChance":0,"temperatureMin":4.249874,"cloudCoverMidAltPct":1,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":3,"humidityMin":66,"visibilityMin":13937.0,"precipitationType":["CLEAR"],"windSpeedMax":6.4764},"precipitationType":["CLEAR"],"sunriseNautical":1795183803,"sunsetCivil":1795222893,"windSpeedMax":7.5348},{"moonrise":1795300029,"moonset":1795261701,"sunrise":1795274609,"sunset":1795307204,"forecastEnd":1795334400,"sunriseCivil":1795272555,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.168908,"solarMidnight":1795334124,"windSpeedAvg":5.365725,"temperatureMaxTime":1795299642,"windGustSpeedMax":13.5252,"sunriseAstronomical":1795268084,"forecastStart":1795248000,"moonPhase":"WAXING_GIBBOUS","humidityMax":83,"precipitationAmountByType":[],"sunsetAstronomical":1795313719,"visibilityMax":26954.0,"precipitationChance":0,"temperatureMin":4.249874,"maxUvIndex":1,"temperatureMinTime":1795255291,"sunsetNautical":1795311526,"daytimeForecast":{"humidity":62,"daylight":true,"forecastEnd":1795316400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.168908,"uvIndexMin":0,"temperatureApparentMin":4.959615,"windGustSpeedMax":12.459599,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":13.309563,"forecastStart":1795273200,"windDirection":135,"windSpeed":4.4259,"humidityMax":66,"precipitationAmountByType":[],"cloudCoverLowAltPct":2,"visibilityMax":26954.0,"cloudCover":19,"precipitationChance":0,"temperatureMin":6.57,"cloudCoverMidAltPct":17,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":60,"visibilityMin":8662.0,"precipitationType":["CLEAR"],"windSpeedMax":6.372},"conditionCode":["MOSTLY_CLEAR"],"humidityMin":60,"solarNoon":1795290898,"visibilityMin":8662.0,"overnightForecast":{"humidity":71,"daylight":false,"forecastEnd":1795359600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.71,"uvIndexMin":0,"temperatureApparentMin":3.380726,"windGustSpeedMax":13.5252,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":7.205438,"forecastStart":1795316400,"windDirection":154,"windSpeed":5.82615,"humidityMax":77,"precipitationAmountByType":[],"cloudCoverLowAltPct":0,"visibilityMax":22708.0,"cloudCover":12,"precipitationChance":0,"temperatureMin":4.10744,"cloudCoverMidAltPct":4,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":64,"visibilityMin":10503.0,"precipitationType":["CLEAR"],"windSpeedMax":7.487999},"precipitationType":["CLEAR"],"sunriseNautical":1795270278,"sunsetCivil":1795309245,"windSpeedMax":7.487999}]},"forecastHourly":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"hours":[{"daylight":false,"humidity":85,"pressure":993.530029,"temperature":11.51,"visibility":22126.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":1,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":9.07518,"windGust":6.9768,"temperatureApparent":10.747892,"cloudCover":68,"precipitationChance":0,"cloudCoverMidAltPct":89,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":100,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794567600,"pressureTrend":"FALLING","windDirection":131,"uvIndex":0,"windSpeed":6.9768,"snowfallIntensity":0.0},{"daylight":false,"humidity":83,"pressure":992.429993,"temperature":10.95,"visibility":19738.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":4,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":8.174545,"windGust":12.87,"temperatureApparent":10.448459,"cloudCover":96,"precipitationChance":0,"cloudCoverMidAltPct":83,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":94,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794571200,"pressureTrend":"FALLING","windDirection":69,"uvIndex":0,"windSpeed":7.1892,"snowfallIntensity":0.0},{"daylight":false,"humidity":79,"pressure":990.97998,"temperature":11.34,"visibility":21981.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":4,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.828262,"windGust":15.4296,"temperatureApparent":9.860982,"cloudCover":74,"precipitationChance":0,"cloudCoverMidAltPct":48,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":67,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794574800,"pressureTrend":"FALLING","windDirection":83,"uvIndex":0,"windSpeed":9.0468,"snowfallIntensity":0.0},{"daylight":false,"humidity":74,"pressure":990.539978,"temperature":11.79,"visibility":26370.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":8,"perceivedPrecipitationIntensity":0.082,"precipitationIntensity":0.005,"temperatureDewPoint":7.305634,"windGust":17.848801,"temperatureApparent":11.730489,"cloudCover":100,"precipitationChance":5,"cloudCoverMidAltPct":95,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":98,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.005,"minimum":0.005,"maximum":0.005},"forecastStart":1794578400,"pressureTrend":"FALLING","windDirection":152,"uvIndex":0,"windSpeed":5.5908,"snowfallIntensity":0.0},{"daylight":false,"humidity":71,"pressure":989.789978,"temperature":12.85,"visibility":32347.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":6,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.719589,"windGust":25.4088,"temperatureApparent":11.529953,"cloudCover":97,"precipitationChance":0,"cloudCoverMidAltPct":92,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":97,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794582000,"pressureTrend":"FALLING","windDirection":107,"uvIndex":0,"windSpeed":9.324,"snowfallIntensity":0.0},{"daylight":true,"humidity":70,"pressure":990.130005,"temperature":13.64,"visibility":34072.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":24,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":8.26889,"windGust":31.352398,"temperatureApparent":10.051039,"cloudCover":99,"precipitationChance":0,"cloudCoverMidAltPct":96,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":56,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794585600,"pressureTrend":"FALLING","windDirection":131,"uvIndex":0,"windSpeed":15.263999,"snowfallIntensity":0.0},{"daylight":true,"humidity":80,"pressure":991.099976,"temperature":12.79,"visibility":20931.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":66,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":9.425461,"windGust":32.810402,"temperatureApparent":9.430462,"cloudCover":96,"precipitationChance":0,"cloudCoverMidAltPct":60,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":22,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794589200,"pressureTrend":"STEADY","windDirection":239,"uvIndex":0,"windSpeed":13.521601,"snowfallIntensity":0.0},{"daylight":true,"humidity":81,"pressure":991.559998,"temperature":13.02,"visibility":15831.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":39,"perceivedPrecipitationIntensity":0.568,"precipitationIntensity":0.252,"temperatureDewPoint":9.834717,"windGust":27.719999,"temperatureApparent":11.22246,"cloudCover":100,"precipitationChance":20,"cloudCoverMidAltPct":98,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":19,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.252,"minimum":0.252,"maximum":0.252},"forecastStart":1794592800,"pressureTrend":"RISING","windDirection":221,"uvIndex":1,"windSpeed":8.478,"snowfallIntensity":0.0},{"daylight":true,"humidity":82,"pressure":991.630005,"temperature":13.07,"visibility":16011.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":67,"perceivedPrecipitationIntensity":0.283,"precipitationIntensity":0.059,"temperatureDewPoint":10.066879,"windGust":30.477598,"temperatureApparent":10.538489,"cloudCover":100,"precipitationChance":23,"cloudCoverMidAltPct":96,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":34,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.059,"minimum":0.059,"maximum":0.059},"forecastStart":1794596400,"pressureTrend":"RISING","windDirection":194,"uvIndex":1,"windSpeed":10.5984,"snowfallIntensity":0.0},{"daylight":true,"humidity":82,"pressure":992.080017,"temperature":12.52,"visibility":16435.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":64,"perceivedPrecipitationIntensity":0.499,"precipitationIntensity":0.191,"temperatureDewPoint":9.529678,"windGust":31.676399,"temperatureApparent":9.236209,"cloudCover":100,"precipitationChance":35,"cloudCoverMidAltPct":97,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":99,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.191,"minimum":0.191,"maximum":0.191},"forecastStart":1794600000,"pressureTrend":"RISING","windDirection":206,"uvIndex":1,"windSpeed":12.549601,"snowfallIntensity":0.0},{"daylight":true,"humidity":84,"pressure":991.97998,"temperature":12.26,"visibility":12801.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":75,"perceivedPrecipitationIntensity":1.128,"precipitationIntensity":1.205,"temperatureDewPoint":9.634369,"windGust":28.656,"temperatureApparent":9.296653,"cloudCover":100,"precipitationChance":55,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.205,"minimum":1.205,"maximum":1.205},"forecastStart":1794603600,"pressureTrend":"STEADY","windDirection":201,"uvIndex":1,"windSpeed":11.6712,"snowfallIntensity":0.0},{"daylight":true,"humidity":85,"pressure":992.119995,"temperature":12.03,"visibility":9057.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":81,"perceivedPrecipitationIntensity":0.89,"precipitationIntensity":0.684,"temperatureDewPoint":9.585251,"windGust":26.046,"temperatureApparent":9.971526,"cloudCover":100,"precipitationChance":57,"cloudCoverMidAltPct":100,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":98,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.684,"minimum":0.684,"maximum":0.684},"forecastStart":1794607200,"pressureTrend":"STEADY","windDirection":194,"uvIndex":1,"windSpeed":9.234,"snowfallIntensity":0.0},{"daylight":true,"humidity":88,"pressure":992.48999,"temperature":11.76,"visibility":7366.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":1.135,"precipitationIntensity":1.224,"temperatureDewPoint":9.837143,"windGust":18.129601,"temperatureApparent":10.412608,"cloudCover":100,"precipitationChance":68,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":97,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.224,"minimum":1.224,"maximum":1.224},"forecastStart":1794610800,"pressureTrend":"STEADY","windDirection":180,"uvIndex":0,"windSpeed":7.7652,"snowfallIntensity":0.0},{"daylight":true,"humidity":90,"pressure":992.950012,"temperature":11.47,"visibility":6167.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":1.084,"precipitationIntensity":1.093,"temperatureDewPoint":9.886688,"windGust":17.326801,"temperatureApparent":11.056475,"cloudCover":100,"precipitationChance":68,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.093,"minimum":1.093,"maximum":1.093},"forecastStart":1794614400,"pressureTrend":"RISING","windDirection":158,"uvIndex":0,"windSpeed":6.4944,"snowfallIntensity":0.0},{"daylight":false,"humidity":90,"pressure":993.429993,"temperature":11.2,"visibility":10017.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":54,"perceivedPrecipitationIntensity":0.894,"precipitationIntensity":0.692,"temperatureDewPoint":9.620041,"windGust":19.764,"temperatureApparent":10.591156,"cloudCover":100,"precipitationChance":63,"cloudCoverMidAltPct":100,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":100,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.692,"minimum":0.692,"maximum":0.692},"forecastStart":1794618000,"pressureTrend":"RISING","windDirection":149,"uvIndex":0,"windSpeed":7.844399,"snowfallIntensity":0.0},{"daylight":false,"humidity":89,"pressure":993.809998,"temperature":10.85,"visibility":18581.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":39,"perceivedPrecipitationIntensity":0.274,"precipitationIntensity":0.055,"temperatureDewPoint":9.108414,"windGust":18.846001,"temperatureApparent":10.008285,"cloudCover":99,"precipitationChance":44,"cloudCoverMidAltPct":90,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":95,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.055,"minimum":0.055,"maximum":0.055},"forecastStart":1794621600,"pressureTrend":"RISING","windDirection":135,"uvIndex":0,"windSpeed":8.4348,"snowfallIntensity":0.0},{"daylight":false,"humidity":89,"pressure":994.340027,"temperature":10.49,"visibility":22953.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":17,"perceivedPrecipitationIntensity":0.203,"precipitationIntensity":0.03,"temperatureDewPoint":8.753342,"windGust":15.235199,"temperatureApparent":10.093671,"cloudCover":99,"precipitationChance":35,"cloudCoverMidAltPct":88,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.03,"minimum":0.03,"maximum":0.03},"forecastStart":1794625200,"pressureTrend":"RISING","windDirection":146,"uvIndex":0,"windSpeed":7.1712,"snowfallIntensity":0.0},{"daylight":false,"humidity":88,"pressure":994.849976,"temperature":10.28,"visibility":23999.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":23,"perceivedPrecipitationIntensity":0.352,"precipitationIntensity":0.092,"temperatureDewPoint":8.379349,"windGust":19.6416,"temperatureApparent":8.919455,"cloudCover":82,"precipitationChance":27,"cloudCoverMidAltPct":65,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.092,"minimum":0.092,"maximum":0.092},"forecastStart":1794628800,"pressureTrend":"RISING","windDirection":168,"uvIndex":0,"windSpeed":9.1692,"snowfallIntensity":0.0},{"daylight":false,"humidity":86,"pressure":995.400024,"temperature":10.2,"visibility":25448.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":38,"perceivedPrecipitationIntensity":0.192,"precipitationIntensity":0.027,"temperatureDewPoint":7.96196,"windGust":23.864401,"temperatureApparent":7.958751,"cloudCover":98,"precipitationChance":19,"cloudCoverMidAltPct":74,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.027,"minimum":0.027,"maximum":0.027},"forecastStart":1794632400,"pressureTrend":"RISING","windDirection":183,"uvIndex":0,"windSpeed":12.0564,"snowfallIntensity":0.0},{"daylight":false,"humidity":84,"pressure":996.070007,"temperature":10.02,"visibility":28076.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":33,"perceivedPrecipitationIntensity":0.242,"precipitationIntensity":0.043,"temperatureDewPoint":7.440018,"windGust":24.958801,"temperatureApparent":7.321218,"cloudCover":74,"precipitationChance":17,"cloudCoverMidAltPct":42,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.043,"minimum":0.043,"maximum":0.043},"forecastStart":1794636000,"pressureTrend":"RISING","windDirection":179,"uvIndex":0,"windSpeed":12.3696,"snowfallIntensity":0.0},{"daylight":false,"humidity":83,"pressure":996.48999,"temperature":9.93,"visibility":28703.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":62,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.176666,"windGust":28.184401,"temperatureApparent":7.196809,"cloudCover":93,"precipitationChance":0,"cloudCoverMidAltPct":58,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794639600,"pressureTrend":"RISING","windDirection":179,"uvIndex":0,"windSpeed":13.086,"snowfallIntensity":0.0},{"daylight":false,"humidity":82,"pressure":997.099976,"temperature":9.91,"visibility":22503.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":0.297,"precipitationIntensity":0.065,"temperatureDewPoint":6.980118,"windGust":36.504002,"temperatureApparent":5.957533,"cloudCover":83,"precipitationChance":13,"cloudCoverMidAltPct":68,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":31,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.065,"minimum":0.065,"maximum":0.065},"forecastStart":1794643200,"pressureTrend":"RISING","windDirection":188,"uvIndex":0,"windSpeed":16.254,"snowfallIntensity":0.0},{"daylight":false,"humidity":84,"pressure":997.929993,"temperature":9.78,"visibility":19336.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":62,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.20488,"windGust":36.144001,"temperatureApparent":5.642423,"cloudCover":79,"precipitationChance":0,"cloudCoverMidAltPct":45,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":20,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794646800,"pressureTrend":"RISING","windDirection":189,"uvIndex":0,"windSpeed":16.65,"snowfallIntensity":0.0},{"daylight":false,"humidity":86,"pressure":998.849976,"temperature":9.54,"visibility":16225.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":50,"perceivedPrecipitationIntensity":0.549,"precipitationIntensity":0.234,"temperatureDewPoint":7.313568,"windGust":32.5116,"temperatureApparent":5.722379,"cloudCover":59,"precipitationChance":24,"cloudCoverMidAltPct":30,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.234,"minimum":0.234,"maximum":0.234},"forecastStart":1794650400,"pressureTrend":"RISING","windDirection":186,"uvIndex":0,"windSpeed":14.9436,"snowfallIntensity":0.0}]},"forecastPeriodic":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"forecasts":[{"periods":[{"humidity":79,"daylight":false,"forecastEnd":1794582000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.85,"uvIndexMin":0,"temperatureApparentMin":9.818448,"windGustSpeedMax":25.4088,"perceivedPrecipitationIntensityMax":0.082,"uvIndexMax":0,"temperatureApparentMax":11.864366,"forecastStart":1794567600,"windDirection":101,"windSpeed":7.4943,"humidityMax":85,"precipitationAmountByType":[{"expected":0.005,"minimum":0.005,"maximum":0.005,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":5,"visibilityMax":32347.0,"cloudCover":88,"precipitationChance":24,"temperatureMin":10.94799,"cloudCoverMidAltPct":79,"precipitationIntensityMax":0.005,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":89,"humidityMin":71,"visibilityMin":19738.0,"precipitationType":["RAIN"],"windSpeedMax":9.324},{"humidity":77,"daylight":true,"forecastEnd":1794596400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":9.384322,"windGustSpeedMax":32.810402,"perceivedPrecipitationIntensityMax":0.568,"uvIndexMax":1,"temperatureApparentMax":11.529953,"forecastStart":1794582000,"windDirection":185,"windSpeed":11.8062,"humidityMax":82,"precipitationAmountByType":[{"expected":0.252,"minimum":0.252,"maximum":0.252,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":41,"visibilityMax":34072.0,"cloudCover":98,"precipitationChance":26,"temperatureMin":12.767698,"cloudCoverMidAltPct":87,"precipitationIntensityMax":0.252,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":41,"humidityMin":70,"visibilityMin":15831.0,"precipitationType":["RAIN"],"windSpeedMax":15.263999},{"humidity":84,"daylight":true,"forecastEnd":1794610800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.07,"uvIndexMin":0,"temperatureApparentMin":9.132,"windGustSpeedMax":31.676399,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":10.538489,"forecastStart":1794596400,"windDirection":198,"windSpeed":10.65915,"humidityMax":88,"precipitationAmountByType":[{"expected":2.139,"minimum":2.139,"maximum":2.139,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":71,"visibilityMax":16435.0,"cloudCover":100,"precipitationChance":68,"temperatureMin":11.76,"cloudCoverMidAltPct":99,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":90,"humidityMin":82,"visibilityMin":7366.0,"precipitationType":["RAIN"],"windSpeedMax":12.549601},{"humidity":89,"daylight":true,"forecastEnd":1794625200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.76,"uvIndexMin":0,"temperatureApparentMin":9.995345,"windGustSpeedMax":19.764,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":0,"temperatureApparentMax":11.058412,"forecastStart":1794610800,"windDirection":151,"windSpeed":7.560449,"humidityMax":90,"precipitationAmountByType":[{"expected":3.064,"minimum":3.064,"maximum":3.064,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":48,"visibilityMax":22953.0,"cloudCover":100,"precipitationChance":82,"temperatureMin":10.49,"cloudCoverMidAltPct":96,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":97,"humidityMin":88,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":8.4348},{"humidity":86,"daylight":false,"forecastEnd":1794639600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.49,"uvIndexMin":0,"temperatureApparentMin":7.196809,"windGustSpeedMax":28.184401,"perceivedPrecipitationIntensityMax":0.352,"uvIndexMax":0,"temperatureApparentMax":10.093671,"forecastStart":1794625200,"windDirection":175,"windSpeed":10.93095,"humidityMax":89,"precipitationAmountByType":[{"expected":0.192,"minimum":0.192,"maximum":0.192,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":33,"visibilityMax":28703.0,"cloudCover":88,"precipitationChance":49,"temperatureMin":9.93,"cloudCoverMidAltPct":64,"precipitationIntensityMax":0.092,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":72,"humidityMin":83,"visibilityMin":22953.0,"precipitationType":["RAIN"],"windSpeedMax":13.086},{"humidity":84,"daylight":false,"forecastEnd":1794654000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.93,"uvIndexMin":0,"temperatureApparentMin":5.604858,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":0.549,"uvIndexMax":0,"temperatureApparentMax":7.196809,"forecastStart":1794639600,"windDirection":186,"windSpeed":15.3558,"humidityMax":88,"precipitationAmountByType":[{"expected":0.299,"minimum":0.299,"maximum":0.299,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":56,"visibilityMax":28703.0,"cloudCover":74,"precipitationChance":28,"temperatureMin":9.2,"cloudCoverMidAltPct":47,"precipitationIntensityMax":0.234,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":21,"humidityMin":82,"visibilityMin":16225.0,"precipitationType":["RAIN"],"windSpeedMax":16.65}],"periodLength":4}]},"forecastNextHour":{"metadata":{"latitude":0,"longitude":0,"expireTime":1794571284,"sourceType":"MODELED","attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"temporarilyUnavailable":false,"providerName":"US National Oceanic & Atmospheric Administration","reportedTime":1794568920},"condition":[{"parameters":[],"startTime":1794569460,"beginCondition":"CLEAR","forecastToken":"CLEAR","endCondition":"CLEAR"}],"summary":[{"condition":["CLEAR"],"precipitationChance":0,"startTime":1794569460,"precipitationIntensity":0.0}],"minutes":[{"precipitationChance":0,"startTime":1794569460,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569520,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569580,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569640,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569700,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569760,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569820,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569880,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569940,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570000,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570060,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570120,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570180,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570240,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570300,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570360,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570420,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570480,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570540,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570600,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570660,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570720,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570780,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570840,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570900,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570960,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571020,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571080,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571140,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571200,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571260,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571320,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571380,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571440,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571500,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571560,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571620,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571680,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571740,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571800,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571860,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571920,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571980,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572040,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572100,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572160,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572220,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572280,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572340,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572400,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572460,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572520,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572580,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572640,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572700,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572760,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572820,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572880,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572940,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573000,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573060,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573120,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573180,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573240,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573300,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573360,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573420,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573480,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573540,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573600,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573660,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573720,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573780,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573840,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573900,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573960,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574020,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574080,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574140,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574200,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574260,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0}],"forecastEnd":1794574320,"forecastStart":1794569460}} +{"news":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"APPLE_INTERNAL","reportedTime":1794569484},"placements":[{"priority":2,"articles":[{"id":"A6ajisfZkSH-TzT_j18WQJQ","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How the UV index helps you know when it’s safe to have fun in the sun","alertIds":[]}],"placement":["UV_DETAILS"]},{"priority":2,"articles":[{"id":"AxDHjEelNRh-tGqDejqtusw","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How to prepare and stay safe if high winds are in your forecast","alertIds":[]}],"placement":["WIND_DETAILS"]},{"priority":2,"articles":[{"id":"A2uodtK8zT8qsl9ZTqOSsuw","phenomena":[],"locale":"en_US","supportedStorefronts":["143441","143444","143455","143460"],"headlineOverride":"How to use the air quality index to protect yourself from pollution and smoke","alertIds":[]}],"placement":["AIR_QUALITY_DETAILS"]}]},"airQuality":{"metadata":{"latitude":0,"longitude":0,"expireTime":1794571344,"sourceType":"MODELED","attributionUrl":"https://dynamic-link.breezometer.com/?lat=00.000&lon=-000.000&partner=apple","readTime":1794569484,"temporarilyUnavailable":false,"providerName":"BreezoMeter","reportedTime":1794567600},"index":59,"pollutants":[{"amount":5.0,"units":"PARTS_PER_BILLION","pollutantType":"OZONE"},{"amount":14.707169,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"PM2_5"},{"amount":32.544106,"units":"MICROGRAMS_PER_CUBIC_METER","pollutantType":"PM10"},{"amount":300.0,"units":"PARTS_PER_BILLION","pollutantType":"CO"},{"amount":24.375298,"units":"PARTS_PER_BILLION","pollutantType":"NO2"},{"amount":5.560594,"units":"PARTS_PER_BILLION","pollutantType":"NO"},{"amount":0.8,"units":"PARTS_PER_BILLION","pollutantType":"SO2"},{"amount":23.047903,"units":"PARTS_PER_BILLION","pollutantType":"NOX"}],"scale":"EPA_NowCast.2604","primaryPollutant":"PM2_5","previousDayComparison":"SAME","categoryIndex":2,"isSignificant":false},"currentWeather":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794569784,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794569484},"daylight":false,"humidity":84,"pressure":992.954346,"temperature":11.190001,"visibility":20876.279297,"asOf":1794569484,"precipitationIntensity":0.0,"temperatureDewPoint":8.586227,"windGust":10.060907,"temperatureApparent":10.568842,"snowfallAmountPrevious6h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"snowfallAmountPrevious24h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountNext6hByType":[],"snowfallAmountNext24h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountPrevious6hByType":[],"snowfallAmountPrevious1h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"pressureTrend":"FALLING","windDirection":97,"windSpeed":7.087955,"cloudCoverLowAltPct":3,"perceivedPrecipitationIntensity":0.0,"precipitationAmountPrevious1hByType":[],"cloudCover":83,"precipitationAmountNext1hByType":[],"snowfallAmountNext1h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"precipitationAmountPrevious24hByType":[],"cloudCoverMidAltPct":86,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":97,"snowfallAmountNext6h":{"expected":0.0,"minimum":0.0,"maximum":0.0},"uvIndex":0,"precipitationAmountNext24hByType":[{"expected":5.981877,"minimum":5.981877,"maximum":5.981877,"precipitationType":["RAIN"]}]},"weatherChanges":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"changes":[{"forecastEnd":1794729600,"maxTemperatureChange":"STEADY","forecastStart":1794643200,"minTemperatureChange":"STEADY","dayPrecipitationChange":"DEC","nightPrecipitationChange":"INC"},{"forecastEnd":1794816000,"maxTemperatureChange":"STEADY","forecastStart":1794729600,"minTemperatureChange":"STEADY","dayPrecipitationChange":"INC","nightPrecipitationChange":"DEC"}],"forecastEnd":1794816000,"forecastStart":1794643200},"weatherAlerts":{"metadata":{"language":"en","latitude":0,"longitude":0,"expireTime":1794569784,"sourceType":"STATION","attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"temporarilyUnavailable":false,"providerName":"National Weather Service","reportedTime":1794538320},"alerts":[{"id":{"bytes":[190,12,153,147,104,54,83,236,165,44,137,30,51,142,238,251]},"description":"Coastal Flood Advisory","token":"REDACTED______________","phenomenon":"Flood","severity":"MINOR","significance":"ADVISORY","source":"National Weather Service","urgency":"EXPECTED","certainty":"LIKELY","importance":"LOW","responses":["MONITOR"],"eventOnsetTime":1794578400,"detailsUrl":"https://weatherkit.apple.com/alertDetails/index.html?ids=be0c9993-6836-53ec-a52c-891e338eeefb&lang=en-US&timezone=America/Los_Angeles&party=apple","effectiveTime":1794538320,"issuedTime":1794538320,"eventSource":"US","areaId":"waz315","expireTime":1794574800,"countryCode":"US","eventEndTime":1794600000,"attributionUrl":"https://www.weather.gov"}],"detailsUrl":"https://weatherkit.apple.com/alertDetails/index.html?ids=be0c9993-6836-53ec-a52c-891e338eeefb&lang=en-US&timezone=America/Los_Angeles&party=apple"},"historicalComparisons":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"comparisons":[{"condition":"TEMPERATURE_MAX","deviation":"NORMAL","baselineValue":10.839996,"baselineStartDate":0,"currentValue":13.64015,"baselineType":"MEAN"},{"condition":"PRECIPITATION","deviation":"NORMAL","baselineValue":0.0,"baselineStartDate":0,"currentValue":0.0,"baselineType":"MEAN"}]},"forecastDaily":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"days":[{"moonrise":1794598874,"moonset":1794627382,"sunrise":1794582705,"sunset":1794616505,"forecastEnd":1794643200,"sunriseCivil":1794580706,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"solarMidnight":1794642825,"windSpeedAvg":9.337426,"temperatureMaxTime":1794585564,"windGustSpeedMax":36.504002,"sunriseAstronomical":1794576293,"forecastStart":1794556800,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":5.652,"minimum":5.652,"maximum":5.652,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794622910,"visibilityMax":34072.0,"precipitationChance":86,"temperatureMin":9.91,"maxUvIndex":1,"temperatureMinTime":1794643200,"sunsetNautical":1794620737,"daytimeForecast":{"humidity":83,"daylight":true,"forecastEnd":1794625200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":9.132,"windGustSpeedMax":32.810402,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":11.529953,"forecastStart":1794582000,"windDirection":181,"windSpeed":10.008599,"humidityMax":90,"precipitationAmountByType":[{"expected":5.455,"minimum":5.455,"maximum":5.455,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":53,"visibilityMax":34072.0,"cloudCover":99,"precipitationChance":79,"temperatureMin":10.49,"cloudCoverMidAltPct":94,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":76,"humidityMin":70,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":15.263999},"conditionCode":["RAIN"],"humidityMin":70,"solarNoon":1794599599,"visibilityMin":6167.0,"overnightForecast":{"humidity":86,"daylight":false,"forecastEnd":1794668400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.49,"uvIndexMin":0,"temperatureApparentMin":5.112798,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":0.549,"uvIndexMax":0,"temperatureApparentMax":10.093671,"forecastStart":1794625200,"windDirection":183,"windSpeed":13.7466,"humidityMax":89,"precipitationAmountByType":[{"expected":0.71,"minimum":0.71,"maximum":0.71,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":49,"visibilityMax":28703.0,"cloudCover":74,"precipitationChance":65,"temperatureMin":9.009192,"cloudCoverMidAltPct":49,"precipitationIntensityMax":0.234,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":31,"humidityMin":82,"visibilityMin":16190.0,"precipitationType":["RAIN"],"windSpeedMax":16.65},"precipitationType":["RAIN"],"sunriseNautical":1794578462,"sunsetCivil":1794618498,"windSpeedMax":16.254,"restOfDayForecast":{"humidity":83,"daylight":false,"forecastEnd":1794643200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":5.957533,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":11.864366,"forecastStart":1794569484,"windDirection":171,"windSpeed":10.001331,"humidityMax":90,"precipitationAmountByType":[{"expected":5.652,"minimum":5.652,"maximum":5.652,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":42,"visibilityMax":34072.0,"cloudCover":95,"precipitationChance":84,"temperatureMin":9.91,"cloudCoverMidAltPct":84,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":76,"humidityMin":70,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":16.254}},{"moonrise":1794687261,"moonset":1794717746,"sunrise":1794669195,"sunset":1794702834,"forecastEnd":1794729600,"sunriseCivil":1794667189,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.170017,"solarMidnight":1794729234,"windSpeedAvg":13.5183,"temperatureMaxTime":1794689975,"windGustSpeedMax":36.504002,"sunriseAstronomical":1794662769,"forecastStart":1794643200,"moonPhase":"WAXING_CRESCENT","humidityMax":88,"precipitationAmountByType":[{"expected":5.55,"minimum":5.55,"maximum":5.55,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794709253,"visibilityMax":29373.0,"precipitationChance":85,"temperatureMin":9.009192,"maxUvIndex":1,"temperatureMinTime":1794668269,"sunsetNautical":1794707078,"daytimeForecast":{"humidity":79,"daylight":true,"forecastEnd":1794711600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.170017,"uvIndexMin":0,"temperatureApparentMin":5.696423,"windGustSpeedMax":33.551998,"perceivedPrecipitationIntensityMax":0.503,"uvIndexMax":1,"temperatureApparentMax":9.767292,"forecastStart":1794668400,"windDirection":166,"windSpeed":13.39695,"humidityMax":86,"precipitationAmountByType":[{"expected":0.96,"minimum":0.96,"maximum":0.96,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":59,"visibilityMax":29373.0,"cloudCover":89,"precipitationChance":55,"temperatureMin":9.01,"cloudCoverMidAltPct":72,"precipitationIntensityMax":0.194,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":64,"humidityMin":76,"visibilityMin":15078.0,"precipitationType":["RAIN"],"windSpeedMax":14.860799},"conditionCode":["RAIN"],"humidityMin":76,"solarNoon":1794686008,"visibilityMin":4069.0,"overnightForecast":{"humidity":84,"daylight":false,"forecastEnd":1794754800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.48,"uvIndexMin":0,"temperatureApparentMin":5.973359,"windGustSpeedMax":38.952,"perceivedPrecipitationIntensityMax":1.473,"uvIndexMax":0,"temperatureApparentMax":9.430315,"forecastStart":1794711600,"windDirection":155,"windSpeed":14.398049,"humidityMax":88,"precipitationAmountByType":[{"expected":8.279,"minimum":8.279,"maximum":8.279,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":67,"visibilityMax":25393.0,"cloudCover":94,"precipitationChance":87,"temperatureMin":10.038711,"cloudCoverMidAltPct":84,"precipitationIntensityMax":2.419,"conditionCode":["RAIN"],"cloudCoverHighAltPct":31,"humidityMin":78,"visibilityMin":4069.0,"precipitationType":["RAIN"],"windSpeedMax":17.780401},"precipitationType":["RAIN"],"sunriseNautical":1794664941,"sunsetCivil":1794704834,"windSpeedMax":16.65},{"moonrise":1794775225,"moonset":1794808239,"sunrise":1794755684,"sunset":1794789166,"forecastEnd":1794816000,"sunriseCivil":1794753672,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.499799,"solarMidnight":1794815645,"windSpeedAvg":13.973175,"temperatureMaxTime":1794775537,"windGustSpeedMax":38.952,"sunriseAstronomical":1794749245,"forecastStart":1794729600,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":7.270999,"minimum":7.270999,"maximum":7.270999,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794795599,"visibilityMax":27960.0,"precipitationChance":94,"temperatureMin":7.48,"maxUvIndex":1,"temperatureMinTime":1794816000,"sunsetNautical":1794793421,"daytimeForecast":{"humidity":79,"daylight":true,"forecastEnd":1794798000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.499799,"uvIndexMin":0,"temperatureApparentMin":5.879239,"windGustSpeedMax":35.748001,"perceivedPrecipitationIntensityMax":0.775,"uvIndexMax":1,"temperatureApparentMax":9.362825,"forecastStart":1794754800,"windDirection":199,"windSpeed":15.284551,"humidityMax":86,"precipitationAmountByType":[{"expected":3.041,"minimum":3.041,"maximum":3.041,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":37,"visibilityMax":27960.0,"cloudCover":64,"precipitationChance":79,"temperatureMin":9.24,"cloudCoverMidAltPct":53,"precipitationIntensityMax":0.499,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":0,"humidityMin":73,"visibilityMin":13909.0,"precipitationType":["RAIN"],"windSpeedMax":18.6192},"conditionCode":["RAIN"],"humidityMin":73,"solarNoon":1794772418,"visibilityMin":7974.0,"overnightForecast":{"humidity":89,"daylight":false,"forecastEnd":1794841200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.24,"uvIndexMin":0,"temperatureApparentMin":4.984706,"windGustSpeedMax":20.1276,"perceivedPrecipitationIntensityMax":1.093,"uvIndexMax":0,"temperatureApparentMax":8.094274,"forecastStart":1794798000,"windDirection":167,"windSpeed":7.06065,"humidityMax":90,"precipitationAmountByType":[{"expected":2.986,"minimum":2.986,"maximum":2.986,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":36,"visibilityMax":26518.0,"cloudCover":63,"precipitationChance":51,"temperatureMin":6.209458,"cloudCoverMidAltPct":37,"precipitationIntensityMax":1.117,"conditionCode":["RAIN"],"cloudCoverHighAltPct":4,"humidityMin":83,"visibilityMin":16329.0,"precipitationType":["RAIN"],"windSpeedMax":8.186399},"precipitationType":["RAIN"],"sunriseNautical":1794751419,"sunsetCivil":1794791172,"windSpeedMax":18.6192},{"moonrise":1794862879,"moonset":1794898770,"sunrise":1794842173,"sunset":1794875500,"forecastEnd":1794902400,"sunriseCivil":1794840154,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.921954,"solarMidnight":1794902056,"windSpeedAvg":8.8203,"temperatureMaxTime":1794864861,"windGustSpeedMax":25.909199,"sunriseAstronomical":1794835720,"forecastStart":1794816000,"moonPhase":"WAXING_CRESCENT","humidityMax":90,"precipitationAmountByType":[{"expected":4.384,"minimum":4.384,"maximum":4.384,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794881947,"visibilityMax":31734.0,"precipitationChance":67,"temperatureMin":6.209458,"maxUvIndex":1,"temperatureMinTime":1794840092,"sunsetNautical":1794879767,"daytimeForecast":{"humidity":80,"daylight":true,"forecastEnd":1794884400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.921954,"uvIndexMin":0,"temperatureApparentMin":5.026797,"windGustSpeedMax":25.909199,"perceivedPrecipitationIntensityMax":0.808,"uvIndexMax":1,"temperatureApparentMax":10.102699,"forecastStart":1794841200,"windDirection":182,"windSpeed":9.35655,"humidityMax":90,"precipitationAmountByType":[{"expected":0.895,"minimum":0.895,"maximum":0.895,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":45,"visibilityMax":31734.0,"cloudCover":73,"precipitationChance":36,"temperatureMin":6.24,"cloudCoverMidAltPct":57,"precipitationIntensityMax":0.548,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":16,"humidityMin":73,"visibilityMin":16596.0,"precipitationType":["RAIN"],"windSpeedMax":12.225599},"conditionCode":["RAIN"],"humidityMin":73,"solarNoon":1794858830,"visibilityMin":16329.0,"overnightForecast":{"humidity":88,"daylight":false,"forecastEnd":1794927600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.71,"uvIndexMin":0,"temperatureApparentMin":4.863145,"windGustSpeedMax":25.909199,"perceivedPrecipitationIntensityMax":0.751,"uvIndexMax":0,"temperatureApparentMax":6.049259,"forecastStart":1794884400,"windDirection":169,"windSpeed":8.89755,"humidityMax":89,"precipitationAmountByType":[{"expected":0.568,"minimum":0.568,"maximum":0.568,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":56,"visibilityMax":28122.0,"cloudCover":60,"precipitationChance":50,"temperatureMin":5.989975,"cloudCoverMidAltPct":7,"precipitationIntensityMax":0.465,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":1,"humidityMin":85,"visibilityMin":16596.0,"precipitationType":["RAIN"],"windSpeedMax":11.7612},"precipitationType":["RAIN"],"sunriseNautical":1794837897,"sunsetCivil":1794877511,"windSpeedMax":12.225599},{"moonrise":1794950358,"sunrise":1794928662,"sunset":1794961836,"forecastEnd":1794988800,"sunriseCivil":1794926635,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.845637,"solarMidnight":1794988468,"windSpeedAvg":6.440775,"temperatureMaxTime":1794953467,"windGustSpeedMax":18.273602,"sunriseAstronomical":1794922194,"forecastStart":1794902400,"moonPhase":"FIRST_QUARTER","humidityMax":89,"precipitationAmountByType":[{"expected":0.341,"minimum":0.341,"maximum":0.341,"precipitationType":["RAIN"]}],"sunsetAstronomical":1794968297,"visibilityMax":29733.0,"precipitationChance":53,"temperatureMin":5.98,"maxUvIndex":1,"temperatureMinTime":1794988800,"sunsetNautical":1794966114,"daytimeForecast":{"humidity":72,"daylight":true,"forecastEnd":1794970800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.845637,"uvIndexMin":0,"temperatureApparentMin":5.082117,"windGustSpeedMax":17.006401,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":12.097757,"forecastStart":1794927600,"windDirection":154,"windSpeed":5.87355,"humidityMax":87,"precipitationAmountByType":[],"cloudCoverLowAltPct":15,"visibilityMax":29733.0,"cloudCover":29,"precipitationChance":0,"temperatureMin":6.13,"cloudCoverMidAltPct":1,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":6,"humidityMin":62,"visibilityMin":17780.0,"precipitationType":["CLEAR"],"windSpeedMax":7.1748},"conditionCode":["DRIZZLE"],"humidityMin":62,"solarNoon":1794945242,"visibilityMin":17780.0,"overnightForecast":{"humidity":82,"daylight":false,"forecastEnd":1795014000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.72,"uvIndexMin":0,"temperatureApparentMin":2.451838,"windGustSpeedMax":25.2936,"perceivedPrecipitationIntensityMax":0.95,"uvIndexMax":0,"temperatureApparentMax":7.151364,"forecastStart":1794970800,"windDirection":133,"windSpeed":7.62915,"humidityMax":89,"precipitationAmountByType":[{"expected":4.327,"minimum":4.327,"maximum":4.327,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":31,"visibilityMax":25857.0,"cloudCover":92,"precipitationChance":50,"temperatureMin":4.947516,"cloudCoverMidAltPct":66,"precipitationIntensityMax":0.798,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":89,"humidityMin":74,"visibilityMin":10859.0,"precipitationType":["RAIN"],"windSpeedMax":12.204},"precipitationType":["RAIN"],"sunriseNautical":1794924375,"sunsetCivil":1794963853,"windSpeedMax":8.9928},{"moonrise":1795037733,"moonset":1794989335,"sunrise":1795015150,"sunset":1795048175,"forecastEnd":1795075200,"sunriseCivil":1795013116,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.020019,"solarMidnight":1795074881,"windSpeedAvg":10.204425,"temperatureMaxTime":1795042826,"windGustSpeedMax":25.7724,"sunriseAstronomical":1795008667,"forecastStart":1794988800,"moonPhase":"WAXING_GIBBOUS","humidityMax":94,"precipitationAmountByType":[{"expected":6.641001,"minimum":6.641001,"maximum":6.641001,"precipitationType":["RAIN"]}],"sunsetAstronomical":1795054649,"visibilityMax":30421.0,"precipitationChance":74,"temperatureMin":4.947516,"maxUvIndex":1,"temperatureMinTime":1795009991,"sunsetNautical":1795052464,"daytimeForecast":{"humidity":81,"daylight":true,"forecastEnd":1795057200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.020019,"uvIndexMin":0,"temperatureApparentMin":2.416847,"windGustSpeedMax":25.7724,"perceivedPrecipitationIntensityMax":0.866,"uvIndexMax":1,"temperatureApparentMax":6.052989,"forecastStart":1795014000,"windDirection":182,"windSpeed":12.15015,"humidityMax":88,"precipitationAmountByType":[{"expected":2.276,"minimum":2.276,"maximum":2.276,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":60,"visibilityMax":30421.0,"cloudCover":82,"precipitationChance":66,"temperatureMin":5.11,"cloudCoverMidAltPct":76,"precipitationIntensityMax":0.643,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":50,"humidityMin":76,"visibilityMin":14677.0,"precipitationType":["RAIN"],"windSpeedMax":13.608},"conditionCode":["DRIZZLE"],"humidityMin":76,"solarNoon":1795031654,"visibilityMin":10859.0,"overnightForecast":{"humidity":92,"daylight":false,"forecastEnd":1795100400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.9,"uvIndexMin":0,"temperatureApparentMin":5.690445,"windGustSpeedMax":17.945999,"perceivedPrecipitationIntensityMax":0.327,"uvIndexMax":0,"temperatureApparentMax":6.35371,"forecastStart":1795057200,"windDirection":158,"windSpeed":5.645401,"humidityMax":95,"precipitationAmountByType":[{"expected":0.478,"minimum":0.478,"maximum":0.478,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":62,"visibilityMax":25229.0,"cloudCover":82,"precipitationChance":50,"temperatureMin":5.36,"cloudCoverMidAltPct":55,"precipitationIntensityMax":0.079,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":8,"humidityMin":82,"visibilityMin":12901.0,"precipitationType":["RAIN"],"windSpeedMax":9.774},"precipitationType":["RAIN"],"sunriseNautical":1795010851,"sunsetCivil":1795050198,"windSpeedMax":13.608},{"moonrise":1795125079,"moonset":1795079963,"sunrise":1795101637,"sunset":1795134515,"forecastEnd":1795161600,"sunriseCivil":1795099597,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.116987,"solarMidnight":1795161294,"windSpeedAvg":5.149725,"temperatureMaxTime":1795135920,"windGustSpeedMax":12.852,"sunriseAstronomical":1795095140,"forecastStart":1795075200,"moonPhase":"WAXING_GIBBOUS","humidityMax":96,"precipitationAmountByType":[{"expected":0.141,"minimum":0.141,"maximum":0.141,"precipitationType":["RAIN"]}],"sunsetAstronomical":1795141003,"visibilityMax":32204.0,"precipitationChance":53,"temperatureMin":5.36,"maxUvIndex":1,"temperatureMinTime":1795082400,"sunsetNautical":1795138815,"daytimeForecast":{"humidity":83,"daylight":true,"forecastEnd":1795143600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.116987,"uvIndexMin":0,"temperatureApparentMin":6.35371,"windGustSpeedMax":12.852,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":10.070161,"forecastStart":1795100400,"windDirection":4,"windSpeed":6.0135,"humidityMax":93,"precipitationAmountByType":[],"cloudCoverLowAltPct":44,"visibilityMax":32204.0,"cloudCover":63,"precipitationChance":0,"temperatureMin":6.03,"cloudCoverMidAltPct":2,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":0,"humidityMin":77,"visibilityMin":12901.0,"precipitationType":["CLEAR"],"windSpeedMax":7.8264},"conditionCode":["DRIZZLE"],"humidityMin":77,"solarNoon":1795118068,"visibilityMin":12901.0,"overnightForecast":{"humidity":94,"daylight":false,"forecastEnd":1795186800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.52,"uvIndexMin":0,"temperatureApparentMin":4.634763,"windGustSpeedMax":9.4392,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":8.422463,"forecastStart":1795143600,"windDirection":44,"windSpeed":3.7053,"humidityMax":97,"precipitationAmountByType":[],"cloudCoverLowAltPct":34,"visibilityMax":28680.0,"cloudCover":52,"precipitationChance":0,"temperatureMin":4.006788,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"humidityMin":85,"visibilityMin":9083.0,"precipitationType":["CLEAR"],"windSpeedMax":4.0212},"precipitationType":["RAIN"],"sunriseNautical":1795097328,"sunsetCivil":1795136544,"windSpeedMax":7.8264},{"moonrise":1795212479,"moonset":1795170725,"sunrise":1795188123,"sunset":1795220858,"forecastEnd":1795248000,"sunriseCivil":1795186076,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.763362,"solarMidnight":1795247709,"windSpeedAvg":4.930575,"temperatureMaxTime":1795216005,"windGustSpeedMax":14.482799,"sunriseAstronomical":1795181613,"forecastStart":1795161600,"moonPhase":"WAXING_GIBBOUS","humidityMax":97,"precipitationAmountByType":[],"sunsetAstronomical":1795227360,"visibilityMax":17821.0,"precipitationChance":0,"temperatureMin":4.006788,"maxUvIndex":1,"temperatureMinTime":1795177699,"sunsetNautical":1795225170,"daytimeForecast":{"humidity":77,"daylight":true,"forecastEnd":1795230000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.763362,"uvIndexMin":0,"temperatureApparentMin":5.128633,"windGustSpeedMax":14.482799,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":11.921696,"forecastStart":1795186800,"windDirection":9,"windSpeed":6.00165,"humidityMax":92,"precipitationAmountByType":[],"cloudCoverLowAltPct":16,"visibilityMax":13937.0,"cloudCover":19,"precipitationChance":0,"temperatureMin":4.73,"cloudCoverMidAltPct":0,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":69,"visibilityMin":9448.0,"precipitationType":["CLEAR"],"windSpeedMax":7.5348},"conditionCode":["MOSTLY_CLEAR"],"humidityMin":69,"solarNoon":1795204483,"visibilityMin":9083.0,"overnightForecast":{"humidity":78,"daylight":false,"forecastEnd":1795273200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":7.8,"uvIndexMin":0,"temperatureApparentMin":3.108699,"windGustSpeedMax":12.618,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":6.648598,"forecastStart":1795230000,"windDirection":63,"windSpeed":5.1837,"humidityMax":84,"precipitationAmountByType":[],"cloudCoverLowAltPct":7,"visibilityMax":24474.0,"cloudCover":10,"precipitationChance":0,"temperatureMin":4.249874,"cloudCoverMidAltPct":1,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":3,"humidityMin":66,"visibilityMin":13937.0,"precipitationType":["CLEAR"],"windSpeedMax":6.4764},"precipitationType":["CLEAR"],"sunriseNautical":1795183803,"sunsetCivil":1795222893,"windSpeedMax":7.5348},{"moonrise":1795300029,"moonset":1795261701,"sunrise":1795274609,"sunset":1795307204,"forecastEnd":1795334400,"sunriseCivil":1795272555,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.168908,"solarMidnight":1795334124,"windSpeedAvg":5.365725,"temperatureMaxTime":1795299642,"windGustSpeedMax":13.5252,"sunriseAstronomical":1795268084,"forecastStart":1795248000,"moonPhase":"WAXING_GIBBOUS","humidityMax":83,"precipitationAmountByType":[],"sunsetAstronomical":1795313719,"visibilityMax":26954.0,"precipitationChance":0,"temperatureMin":4.249874,"maxUvIndex":1,"temperatureMinTime":1795255291,"sunsetNautical":1795311526,"daytimeForecast":{"humidity":62,"daylight":true,"forecastEnd":1795316400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.168908,"uvIndexMin":0,"temperatureApparentMin":4.959615,"windGustSpeedMax":12.459599,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":1,"temperatureApparentMax":13.309563,"forecastStart":1795273200,"windDirection":135,"windSpeed":4.4259,"humidityMax":66,"precipitationAmountByType":[],"cloudCoverLowAltPct":2,"visibilityMax":26954.0,"cloudCover":19,"precipitationChance":0,"temperatureMin":6.57,"cloudCoverMidAltPct":17,"precipitationIntensityMax":0.0,"conditionCode":["MOSTLY_CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":60,"visibilityMin":8662.0,"precipitationType":["CLEAR"],"windSpeedMax":6.372},"conditionCode":["MOSTLY_CLEAR"],"humidityMin":60,"solarNoon":1795290898,"visibilityMin":8662.0,"overnightForecast":{"humidity":71,"daylight":false,"forecastEnd":1795359600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":8.71,"uvIndexMin":0,"temperatureApparentMin":3.380726,"windGustSpeedMax":13.5252,"perceivedPrecipitationIntensityMax":0.0,"uvIndexMax":0,"temperatureApparentMax":7.205438,"forecastStart":1795316400,"windDirection":154,"windSpeed":5.82615,"humidityMax":77,"precipitationAmountByType":[],"cloudCoverLowAltPct":0,"visibilityMax":22708.0,"cloudCover":12,"precipitationChance":0,"temperatureMin":4.10744,"cloudCoverMidAltPct":4,"precipitationIntensityMax":0.0,"conditionCode":["CLEAR"],"cloudCoverHighAltPct":0,"humidityMin":64,"visibilityMin":10503.0,"precipitationType":["CLEAR"],"windSpeedMax":7.487999},"precipitationType":["CLEAR"],"sunriseNautical":1795270278,"sunsetCivil":1795309245,"windSpeedMax":7.487999}]},"forecastHourly":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"hours":[{"daylight":false,"humidity":85,"pressure":993.530029,"temperature":11.51,"visibility":22126.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":1,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":9.07518,"windGust":6.9768,"temperatureApparent":10.747892,"cloudCover":68,"precipitationChance":0,"cloudCoverMidAltPct":89,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":100,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794567600,"pressureTrend":"FALLING","windDirection":131,"uvIndex":0,"windSpeed":6.9768,"snowfallIntensity":0.0},{"daylight":false,"humidity":83,"pressure":992.429993,"temperature":10.95,"visibility":19738.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":4,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":8.174545,"windGust":12.87,"temperatureApparent":10.448459,"cloudCover":96,"precipitationChance":0,"cloudCoverMidAltPct":83,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":94,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794571200,"pressureTrend":"FALLING","windDirection":69,"uvIndex":0,"windSpeed":7.1892,"snowfallIntensity":0.0},{"daylight":false,"humidity":79,"pressure":990.97998,"temperature":11.34,"visibility":21981.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":4,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.828262,"windGust":15.4296,"temperatureApparent":9.860982,"cloudCover":74,"precipitationChance":0,"cloudCoverMidAltPct":48,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":67,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794574800,"pressureTrend":"FALLING","windDirection":83,"uvIndex":0,"windSpeed":9.0468,"snowfallIntensity":0.0},{"daylight":false,"humidity":74,"pressure":990.539978,"temperature":11.79,"visibility":26370.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":8,"perceivedPrecipitationIntensity":0.082,"precipitationIntensity":0.005,"temperatureDewPoint":7.305634,"windGust":17.848801,"temperatureApparent":11.730489,"cloudCover":100,"precipitationChance":5,"cloudCoverMidAltPct":95,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":98,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.005,"minimum":0.005,"maximum":0.005},"forecastStart":1794578400,"pressureTrend":"FALLING","windDirection":152,"uvIndex":0,"windSpeed":5.5908,"snowfallIntensity":0.0},{"daylight":false,"humidity":71,"pressure":989.789978,"temperature":12.85,"visibility":32347.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":6,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.719589,"windGust":25.4088,"temperatureApparent":11.529953,"cloudCover":97,"precipitationChance":0,"cloudCoverMidAltPct":92,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":97,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794582000,"pressureTrend":"FALLING","windDirection":107,"uvIndex":0,"windSpeed":9.324,"snowfallIntensity":0.0},{"daylight":true,"humidity":70,"pressure":990.130005,"temperature":13.64,"visibility":34072.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":24,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":8.26889,"windGust":31.352398,"temperatureApparent":10.051039,"cloudCover":99,"precipitationChance":0,"cloudCoverMidAltPct":96,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":56,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794585600,"pressureTrend":"FALLING","windDirection":131,"uvIndex":0,"windSpeed":15.263999,"snowfallIntensity":0.0},{"daylight":true,"humidity":80,"pressure":991.099976,"temperature":12.79,"visibility":20931.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":66,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":9.425461,"windGust":32.810402,"temperatureApparent":9.430462,"cloudCover":96,"precipitationChance":0,"cloudCoverMidAltPct":60,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":22,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794589200,"pressureTrend":"STEADY","windDirection":239,"uvIndex":0,"windSpeed":13.521601,"snowfallIntensity":0.0},{"daylight":true,"humidity":81,"pressure":991.559998,"temperature":13.02,"visibility":15831.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":39,"perceivedPrecipitationIntensity":0.568,"precipitationIntensity":0.252,"temperatureDewPoint":9.834717,"windGust":27.719999,"temperatureApparent":11.22246,"cloudCover":100,"precipitationChance":20,"cloudCoverMidAltPct":98,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":19,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.252,"minimum":0.252,"maximum":0.252},"forecastStart":1794592800,"pressureTrend":"RISING","windDirection":221,"uvIndex":1,"windSpeed":8.478,"snowfallIntensity":0.0},{"daylight":true,"humidity":82,"pressure":991.630005,"temperature":13.07,"visibility":16011.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":67,"perceivedPrecipitationIntensity":0.283,"precipitationIntensity":0.059,"temperatureDewPoint":10.066879,"windGust":30.477598,"temperatureApparent":10.538489,"cloudCover":100,"precipitationChance":23,"cloudCoverMidAltPct":96,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":34,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.059,"minimum":0.059,"maximum":0.059},"forecastStart":1794596400,"pressureTrend":"RISING","windDirection":194,"uvIndex":1,"windSpeed":10.5984,"snowfallIntensity":0.0},{"daylight":true,"humidity":82,"pressure":992.080017,"temperature":12.52,"visibility":16435.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":64,"perceivedPrecipitationIntensity":0.499,"precipitationIntensity":0.191,"temperatureDewPoint":9.529678,"windGust":31.676399,"temperatureApparent":9.236209,"cloudCover":100,"precipitationChance":35,"cloudCoverMidAltPct":97,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":99,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.191,"minimum":0.191,"maximum":0.191},"forecastStart":1794600000,"pressureTrend":"RISING","windDirection":206,"uvIndex":1,"windSpeed":12.549601,"snowfallIntensity":0.0},{"daylight":true,"humidity":84,"pressure":991.97998,"temperature":12.26,"visibility":12801.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":75,"perceivedPrecipitationIntensity":1.128,"precipitationIntensity":1.205,"temperatureDewPoint":9.634369,"windGust":28.656,"temperatureApparent":9.296653,"cloudCover":100,"precipitationChance":55,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.205,"minimum":1.205,"maximum":1.205},"forecastStart":1794603600,"pressureTrend":"STEADY","windDirection":201,"uvIndex":1,"windSpeed":11.6712,"snowfallIntensity":0.0},{"daylight":true,"humidity":85,"pressure":992.119995,"temperature":12.03,"visibility":9057.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":81,"perceivedPrecipitationIntensity":0.89,"precipitationIntensity":0.684,"temperatureDewPoint":9.585251,"windGust":26.046,"temperatureApparent":9.971526,"cloudCover":100,"precipitationChance":57,"cloudCoverMidAltPct":100,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":98,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.684,"minimum":0.684,"maximum":0.684},"forecastStart":1794607200,"pressureTrend":"STEADY","windDirection":194,"uvIndex":1,"windSpeed":9.234,"snowfallIntensity":0.0},{"daylight":true,"humidity":88,"pressure":992.48999,"temperature":11.76,"visibility":7366.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":1.135,"precipitationIntensity":1.224,"temperatureDewPoint":9.837143,"windGust":18.129601,"temperatureApparent":10.412608,"cloudCover":100,"precipitationChance":68,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":97,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.224,"minimum":1.224,"maximum":1.224},"forecastStart":1794610800,"pressureTrend":"STEADY","windDirection":180,"uvIndex":0,"windSpeed":7.7652,"snowfallIntensity":0.0},{"daylight":true,"humidity":90,"pressure":992.950012,"temperature":11.47,"visibility":6167.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":1.084,"precipitationIntensity":1.093,"temperatureDewPoint":9.886688,"windGust":17.326801,"temperatureApparent":11.056475,"cloudCover":100,"precipitationChance":68,"cloudCoverMidAltPct":100,"conditionCode":["RAIN"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":1.093,"minimum":1.093,"maximum":1.093},"forecastStart":1794614400,"pressureTrend":"RISING","windDirection":158,"uvIndex":0,"windSpeed":6.4944,"snowfallIntensity":0.0},{"daylight":false,"humidity":90,"pressure":993.429993,"temperature":11.2,"visibility":10017.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":54,"perceivedPrecipitationIntensity":0.894,"precipitationIntensity":0.692,"temperatureDewPoint":9.620041,"windGust":19.764,"temperatureApparent":10.591156,"cloudCover":100,"precipitationChance":63,"cloudCoverMidAltPct":100,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":100,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.692,"minimum":0.692,"maximum":0.692},"forecastStart":1794618000,"pressureTrend":"RISING","windDirection":149,"uvIndex":0,"windSpeed":7.844399,"snowfallIntensity":0.0},{"daylight":false,"humidity":89,"pressure":993.809998,"temperature":10.85,"visibility":18581.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":39,"perceivedPrecipitationIntensity":0.274,"precipitationIntensity":0.055,"temperatureDewPoint":9.108414,"windGust":18.846001,"temperatureApparent":10.008285,"cloudCover":99,"precipitationChance":44,"cloudCoverMidAltPct":90,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":95,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.055,"minimum":0.055,"maximum":0.055},"forecastStart":1794621600,"pressureTrend":"RISING","windDirection":135,"uvIndex":0,"windSpeed":8.4348,"snowfallIntensity":0.0},{"daylight":false,"humidity":89,"pressure":994.340027,"temperature":10.49,"visibility":22953.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":17,"perceivedPrecipitationIntensity":0.203,"precipitationIntensity":0.03,"temperatureDewPoint":8.753342,"windGust":15.235199,"temperatureApparent":10.093671,"cloudCover":99,"precipitationChance":35,"cloudCoverMidAltPct":88,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":96,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.03,"minimum":0.03,"maximum":0.03},"forecastStart":1794625200,"pressureTrend":"RISING","windDirection":146,"uvIndex":0,"windSpeed":7.1712,"snowfallIntensity":0.0},{"daylight":false,"humidity":88,"pressure":994.849976,"temperature":10.28,"visibility":23999.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":23,"perceivedPrecipitationIntensity":0.352,"precipitationIntensity":0.092,"temperatureDewPoint":8.379349,"windGust":19.6416,"temperatureApparent":8.919455,"cloudCover":82,"precipitationChance":27,"cloudCoverMidAltPct":65,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.092,"minimum":0.092,"maximum":0.092},"forecastStart":1794628800,"pressureTrend":"RISING","windDirection":168,"uvIndex":0,"windSpeed":9.1692,"snowfallIntensity":0.0},{"daylight":false,"humidity":86,"pressure":995.400024,"temperature":10.2,"visibility":25448.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":38,"perceivedPrecipitationIntensity":0.192,"precipitationIntensity":0.027,"temperatureDewPoint":7.96196,"windGust":23.864401,"temperatureApparent":7.958751,"cloudCover":98,"precipitationChance":19,"cloudCoverMidAltPct":74,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.027,"minimum":0.027,"maximum":0.027},"forecastStart":1794632400,"pressureTrend":"RISING","windDirection":183,"uvIndex":0,"windSpeed":12.0564,"snowfallIntensity":0.0},{"daylight":false,"humidity":84,"pressure":996.070007,"temperature":10.02,"visibility":28076.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":33,"perceivedPrecipitationIntensity":0.242,"precipitationIntensity":0.043,"temperatureDewPoint":7.440018,"windGust":24.958801,"temperatureApparent":7.321218,"cloudCover":74,"precipitationChance":17,"cloudCoverMidAltPct":42,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.043,"minimum":0.043,"maximum":0.043},"forecastStart":1794636000,"pressureTrend":"RISING","windDirection":179,"uvIndex":0,"windSpeed":12.3696,"snowfallIntensity":0.0},{"daylight":false,"humidity":83,"pressure":996.48999,"temperature":9.93,"visibility":28703.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":62,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.176666,"windGust":28.184401,"temperatureApparent":7.196809,"cloudCover":93,"precipitationChance":0,"cloudCoverMidAltPct":58,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":69,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794639600,"pressureTrend":"RISING","windDirection":179,"uvIndex":0,"windSpeed":13.086,"snowfallIntensity":0.0},{"daylight":false,"humidity":82,"pressure":997.099976,"temperature":9.91,"visibility":22503.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":60,"perceivedPrecipitationIntensity":0.297,"precipitationIntensity":0.065,"temperatureDewPoint":6.980118,"windGust":36.504002,"temperatureApparent":5.957533,"cloudCover":83,"precipitationChance":13,"cloudCoverMidAltPct":68,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":31,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.065,"minimum":0.065,"maximum":0.065},"forecastStart":1794643200,"pressureTrend":"RISING","windDirection":188,"uvIndex":0,"windSpeed":16.254,"snowfallIntensity":0.0},{"daylight":false,"humidity":84,"pressure":997.929993,"temperature":9.78,"visibility":19336.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":62,"perceivedPrecipitationIntensity":0.0,"precipitationIntensity":0.0,"temperatureDewPoint":7.20488,"windGust":36.144001,"temperatureApparent":5.642423,"cloudCover":79,"precipitationChance":0,"cloudCoverMidAltPct":45,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":20,"precipitationType":["CLEAR"],"precipitationAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"forecastStart":1794646800,"pressureTrend":"RISING","windDirection":189,"uvIndex":0,"windSpeed":16.65,"snowfallIntensity":0.0},{"daylight":false,"humidity":86,"pressure":998.849976,"temperature":9.54,"visibility":16225.0,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"cloudCoverLowAltPct":50,"perceivedPrecipitationIntensity":0.549,"precipitationIntensity":0.234,"temperatureDewPoint":7.313568,"windGust":32.5116,"temperatureApparent":5.722379,"cloudCover":59,"precipitationChance":24,"cloudCoverMidAltPct":30,"conditionCode":["PARTLY_CLOUDY"],"cloudCoverHighAltPct":0,"precipitationType":["RAIN"],"precipitationAmount":{"expected":0.234,"minimum":0.234,"maximum":0.234},"forecastStart":1794650400,"pressureTrend":"RISING","windDirection":186,"uvIndex":0,"windSpeed":14.9436,"snowfallIntensity":0.0}]},"forecastPeriodic":{"metadata":{"latitude":0,"longitude":0,"attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"expireTime":1794573084,"temporarilyUnavailable":false,"sourceType":"MODELED","reportedTime":1794567934},"forecasts":[{"periods":[{"humidity":79,"daylight":false,"forecastEnd":1794582000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":12.85,"uvIndexMin":0,"temperatureApparentMin":9.818448,"windGustSpeedMax":25.4088,"perceivedPrecipitationIntensityMax":0.082,"uvIndexMax":0,"temperatureApparentMax":11.864366,"forecastStart":1794567600,"windDirection":101,"windSpeed":7.4943,"humidityMax":85,"precipitationAmountByType":[{"expected":0.005,"minimum":0.005,"maximum":0.005,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":5,"visibilityMax":32347.0,"cloudCover":88,"precipitationChance":24,"temperatureMin":10.94799,"cloudCoverMidAltPct":79,"precipitationIntensityMax":0.005,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":89,"humidityMin":71,"visibilityMin":19738.0,"precipitationType":["RAIN"],"windSpeedMax":9.324},{"humidity":77,"daylight":true,"forecastEnd":1794596400,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.64015,"uvIndexMin":0,"temperatureApparentMin":9.384322,"windGustSpeedMax":32.810402,"perceivedPrecipitationIntensityMax":0.568,"uvIndexMax":1,"temperatureApparentMax":11.529953,"forecastStart":1794582000,"windDirection":185,"windSpeed":11.8062,"humidityMax":82,"precipitationAmountByType":[{"expected":0.252,"minimum":0.252,"maximum":0.252,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":41,"visibilityMax":34072.0,"cloudCover":98,"precipitationChance":26,"temperatureMin":12.767698,"cloudCoverMidAltPct":87,"precipitationIntensityMax":0.252,"conditionCode":["CLOUDY"],"cloudCoverHighAltPct":41,"humidityMin":70,"visibilityMin":15831.0,"precipitationType":["RAIN"],"windSpeedMax":15.263999},{"humidity":84,"daylight":true,"forecastEnd":1794610800,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":13.07,"uvIndexMin":0,"temperatureApparentMin":9.132,"windGustSpeedMax":31.676399,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":1,"temperatureApparentMax":10.538489,"forecastStart":1794596400,"windDirection":198,"windSpeed":10.65915,"humidityMax":88,"precipitationAmountByType":[{"expected":2.139,"minimum":2.139,"maximum":2.139,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":71,"visibilityMax":16435.0,"cloudCover":100,"precipitationChance":68,"temperatureMin":11.76,"cloudCoverMidAltPct":99,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":90,"humidityMin":82,"visibilityMin":7366.0,"precipitationType":["RAIN"],"windSpeedMax":12.549601},{"humidity":89,"daylight":true,"forecastEnd":1794625200,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":11.76,"uvIndexMin":0,"temperatureApparentMin":9.995345,"windGustSpeedMax":19.764,"perceivedPrecipitationIntensityMax":1.135,"uvIndexMax":0,"temperatureApparentMax":11.058412,"forecastStart":1794610800,"windDirection":151,"windSpeed":7.560449,"humidityMax":90,"precipitationAmountByType":[{"expected":3.064,"minimum":3.064,"maximum":3.064,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":48,"visibilityMax":22953.0,"cloudCover":100,"precipitationChance":82,"temperatureMin":10.49,"cloudCoverMidAltPct":96,"precipitationIntensityMax":1.224,"conditionCode":["RAIN"],"cloudCoverHighAltPct":97,"humidityMin":88,"visibilityMin":6167.0,"precipitationType":["RAIN"],"windSpeedMax":8.4348},{"humidity":86,"daylight":false,"forecastEnd":1794639600,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":10.49,"uvIndexMin":0,"temperatureApparentMin":7.196809,"windGustSpeedMax":28.184401,"perceivedPrecipitationIntensityMax":0.352,"uvIndexMax":0,"temperatureApparentMax":10.093671,"forecastStart":1794625200,"windDirection":175,"windSpeed":10.93095,"humidityMax":89,"precipitationAmountByType":[{"expected":0.192,"minimum":0.192,"maximum":0.192,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":33,"visibilityMax":28703.0,"cloudCover":88,"precipitationChance":49,"temperatureMin":9.93,"cloudCoverMidAltPct":64,"precipitationIntensityMax":0.092,"conditionCode":["DRIZZLE"],"cloudCoverHighAltPct":72,"humidityMin":83,"visibilityMin":22953.0,"precipitationType":["RAIN"],"windSpeedMax":13.086},{"humidity":84,"daylight":false,"forecastEnd":1794654000,"snowfallAmount":{"expected":0.0,"minimum":0.0,"maximum":0.0},"temperatureMax":9.93,"uvIndexMin":0,"temperatureApparentMin":5.604858,"windGustSpeedMax":36.504002,"perceivedPrecipitationIntensityMax":0.549,"uvIndexMax":0,"temperatureApparentMax":7.196809,"forecastStart":1794639600,"windDirection":186,"windSpeed":15.3558,"humidityMax":88,"precipitationAmountByType":[{"expected":0.299,"minimum":0.299,"maximum":0.299,"precipitationType":["RAIN"]}],"cloudCoverLowAltPct":56,"visibilityMax":28703.0,"cloudCover":74,"precipitationChance":28,"temperatureMin":9.2,"cloudCoverMidAltPct":47,"precipitationIntensityMax":0.234,"conditionCode":["MOSTLY_CLOUDY"],"cloudCoverHighAltPct":21,"humidityMin":82,"visibilityMin":16225.0,"precipitationType":["RAIN"],"windSpeedMax":16.65}],"periodLength":4}]},"forecastNextHour":{"metadata":{"latitude":0,"longitude":0,"expireTime":1794571284,"sourceType":"MODELED","attributionUrl":"https://developer.apple.com/weatherkit/data-source-attribution-internal/","readTime":1794569484,"temporarilyUnavailable":false,"providerName":"US National Oceanic & Atmospheric Administration","reportedTime":1794568920},"condition":[{"parameters":[],"startTime":1794569460,"beginCondition":"CLEAR","forecastToken":"CLEAR","endCondition":"CLEAR"}],"summary":[{"condition":["CLEAR"],"precipitationChance":0,"startTime":1794569460,"precipitationIntensity":0.0}],"minutes":[{"precipitationChance":0,"startTime":1794569460,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569520,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569580,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569640,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569700,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569760,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569820,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569880,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794569940,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570000,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570060,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570120,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570180,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570240,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570300,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570360,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570420,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570480,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570540,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570600,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570660,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570720,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570780,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570840,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570900,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794570960,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571020,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571080,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571140,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571200,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571260,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571320,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571380,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571440,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571500,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571560,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571620,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571680,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571740,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571800,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571860,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571920,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794571980,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572040,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572100,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572160,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572220,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572280,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572340,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572400,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572460,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572520,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572580,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572640,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572700,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572760,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572820,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572880,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794572940,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573000,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573060,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573120,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573180,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573240,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573300,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573360,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573420,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573480,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573540,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573600,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573660,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573720,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573780,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573840,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573900,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794573960,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574020,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574080,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574140,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574200,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0},{"precipitationChance":0,"startTime":1794574260,"precipitationIntensity":0.0,"perceivedPrecipitationIntensity":0.0}],"forecastEnd":1794574320,"forecastStart":1794569460}} diff --git a/tests/fixtures/wk3-paired/seattle/manifest.json b/tests/fixtures/wk3-paired/seattle/manifest.json index ff7a9b9f..8b64fda3 100644 --- a/tests/fixtures/wk3-paired/seattle/manifest.json +++ b/tests/fixtures/wk3-paired/seattle/manifest.json @@ -76,12 +76,24 @@ "method": "Only vtable-validated Metadata latitude/longitude floats and same-length coordinate URL digits replaced. No re-encoding." }, "sha256": { - "apple.json": "9372a0628646b17ebd30486a733cec257f468d4b75ca688c02cc15cca393f1fd", - "apple.bin": "a92920572e0e48cca019efecab21b2d7dcdbeada529751c0a976d3149817789d" + "apple.json": "96cff738a4851b5a1f2658295b1c7bf66c067339bdfbe3dcd8b9d8fa4b6247c7", + "apple.bin": "f019b146b663ba1ab7a5c8388b4adb8f5e5680d582e3f120c5497001707e16a2" }, "schema_source": { "weatherkit_dev": "cd9d7927094aff79906fe3430f339f39970ca46e", "protocol_tag": "v2.0.5", "protocol_commit": "c87c1dcd851ea9293141bcfb32fde1b2cca564b9" - } + }, + "additional_redactions": [ + { + "kind": "coordinate-url", + "offset": 13708, + "bytes": 75 + }, + { + "kind": "weather-alert-token", + "offset": 864, + "bytes": 22 + } + ] } From 87bcb9608afa093ef9fc6892d6ab75ac7752c522 Mon Sep 17 00:00:00 2001 From: hhh2210 Date: Sat, 14 Nov 2026 18:59:11 +0800 Subject: [PATCH 8/8] docs(wk3): retain widget binary routing after native validation --- docs/wk3-weather-json.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/wk3-weather-json.md b/docs/wk3-weather-json.md index cafbaf8f..ca52109e 100644 --- a/docs/wk3-weather-json.md +++ b/docs/wk3-weather-json.md @@ -37,8 +37,8 @@ #110 可独立合并;#1 发布后,#111 更新协议依赖并合并。建议继续以本 PR 的 JSON 协商 作为主 App 默认路径,由维护者确认长期策略。#111 中主 App 的二进制实测是专用模块下的 -codec 兼容性验收,不改变正常路由。新增 JSON 客户端只需扩展本 PR 的协商边界及验收, -无需修改协议包或维护第二份供应商逻辑。 +codec 兼容性验收,不改变正常路由。macOS 小组件已在 #111 完成三次二进制网络响应与显示核对,本轮保留 FlatBuffer 路径, +暂不扩展小组件 JSON 白名单。 ## 验证