From 4c5c92a0423529e3ad1bcd5280f1e8fa6ddc624d Mon Sep 17 00:00:00 2001 From: Daniel Hjertholm <8713259+danhje@users.noreply.github.com> Date: Tue, 19 Mar 2024 22:04:49 +0100 Subject: [PATCH] Initial commit --- .github/workflows/CI.yml | 118 + .gitignore | 72 + .pre-commit-config.yaml | 28 + Cargo.lock | 304 ++ Cargo.toml | 12 + LICENSE | 9 + README.md | 65 + poetry.lock | 141 + pyproject.toml | 132 + rustfmt.toml | 1 + src/lib.rs | 138 + tests/data/forecast.json | 8680 ++++++++++++++++++++++++++++++++++++++ tests/data/forecast.xml | 2231 ++++++++++ tests/test_parse.py | 109 + 14 files changed, 12040 insertions(+) create mode 100644 .github/workflows/CI.yml create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 rustfmt.toml create mode 100644 src/lib.rs create mode 100644 tests/data/forecast.json create mode 100755 tests/data/forecast.xml create mode 100644 tests/test_parse.py diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 0000000..5cd9e32 --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,118 @@ +# This file is autogenerated by maturin v1.5.0 +# To update, run +# +# maturin generate-ci github +# +name: CI + +on: + push: + branches: + - main + - master + tags: + - '*' + pull_request: + workflow_dispatch: + +permissions: + contents: read + +jobs: + linux: + runs-on: ubuntu-latest + strategy: + matrix: + target: [x86_64, x86, aarch64, armv7, s390x, ppc64le] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.10' + - name: Build wheels + uses: PyO3/maturin-action@v1 + with: + target: ${{ matrix.target }} + args: --release --out dist --find-interpreter + sccache: 'true' + manylinux: auto + - name: Upload wheels + uses: actions/upload-artifact@v4 + with: + name: wheels-linux-${{ matrix.target }} + path: dist + + windows: + runs-on: windows-latest + strategy: + matrix: + target: [x64, x86] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.10' + architecture: ${{ matrix.target }} + - name: Build wheels + uses: PyO3/maturin-action@v1 + with: + target: ${{ matrix.target }} + args: --release --out dist --find-interpreter + sccache: 'true' + - name: Upload wheels + uses: actions/upload-artifact@v4 + with: + name: wheels-windows-${{ matrix.target }} + path: dist + + macos: + runs-on: macos-latest + strategy: + matrix: + target: [x86_64, aarch64] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.10' + - name: Build wheels + uses: PyO3/maturin-action@v1 + with: + target: ${{ matrix.target }} + args: --release --out dist --find-interpreter + sccache: 'true' + - name: Upload wheels + uses: actions/upload-artifact@v4 + with: + name: wheels-macos-${{ matrix.target }} + path: dist + + sdist: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Build sdist + uses: PyO3/maturin-action@v1 + with: + command: sdist + args: --out dist + - name: Upload sdist + uses: actions/upload-artifact@v4 + with: + name: wheels-sdist + path: dist + + release: + name: Release + runs-on: ubuntu-latest + if: "startsWith(github.ref, 'refs/tags/')" + needs: [linux, windows, macos, sdist] + steps: + - uses: actions/download-artifact@v4 + - name: Publish to PyPI + uses: PyO3/maturin-action@v1 + env: + MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }} + with: + command: upload + args: --non-interactive --skip-existing wheels-*/* diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c8f0442 --- /dev/null +++ b/.gitignore @@ -0,0 +1,72 @@ +/target + +# Byte-compiled / optimized / DLL files +__pycache__/ +.pytest_cache/ +*.py[cod] + +# C extensions +*.so + +# Distribution / packaging +.Python +.venv/ +env/ +bin/ +build/ +develop-eggs/ +dist/ +eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +include/ +man/ +venv/ +*.egg-info/ +.installed.cfg +*.egg + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt +pip-selfcheck.json + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.cache +nosetests.xml +coverage.xml + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Rope +.ropeproject + +# Django stuff: +*.log +*.pot + +.DS_Store + +# Sphinx documentation +docs/_build/ + +# PyCharm +.idea/ + +# VSCode +.vscode/ + +# Pyenv +.python-version diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..3d92976 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,28 @@ +--- +default_language_version: + python: python3 +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: check-json + - id: check-merge-conflict + - id: debug-statements + - id: detect-private-key + - id: check-yaml + - id: check-toml + - id: end-of-file-fixer + - id: trailing-whitespace + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.3.2 + hooks: + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + - id: ruff-format + - repo: https://github.com/doublify/pre-commit-rust + rev: master + hooks: + - id: fmt + - id: cargo-check + - id: clippy + args: [--fix, --allow-dirty, --allow-staged] diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..4c96ea2 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,304 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "autocfg" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "indoc" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + +[[package]] +name = "proc-macro2" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pyo3" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a02a88a17e74cadbc8ce77855e1d6c8ad0ab82901a4a9b5046bd01c1c0bd95cd" +dependencies = [ + "cfg-if", + "indoc", + "libc", + "memoffset", + "parking_lot", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-build-config" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5eb0b6ecba38961f6f4bd6cd5906dfab3cd426ff37b2eed5771006aa31656f1" +dependencies = [ + "once_cell", + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8a6e48a29b5d22e4fdaf132d8ba8d3203ee9f06362d48f244346902a594ec3" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e80493c5965f94a747d0782a607b2328a4eea5391327b152b00e2f3b001cede" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcd7d86f42004025200e12a6a8119bd878329e6fddef8178eaafa4e4b5906c5b" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn", +] + +[[package]] +name = "quick-xml" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +dependencies = [ + "memchr", +] + +[[package]] +name = "quick-xmltodict" +version = "0.1.0" +dependencies = [ + "pyo3", + "quick-xml", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "syn" +version = "2.0.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "target-lexicon" +version = "0.12.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unindent" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..b633087 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "quick-xmltodict" +version = "0.1.0" +edition = "2021" + +[lib] +name = "quick_xmltodict" +crate-type = ["cdylib"] + +[dependencies] +pyo3 = "*" +quick-xml = "*" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..12cd026 --- /dev/null +++ b/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2024, Statnett + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1351c25 --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +# quick-xmltodict + +Efficient XML-to-dict conversion backed by Rust. + +```python +>>> from quick_xmltodict import parse + +>>> xml = """ +... +... +... Her +... Spike Jonze +... 2013 +... Science Fiction, Drama, Romance +... +... +... Encanto +... Byron Howard, Jared Bush +... 2021 +... Animation, Family, Fantasy +... +... +... """ + +>>> parse(xml) + +{'movies': {'movie': [{'director': 'Spike Jonze', + 'genre': 'Science Fiction, Drama, Romance', + 'title': 'Her', + 'year': '2013'}, + {'director': 'Byron Howard, Jared Bush', + 'genre': 'Animation, Family, Fantasy', + 'title': 'Encanto', + 'year': '2021'}]}} +``` + +## Features + +`quick-xmltodict` is a Rust-backed XML-to-dict conversion package that is designed to be fast and efficient. +It has a single function, `parse`, that takes an XML string and returns a Python dictionary. +You should be able to use this function as a drop-in replacement for the `xmltodict.parse` function from the original `xmltodict` package (used without any extra arguments). +Like `xmltodict`, `quick-xmltodict` follows [this](https://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html) schema for converting XML to JSON. + +`quick-xmltodict` currently does not support namespace expansion, or the reverse operation (dict-to-XML conversion). For these features, use the original `xmltodict` package. + +## Performance + +`quick-xmltodict` is currently about 2-5 times faster than `xmltodict`. +There are performance improvements to be made, so this difference is expected to increase. + +## Contributing + +PRs are very welcome! Please make sure to run the tests before submitting a PR. + +## Development + +This project uses [Poetry](https://python-poetry.org/) to manage the environment and Python dependencies. +To install the development environment and run the test suite: +```bash +poetry install +poetry run maturin develop +poetry run pytest +``` + +Be sure to run `poetry run maturin develop` after making changes to the Rust code. diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..33173b4 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,141 @@ +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.0" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "maturin" +version = "1.5.1" +description = "Build and publish crates with pyo3, rust-cpython and cffi bindings as well as rust binaries as python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "maturin-1.5.1-py3-none-linux_armv6l.whl", hash = "sha256:589e9b7024007e130b136ba6f1c2c8393a87e42cf968d12852913ab1e3c69ed3"}, + {file = "maturin-1.5.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:a1abda07093b3c8ef897626166c02ed64e3e446c48460b28efb51833abf89cbb"}, + {file = "maturin-1.5.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:48a1fbbdc2514525f27d6d339ab97b098ede28759f8593d110c89cc07bbe40ed"}, + {file = "maturin-1.5.1-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:96d96b1fa3a165db9ca539f764d31da8ebc92e31ca3a1dd6ccd50008d222bd96"}, + {file = "maturin-1.5.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:786bf36a98c4e27cbebb1dc8e432c1bcbbb59e7a9719592cbb89e46a0ccd5bcc"}, + {file = "maturin-1.5.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:d821b37da759884ad09cfee4cd9deac10f4132744cc66e4d9190a1972233bc83"}, + {file = "maturin-1.5.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:62133bf690555bbc8cc6b1c18a0c57b0ab2b4d68d3fcd320eb16df941563fe06"}, + {file = "maturin-1.5.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:6bff165252b1fcc887679ddf7b71b5cc024327ba96ea893133be38c0ed38f163"}, + {file = "maturin-1.5.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c42a95466ffc3de0a3940cd20c57cf0c44fe5ea679375d73422afbb00236c64"}, + {file = "maturin-1.5.1-py3-none-win32.whl", hash = "sha256:d09538b4aa0da4b59fd47cb429003b45bfd5d801714adf1db2511bf8bdea532f"}, + {file = "maturin-1.5.1-py3-none-win_amd64.whl", hash = "sha256:a3db9054222ac79275e082b21cfd234b8e036714a4ff227a0a28f6a3ffa3744d"}, + {file = "maturin-1.5.1-py3-none-win_arm64.whl", hash = "sha256:acf528e51413f6ae489473d64116d8c83f140386349004949d29137c16a82193"}, + {file = "maturin-1.5.1.tar.gz", hash = "sha256:3dd834ece80edb866af18cbd4635e0ecac40139c726428d5f1849ae154b26dca"}, +] + +[package.dependencies] +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +patchelf = ["patchelf"] +zig = ["ziglang (>=0.10.0,<0.11.0)"] + +[[package]] +name = "packaging" +version = "24.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, +] + +[[package]] +name = "pluggy" +version = "1.4.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pytest" +version = "8.1.1" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"}, + {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.4,<2.0" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "xmltodict" +version = "0.13.0" +description = "Makes working with XML feel like you are working with JSON" +optional = false +python-versions = ">=3.4" +files = [ + {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, + {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "24f93cc3f433ed56cd9193db740816185ffadd78c75d7c6afa93fe52fdba3258" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..9877666 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,132 @@ +[tool.poetry] +name = "quick-xmltodict" +version = "0.1.0" +description = "Efficient XML-to-dict conversion backed by Rust" +authors = ["Daniel Hjertholm <8713259+danhje@users.noreply.github.com>"] +package-mode = false + +[project] +name = "quick-xmltodict" +description = "Efficient XML-to-dict conversion backed by Rust" +version = "0.1.0" +keywords = ["xmltodict", "xml-to-dict", "xml", "fast", "rust"] +authors = [{name = "Daniel Hjertholm", email = "8713259+danhje@users.noreply.github.com"}] +license = {file = "LICENSE"} +requires-python = ">=3.10" +classifiers = [ + "Programming Language :: Rust", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy", + "Programming Language :: Python :: 3", + "Intended Audience :: Developers", + "Topic :: Text Processing :: Markup :: XML", + "License :: OSI Approved :: MIT License", +] +dynamic = ["version"] +readme = "README.md" + +[project.urls] +Repository = "https://github.com/danhje/quick-xmltodict.git" + +[tool.poetry.dependencies] +python = "^3.10" + +[tool.poetry.group.dev.dependencies] +maturin = "*" +pytest = "*" +xmltodict = "*" + +[build-system] +requires = ["maturin>=1.5,<2.0"] +build-backend = "maturin" + +[tool.maturin] +features = ["pyo3/extension-module"] + +[tool.ruff] +target-version = "py310" +line-length = 120 + +[tool.ruff.lint] +select = [ + "A", # flake8-builtins + "ANN", # flake8-annotations + "ARG", # flake8-unused-arguments + "B", # flake8-bugbear + "C4", # flake8-comprehensions + "C90", # mccabe + "COM", # flake8-commas + "D", # pydocstyle + "DTZ", # flake8-datetimez + "E", "W", # pycodestyle + "F", # Pyflakes + "FLY", # flynt + "FURB", # refurb + "G", # flake8-logging-format + "I", # isort + "LOG", # flake8-logging + "N", # pep8-nameing + "NPY", # numpy specific rules + "PERF", # Perflint + "PIE", # flake8-pie + "RUF", # Ruff specific rules + "S", # flake8-bandit + "SIM", # flake8-simplify + "T20", # flake8-print + "TCH001", # flake8-type-checking + "TRY", # tryceratops + "UP", # pyupgrade + "YTT", # flake8-2020 +] + +ignore = ['S101', 'ANN101', 'ANN102', 'ANN401', 'TRY003', 'D100', 'D101', 'D102', 'D103', 'D104', 'D105', 'D107'] + +# Allow autofix for all enabled rules (when `--fix`) is provided. +fixable = ["A", "B", "C", "D", "E", "F", "G", "I", "N", "Q", "S", "T", "W", "ANN", "ARG", "BLE", "COM", "DJ", "DTZ", "EM", "ERA", "EXE", "FBT", "ICN", "INP", "ISC", "NPY", "PD", "PGH", "PIE", "PL", "PT", "PTH", "PYI", "RET", "RSE", "RUF", "SIM", "SLF", "TCH", "TID", "TRY", "UP", "YTT"] +unfixable = [] + +# Exclude a variety of commonly ignored directories. +exclude = [ + ".bzr", + ".direnv", + ".eggs", + ".git", + ".git-rewrite", + ".hg", + ".mypy_cache", + ".nox", + ".pants.d", + ".pytype", + ".ruff_cache", + ".src", + ".svn", + ".tox", + ".venv", + "__pypackages__", + "_build", + "buck-out", + "build", + "dist", + "node_modules", + "target", + "venv", +] + +# Allow unused variables when underscore-prefixed. +dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" + +[tool.ruff.lint.pydocstyle] +convention = "google" + +[tool.ruff.lint.per-file-ignores] +"tests/test*.py" = ["ANN001", "ANN201"] + +[tool.ruff.lint.flake8-import-conventions] +[tool.ruff.lint.flake8-import-conventions.aliases] +# Declare the default aliases. +numpy = "np" +pandas = "pd" +scipy = "sp" + +[tool.ruff.lint.isort] +known-first-party = [] diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..7530651 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1 @@ +max_width = 120 diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..e7bab7d --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,138 @@ +use pyo3::prelude::*; +use pyo3::types::{PyDict, PyList, PyNone}; +use quick_xml::events::Event; +use quick_xml::name::QName; +use quick_xml::reader::Reader; + +trait QNameExt { + fn qn(&self) -> String; +} + +impl QNameExt for QName<'_> { + /// Returns the qualified name of the element (prefix:local_name). + fn qn(&self) -> String { + let mut name = std::str::from_utf8(self.local_name().as_ref()).unwrap().to_string(); + if let Some(prefix) = self.prefix() { + name = format!("{}:{}", std::str::from_utf8(prefix.as_ref()).unwrap(), name); + } + name + } +} + +#[derive(Debug)] +enum Value<'py> { + None, + Text(String), + Dict(&'py PyDict), +} + +impl ToPyObject for Value<'_> { + fn to_object(&self, py: Python) -> PyObject { + match self { + Value::None => PyNone::get(py).into(), + Value::Text(s) => s.to_object(py), + Value::Dict(d) => d.to_object(py), + } + } +} + +fn _update_dict<'a>(py: Python<'a>, d: &'a PyDict, tag_name: &str, value: &'a PyObject) { + if d.contains(tag_name).unwrap() { + let existing_val = d.get_item(tag_name).unwrap(); + let list: &PyList; + if existing_val.unwrap().is_instance_of::() { + list = existing_val.unwrap().downcast::().unwrap(); + } else { + list = PyList::new(py, existing_val); + } + + list.append(value).unwrap(); + d.set_item(tag_name, list).unwrap(); + } else { + d.set_item(tag_name, value).unwrap(); + } +} + +fn _parse<'a>(py: Python<'a>, xml: &'a str) -> &'a PyDict { + let mut reader = Reader::from_str(xml); + reader.trim_text(true); + + let d = PyDict::new(py); + loop { + match reader.read_event() { + Err(e) => panic!("Error at position {}: {:?}", reader.buffer_position(), e), + Ok(Event::Eof) => break, + Ok(Event::Empty(e)) => { + let tag_name = e.name().qn(); + + let value: Value; + if e.attributes().count() == 0 { + value = Value::None; + } else { + let attrs = PyDict::new(py); + for attr in e.attributes() { + let attr = attr.unwrap(); + attrs + .set_item(format!("@{}", attr.key.qn()), attr.unescape_value().unwrap()) + .unwrap(); + } + value = Value::Dict(attrs); + } + _update_dict(py, d, &tag_name, &value.to_object(py)); + } + Ok(Event::Text(e)) => { + let text = e.unescape().unwrap(); + d.set_item("#text".to_string(), text).unwrap(); + } + Ok(Event::Start(e)) => { + let tag_name = e.name().qn(); + + let mut value = Value::Dict(PyDict::new(py)); + if e.attributes().count() > 0 { + for attr in e.attributes() { + let attr = attr.unwrap(); + match value { + Value::Dict(d) => { + d.set_item(format!("@{}", attr.key.qn()), attr.unescape_value().unwrap()) + .unwrap(); + } + _ => unreachable!(), + } + } + } + + let content = reader.read_text(e.name()).unwrap(); + match value { + Value::Dict(d) => { + d.update(_parse(py, &content).as_mapping()).unwrap(); + } + _ => unreachable!(), + } + + match value { + Value::Dict(d) if d.len() == 1 && d.contains("#text").unwrap() => { + value = Value::Text(d.get_item("#text").unwrap().unwrap().extract::().unwrap()); + } + _ => (), + } + + _update_dict(py, d, &tag_name, &value.to_object(py)); + } + _ => (), + } + } + + d +} + +#[pyfunction] +fn parse(py: Python, xml: &str) -> PyResult { + let d = _parse(py, xml); + Ok(d.into()) +} + +#[pymodule] +fn quick_xmltodict(_py: Python, m: &PyModule) -> PyResult<()> { + m.add_function(wrap_pyfunction!(parse, m)?)?; + Ok(()) +} diff --git a/tests/data/forecast.json b/tests/data/forecast.json new file mode 100644 index 0000000..63d6ecd --- /dev/null +++ b/tests/data/forecast.json @@ -0,0 +1,8680 @@ +{ + "weatherdata": { + "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "@xsi:noNamespaceSchemaLocation": "https://schema.api.met.no/schemas/weatherapi-0.4.xsd", + "@created": "2024-03-25T14:50:06Z", + "meta": { + "model": { + "@name": "met_public_forecast", + "@termin": "2024-03-25T15:00:00Z", + "@runended": "2024-03-25T14:36:58Z", + "@nextrun": "2024-03-25T15:36:58Z", + "@from": "2024-03-25T14:00:00Z", + "@to": "2024-04-04T12:00:00Z" + } + }, + "product": { + "@class": "pointData", + "time": [ + { + "@datatype": "forecast", + "@from": "2024-03-25T14:00:00Z", + "@to": "2024-03-25T14:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.5" + }, + "windDirection": { + "@id": "dd", + "@deg": "108.4", + "@name": "E" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.1", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "4.1" + }, + "humidity": { + "@unit": "percent", + "@value": "60.8" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1003.1" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "72.8" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "35.6" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-5.6" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T15:00:00Z", + "@to": "2024-03-25T15:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "windDirection": { + "@id": "dd", + "@deg": "208.9", + "@name": "SW" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.0", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "3.4" + }, + "humidity": { + "@unit": "percent", + "@value": "61.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1003.0" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "86.4" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "71.9" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-5.5" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T14:00:00Z", + "@to": "2024-03-25T15:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T16:00:00Z", + "@to": "2024-03-25T16:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.4" + }, + "windDirection": { + "@id": "dd", + "@deg": "213.0", + "@name": "SW" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.4", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "3.4" + }, + "humidity": { + "@unit": "percent", + "@value": "63.0" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1002.8" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "92.3" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "78.3" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-5.2" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T15:00:00Z", + "@to": "2024-03-25T16:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T17:00:00Z", + "@to": "2024-03-25T17:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.9" + }, + "windDirection": { + "@id": "dd", + "@deg": "203.6", + "@name": "SW" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.3", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "3.2" + }, + "humidity": { + "@unit": "percent", + "@value": "67.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1002.8" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "95.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "66.1" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-4.6" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T16:00:00Z", + "@to": "2024-03-25T17:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.2" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T18:00:00Z", + "@to": "2024-03-25T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.4" + }, + "windDirection": { + "@id": "dd", + "@deg": "198.0", + "@name": "S" + }, + "windSpeed": { + "@id": "ff", + "@mps": "0.7", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "2.7" + }, + "humidity": { + "@unit": "percent", + "@value": "72.9" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1002.9" + }, + "cloudiness": { + "@id": "NN", + "@percent": "98.2" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "95.5" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "60.7" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-4.0" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T17:00:00Z", + "@to": "2024-03-25T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.2" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T19:00:00Z", + "@to": "2024-03-25T19:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.2" + }, + "windDirection": { + "@id": "dd", + "@deg": "102.3", + "@name": "E" + }, + "windSpeed": { + "@id": "ff", + "@mps": "0.5", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "1.5" + }, + "humidity": { + "@unit": "percent", + "@value": "79.4" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1003.1" + }, + "cloudiness": { + "@id": "NN", + "@percent": "99.3" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "95.5" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "80.5" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.3" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-2.9" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T18:00:00Z", + "@to": "2024-03-25T19:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T13:00:00Z", + "@to": "2024-03-25T19:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.2" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T20:00:00Z", + "@to": "2024-03-25T20:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.3" + }, + "windDirection": { + "@id": "dd", + "@deg": "153.3", + "@name": "SE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.2", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "2.3" + }, + "humidity": { + "@unit": "percent", + "@value": "87.7" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1003.2" + }, + "cloudiness": { + "@id": "NN", + "@percent": "99.6" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "98.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "85.7" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.4" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-1.6" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T19:00:00Z", + "@to": "2024-03-25T20:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T14:00:00Z", + "@to": "2024-03-25T20:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.6" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.2" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T21:00:00Z", + "@to": "2024-03-25T21:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.3" + }, + "windDirection": { + "@id": "dd", + "@deg": "166.1", + "@name": "S" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.6", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "2.9" + }, + "humidity": { + "@unit": "percent", + "@value": "91.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1003.3" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "99.8" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "91.5" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "1.9" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-1.2" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T20:00:00Z", + "@to": "2024-03-25T21:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.2" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T15:00:00Z", + "@to": "2024-03-25T21:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.7" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.2" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.4" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T22:00:00Z", + "@to": "2024-03-25T22:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.1" + }, + "windDirection": { + "@id": "dd", + "@deg": "150.7", + "@name": "SE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.3", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "3.5" + }, + "humidity": { + "@unit": "percent", + "@value": "93.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1003.2" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.4" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "56.1" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-1.0" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T21:00:00Z", + "@to": "2024-03-25T22:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.2" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T16:00:00Z", + "@to": "2024-03-25T22:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.9" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.1" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.9" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T23:00:00Z", + "@to": "2024-03-25T23:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.0" + }, + "windDirection": { + "@id": "dd", + "@deg": "191.2", + "@name": "S" + }, + "windSpeed": { + "@id": "ff", + "@mps": "0.8", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "2.5" + }, + "humidity": { + "@unit": "percent", + "@value": "96.8" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1003.4" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "23.2" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "47.1" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-0.6" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T22:00:00Z", + "@to": "2024-03-25T23:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.3" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T17:00:00Z", + "@to": "2024-03-25T23:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "1.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.0" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.4" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T00:00:00Z", + "@to": "2024-03-26T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.0" + }, + "windDirection": { + "@id": "dd", + "@deg": "17.9", + "@name": "N" + }, + "windSpeed": { + "@id": "ff", + "@mps": "0.3", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "1.6" + }, + "humidity": { + "@unit": "percent", + "@value": "96.6" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1003.4" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "15.8" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "58.6" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-0.6" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T23:00:00Z", + "@to": "2024-03-26T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.3" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T18:00:00Z", + "@to": "2024-03-26T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "1.2" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.0" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.3" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T01:00:00Z", + "@to": "2024-03-26T01:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.1" + }, + "windDirection": { + "@id": "dd", + "@deg": "116.2", + "@name": "SE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "0.7", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "1.5" + }, + "humidity": { + "@unit": "percent", + "@value": "95.0" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1003.2" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "3.6" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "95.5" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.8" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-1.0" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T00:00:00Z", + "@to": "2024-03-26T01:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.2" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T19:00:00Z", + "@to": "2024-03-26T01:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "1.2" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.1" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.3" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T02:00:00Z", + "@to": "2024-03-26T02:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.1" + }, + "windDirection": { + "@id": "dd", + "@deg": "51.5", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "0.4", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "1.5" + }, + "humidity": { + "@unit": "percent", + "@value": "97.2" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1003.0" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "3.7" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "99.4" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.4" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-0.7" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T01:00:00Z", + "@to": "2024-03-26T02:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.3" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T20:00:00Z", + "@to": "2024-03-26T02:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "1.3" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.1" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.3" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T03:00:00Z", + "@to": "2024-03-26T03:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.2" + }, + "windDirection": { + "@id": "dd", + "@deg": "23.2", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "0.4", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "1.0" + }, + "humidity": { + "@unit": "percent", + "@value": "98.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1002.7" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "7.2" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "99.6" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-0.7" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T02:00:00Z", + "@to": "2024-03-26T03:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.4" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T21:00:00Z", + "@to": "2024-03-26T03:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "1.6" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.2" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.1" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T04:00:00Z", + "@to": "2024-03-26T04:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.2" + }, + "windDirection": { + "@id": "dd", + "@deg": "46.7", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "0.9", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "1.8" + }, + "humidity": { + "@unit": "percent", + "@value": "97.1" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1002.5" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "2.4" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "96.7" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-1.0" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T03:00:00Z", + "@to": "2024-03-26T04:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.3" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T22:00:00Z", + "@to": "2024-03-26T04:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "1.5" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.2" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T05:00:00Z", + "@to": "2024-03-26T05:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.3" + }, + "windDirection": { + "@id": "dd", + "@deg": "78.0", + "@name": "E" + }, + "windSpeed": { + "@id": "ff", + "@mps": "0.6", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "2.1" + }, + "humidity": { + "@unit": "percent", + "@value": "95.2" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1002.4" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "1.4" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "75.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-1.4" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T04:00:00Z", + "@to": "2024-03-26T05:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.2" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-25T23:00:00Z", + "@to": "2024-03-26T05:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "1.4" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.3" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T06:00:00Z", + "@to": "2024-03-26T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.1" + }, + "windDirection": { + "@id": "dd", + "@deg": "358.8", + "@name": "N" + }, + "windSpeed": { + "@id": "ff", + "@mps": "0.4", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "1.4" + }, + "humidity": { + "@unit": "percent", + "@value": "94.2" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1002.6" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.7" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "20.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "8.1" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-1.1" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T05:00:00Z", + "@to": "2024-03-26T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.2" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T00:00:00Z", + "@to": "2024-03-26T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "1.4" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.3" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.1" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T07:00:00Z", + "@to": "2024-03-26T07:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.4" + }, + "windDirection": { + "@id": "dd", + "@deg": "89.4", + "@name": "E" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.3", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "2.7" + }, + "humidity": { + "@unit": "percent", + "@value": "91.1" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1002.7" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.3" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "69.7" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "61.7" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-1.3" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T06:00:00Z", + "@to": "2024-03-26T07:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.3" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T01:00:00Z", + "@to": "2024-03-26T07:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "1.4" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.3" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.4" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T08:00:00Z", + "@to": "2024-03-26T08:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.6" + }, + "windDirection": { + "@id": "dd", + "@deg": "119.5", + "@name": "SE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.7", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "3.5" + }, + "humidity": { + "@unit": "percent", + "@value": "87.7" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1002.6" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.3" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "99.8" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "97.5" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "77.8" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-1.7" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T07:00:00Z", + "@to": "2024-03-26T08:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.2", + "@minvalue": "0.0", + "@maxvalue": "0.5" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T02:00:00Z", + "@to": "2024-03-26T08:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "2.8", + "@minvalue": "0.0", + "@maxvalue": "4.2" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.3" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.6" + }, + "symbol": { + "@id": "Snow", + "@number": "13", + "@code": "snow" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T09:00:00Z", + "@to": "2024-03-26T09:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.9" + }, + "windDirection": { + "@id": "dd", + "@deg": "118.7", + "@name": "SE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.8", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "3.9" + }, + "humidity": { + "@unit": "percent", + "@value": "84.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1002.5" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.3" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "98.3" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "81.5" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-1.9" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T08:00:00Z", + "@to": "2024-03-26T09:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.2", + "@minvalue": "0.0", + "@maxvalue": "0.7" + }, + "symbol": { + "@id": "LightSnow", + "@number": "49", + "@code": "lightsnow" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T03:00:00Z", + "@to": "2024-03-26T09:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "2.1", + "@minvalue": "0.1", + "@maxvalue": "3.7" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.3" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.9" + }, + "symbol": { + "@id": "Snow", + "@number": "13", + "@code": "snow" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T10:00:00Z", + "@to": "2024-03-26T10:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.1" + }, + "windDirection": { + "@id": "dd", + "@deg": "88.3", + "@name": "E" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.6", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "3.5" + }, + "humidity": { + "@unit": "percent", + "@value": "87.7" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1002.4" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.5" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "79.7" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "78.2" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-0.9" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T09:00:00Z", + "@to": "2024-03-26T10:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.3", + "@minvalue": "0.0", + "@maxvalue": "0.5" + }, + "symbol": { + "@id": "Snow", + "@number": "13", + "@code": "snow" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T04:00:00Z", + "@to": "2024-03-26T10:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "1.5", + "@minvalue": "0.1", + "@maxvalue": "2.3" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.3" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.1" + }, + "symbol": { + "@id": "Sleet", + "@number": "12", + "@code": "sleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T11:00:00Z", + "@to": "2024-03-26T11:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.7" + }, + "windDirection": { + "@id": "dd", + "@deg": "114.0", + "@name": "SE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.2", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "4.2" + }, + "humidity": { + "@unit": "percent", + "@value": "83.8" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1002.0" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.1" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "62.6" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "77.4" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-0.9" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T10:00:00Z", + "@to": "2024-03-26T11:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.2", + "@minvalue": "0.0", + "@maxvalue": "0.5" + }, + "symbol": { + "@id": "LightSleet", + "@number": "47", + "@code": "lightsleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T05:00:00Z", + "@to": "2024-03-26T11:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "1.3", + "@minvalue": "0.1", + "@maxvalue": "2.4" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.1" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.7" + }, + "symbol": { + "@id": "Sleet", + "@number": "12", + "@code": "sleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T12:00:00Z", + "@to": "2024-03-26T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.8" + }, + "windDirection": { + "@id": "dd", + "@deg": "106.5", + "@name": "E" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.1", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "4.2" + }, + "humidity": { + "@unit": "percent", + "@value": "85.9" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1001.8" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.1" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "69.5" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "98.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-0.3" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T11:00:00Z", + "@to": "2024-03-26T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.3", + "@minvalue": "0.0", + "@maxvalue": "0.5" + }, + "symbol": { + "@id": "Sleet", + "@number": "12", + "@code": "sleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T06:00:00Z", + "@to": "2024-03-26T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "1.4", + "@minvalue": "0.1", + "@maxvalue": "2.7" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.4" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.8" + }, + "symbol": { + "@id": "Sleet", + "@number": "12", + "@code": "sleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T13:00:00Z", + "@to": "2024-03-26T13:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.9" + }, + "windDirection": { + "@id": "dd", + "@deg": "148.3", + "@name": "SE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.5", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "4.1" + }, + "humidity": { + "@unit": "percent", + "@value": "88.1" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1001.7" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.3" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "76.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "99.6" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.0" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T12:00:00Z", + "@to": "2024-03-26T13:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.3", + "@minvalue": "0.0", + "@maxvalue": "0.7" + }, + "symbol": { + "@id": "Sleet", + "@number": "12", + "@code": "sleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T07:00:00Z", + "@to": "2024-03-26T13:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "1.5", + "@minvalue": "0.3", + "@maxvalue": "2.9" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.9" + }, + "symbol": { + "@id": "Sleet", + "@number": "12", + "@code": "sleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T14:00:00Z", + "@to": "2024-03-26T14:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.4" + }, + "windDirection": { + "@id": "dd", + "@deg": "149.6", + "@name": "SE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.5", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "3.0" + }, + "humidity": { + "@unit": "percent", + "@value": "89.2" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1001.5" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.1" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "86.3" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "99.1" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.6" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T13:00:00Z", + "@to": "2024-03-26T14:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.2", + "@minvalue": "0.1", + "@maxvalue": "0.8" + }, + "symbol": { + "@id": "LightSleet", + "@number": "47", + "@code": "lightsleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T08:00:00Z", + "@to": "2024-03-26T14:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "1.6", + "@minvalue": "0.5", + "@maxvalue": "3.2" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.9" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.4" + }, + "symbol": { + "@id": "Sleet", + "@number": "12", + "@code": "sleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T15:00:00Z", + "@to": "2024-03-26T15:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.3" + }, + "windDirection": { + "@id": "dd", + "@deg": "125.0", + "@name": "SE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.5", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "3.1" + }, + "humidity": { + "@unit": "percent", + "@value": "89.6" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1000.9" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "99.8" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "93.7" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "90.1" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.7" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T14:00:00Z", + "@to": "2024-03-26T15:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.1", + "@minvalue": "0.1", + "@maxvalue": "0.9" + }, + "symbol": { + "@id": "Drizzle", + "@number": "46", + "@code": "lightrain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T09:00:00Z", + "@to": "2024-03-26T15:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "1.5", + "@minvalue": "0.6", + "@maxvalue": "3.3" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.1" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.4" + }, + "symbol": { + "@id": "Sleet", + "@number": "12", + "@code": "sleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T16:00:00Z", + "@to": "2024-03-26T16:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.7" + }, + "windDirection": { + "@id": "dd", + "@deg": "97.9", + "@name": "E" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.1", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "4.1" + }, + "humidity": { + "@unit": "percent", + "@value": "86.1" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1000.4" + }, + "cloudiness": { + "@id": "NN", + "@percent": "99.8" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "92.8" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "95.8" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "49.9" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.5" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T15:00:00Z", + "@to": "2024-03-26T16:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.3", + "@minvalue": "0.1", + "@maxvalue": "1.0" + }, + "symbol": { + "@id": "LightRain", + "@number": "9", + "@code": "rain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T10:00:00Z", + "@to": "2024-03-26T16:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "1.3", + "@minvalue": "0.7", + "@maxvalue": "3.5" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.7" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.7" + }, + "symbol": { + "@id": "Sleet", + "@number": "12", + "@code": "sleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T17:00:00Z", + "@to": "2024-03-26T17:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.8" + }, + "windDirection": { + "@id": "dd", + "@deg": "144.6", + "@name": "SE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.6", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "4.8" + }, + "humidity": { + "@unit": "percent", + "@value": "89.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1000.5" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.1" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "99.9" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "95.2" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "12.3" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "1.1" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T16:00:00Z", + "@to": "2024-03-26T17:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.2", + "@minvalue": "0.1", + "@maxvalue": "1.0" + }, + "symbol": { + "@id": "Drizzle", + "@number": "46", + "@code": "lightrain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T11:00:00Z", + "@to": "2024-03-26T17:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "1.4", + "@minvalue": "0.7", + "@maxvalue": "4.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.8" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.8" + }, + "symbol": { + "@id": "LightRain", + "@number": "9", + "@code": "rain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T18:00:00Z", + "@to": "2024-03-26T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.5" + }, + "windDirection": { + "@id": "dd", + "@deg": "122.9", + "@name": "SE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.3", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "4.9" + }, + "humidity": { + "@unit": "percent", + "@value": "90.0" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1000.6" + }, + "cloudiness": { + "@id": "NN", + "@percent": "98.5" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "89.3" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "85.3" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.3" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.9" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T17:00:00Z", + "@to": "2024-03-26T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.2", + "@minvalue": "0.0", + "@maxvalue": "0.8" + }, + "symbol": { + "@id": "LightRain", + "@number": "9", + "@code": "rain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T12:00:00Z", + "@to": "2024-03-26T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "1.4", + "@minvalue": "0.7", + "@maxvalue": "4.4" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.9" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.8" + }, + "symbol": { + "@id": "LightRain", + "@number": "9", + "@code": "rain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T19:00:00Z", + "@to": "2024-03-26T19:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.1" + }, + "windDirection": { + "@id": "dd", + "@deg": "124.3", + "@name": "SE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.1", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "4.1" + }, + "humidity": { + "@unit": "percent", + "@value": "89.7" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1000.6" + }, + "cloudiness": { + "@id": "NN", + "@percent": "99.8" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "98.7" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "81.8" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.4" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T18:00:00Z", + "@to": "2024-03-26T19:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.2", + "@minvalue": "0.0", + "@maxvalue": "0.7" + }, + "symbol": { + "@id": "Drizzle", + "@number": "46", + "@code": "lightrain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T13:00:00Z", + "@to": "2024-03-26T19:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "1.1", + "@minvalue": "0.7", + "@maxvalue": "4.5" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.1" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.8" + }, + "symbol": { + "@id": "LightRain", + "@number": "9", + "@code": "rain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T20:00:00Z", + "@to": "2024-03-26T20:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.9" + }, + "windDirection": { + "@id": "dd", + "@deg": "131.5", + "@name": "SE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.9", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "3.9" + }, + "humidity": { + "@unit": "percent", + "@value": "90.7" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1000.9" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "87.1" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.3" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T19:00:00Z", + "@to": "2024-03-26T20:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.2", + "@minvalue": "0.0", + "@maxvalue": "0.7" + }, + "symbol": { + "@id": "LightSleet", + "@number": "47", + "@code": "lightsleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T14:00:00Z", + "@to": "2024-03-26T20:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.9", + "@minvalue": "0.6", + "@maxvalue": "4.5" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.9" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.8" + }, + "symbol": { + "@id": "Drizzle", + "@number": "46", + "@code": "lightrain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T21:00:00Z", + "@to": "2024-03-26T21:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.7" + }, + "windDirection": { + "@id": "dd", + "@deg": "99.5", + "@name": "E" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.2", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "3.3" + }, + "humidity": { + "@unit": "percent", + "@value": "92.1" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1001.0" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.1" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "87.6" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.4" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T20:00:00Z", + "@to": "2024-03-26T21:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.1", + "@minvalue": "0.0", + "@maxvalue": "0.6" + }, + "symbol": { + "@id": "LightSleet", + "@number": "47", + "@code": "lightsleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T15:00:00Z", + "@to": "2024-03-26T21:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.9", + "@minvalue": "0.4", + "@maxvalue": "3.9" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.7" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.8" + }, + "symbol": { + "@id": "Drizzle", + "@number": "46", + "@code": "lightrain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T22:00:00Z", + "@to": "2024-03-26T22:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "windDirection": { + "@id": "dd", + "@deg": "58.9", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.3", + "@beaufort": "1", + "@name": "Flau vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "2.3" + }, + "humidity": { + "@unit": "percent", + "@value": "93.4" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1000.7" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.3" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "86.6" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.5" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T21:00:00Z", + "@to": "2024-03-26T22:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.2", + "@minvalue": "0.0", + "@maxvalue": "0.7" + }, + "symbol": { + "@id": "LightSleet", + "@number": "47", + "@code": "lightsleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T16:00:00Z", + "@to": "2024-03-26T22:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.9", + "@minvalue": "0.3", + "@maxvalue": "3.7" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.8" + }, + "symbol": { + "@id": "LightSleet", + "@number": "47", + "@code": "lightsleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T23:00:00Z", + "@to": "2024-03-26T23:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "windDirection": { + "@id": "dd", + "@deg": "67.3", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.6", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "3.0" + }, + "humidity": { + "@unit": "percent", + "@value": "92.5" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1000.4" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.1" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "89.2" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.1" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.4" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T22:00:00Z", + "@to": "2024-03-26T23:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.2", + "@minvalue": "0.0", + "@maxvalue": "0.6" + }, + "symbol": { + "@id": "LightSleet", + "@number": "47", + "@code": "lightsleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T17:00:00Z", + "@to": "2024-03-26T23:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.9", + "@minvalue": "0.3", + "@maxvalue": "3.5" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.5" + }, + "symbol": { + "@id": "LightSleet", + "@number": "47", + "@code": "lightsleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T00:00:00Z", + "@to": "2024-03-27T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.7" + }, + "windDirection": { + "@id": "dd", + "@deg": "59.0", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.0", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "3.6" + }, + "humidity": { + "@unit": "percent", + "@value": "93.7" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1000.1" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.4" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "65.5" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "17.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.7" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T23:00:00Z", + "@to": "2024-03-27T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.2", + "@minvalue": "0.0", + "@maxvalue": "0.4" + }, + "symbol": { + "@id": "Sleet", + "@number": "12", + "@code": "sleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T18:00:00Z", + "@to": "2024-03-27T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.9", + "@minvalue": "0.4", + "@maxvalue": "2.9" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.1" + }, + "symbol": { + "@id": "LightSleet", + "@number": "47", + "@code": "lightsleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T01:00:00Z", + "@to": "2024-03-27T01:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.7" + }, + "windDirection": { + "@id": "dd", + "@deg": "34.3", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.6", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "4.6" + }, + "humidity": { + "@unit": "percent", + "@value": "90.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "999.5" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "60.8" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "39.5" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.2" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T00:00:00Z", + "@to": "2024-03-27T01:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.5" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T19:00:00Z", + "@to": "2024-03-27T01:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.9", + "@minvalue": "0.3", + "@maxvalue": "2.8" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.9" + }, + "symbol": { + "@id": "LightSleet", + "@number": "47", + "@code": "lightsleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T02:00:00Z", + "@to": "2024-03-27T02:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.8" + }, + "windDirection": { + "@id": "dd", + "@deg": "43.7", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.1", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "5.4" + }, + "humidity": { + "@unit": "percent", + "@value": "90.8" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "998.9" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "15.7" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "83.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.4" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T01:00:00Z", + "@to": "2024-03-27T02:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.3" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T20:00:00Z", + "@to": "2024-03-27T02:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.9", + "@minvalue": "0.2", + "@maxvalue": "2.6" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.8" + }, + "symbol": { + "@id": "LightSleet", + "@number": "47", + "@code": "lightsleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T03:00:00Z", + "@to": "2024-03-27T03:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.8" + }, + "windDirection": { + "@id": "dd", + "@deg": "46.0", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.6", + "@beaufort": "3", + "@name": "Lett bris" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "6.6" + }, + "humidity": { + "@unit": "percent", + "@value": "91.7" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "998.4" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "99.9" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "14.9" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "76.8" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.5" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T02:00:00Z", + "@to": "2024-03-27T03:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T21:00:00Z", + "@to": "2024-03-27T03:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.8", + "@minvalue": "0.1", + "@maxvalue": "2.1" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.8" + }, + "symbol": { + "@id": "LightSleet", + "@number": "47", + "@code": "lightsleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T04:00:00Z", + "@to": "2024-03-27T04:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.7" + }, + "windDirection": { + "@id": "dd", + "@deg": "52.3", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.0", + "@beaufort": "3", + "@name": "Lett bris" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "7.2" + }, + "humidity": { + "@unit": "percent", + "@value": "91.9" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "998.2" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "99.9" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "30.9" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "45.8" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.5" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T03:00:00Z", + "@to": "2024-03-27T04:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T22:00:00Z", + "@to": "2024-03-27T04:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.6", + "@minvalue": "0.1", + "@maxvalue": "1.6" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.8" + }, + "symbol": { + "@id": "LightSleet", + "@number": "47", + "@code": "lightsleet" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T05:00:00Z", + "@to": "2024-03-27T05:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "windDirection": { + "@id": "dd", + "@deg": "48.9", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.0", + "@beaufort": "3", + "@name": "Lett bris" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "7.4" + }, + "humidity": { + "@unit": "percent", + "@value": "92.1" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "998.0" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "51.3" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "21.5" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.4" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T04:00:00Z", + "@to": "2024-03-27T05:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-26T23:00:00Z", + "@to": "2024-03-27T05:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "1.3" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.8" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T06:00:00Z", + "@to": "2024-03-27T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.8" + }, + "windDirection": { + "@id": "dd", + "@deg": "58.1", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.8", + "@beaufort": "3", + "@name": "Lett bris" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "7.3" + }, + "humidity": { + "@unit": "percent", + "@value": "90.1" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "998.1" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "68.4" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "9.2" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.4" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T05:00:00Z", + "@to": "2024-03-27T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T00:00:00Z", + "@to": "2024-03-27T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "1.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.8" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T07:00:00Z", + "@to": "2024-03-27T07:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.0" + }, + "windDirection": { + "@id": "dd", + "@deg": "55.2", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.9", + "@beaufort": "3", + "@name": "Lett bris" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "7.2" + }, + "humidity": { + "@unit": "percent", + "@value": "88.8" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "998.2" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "28.1" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "38.2" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.3" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T06:00:00Z", + "@to": "2024-03-27T07:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T01:00:00Z", + "@to": "2024-03-27T07:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.6" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T08:00:00Z", + "@to": "2024-03-27T08:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.1" + }, + "windDirection": { + "@id": "dd", + "@deg": "52.1", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.9", + "@beaufort": "3", + "@name": "Lett bris" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "7.4" + }, + "humidity": { + "@unit": "percent", + "@value": "87.9" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "998.0" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "72.2" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "93.1" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.3" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T07:00:00Z", + "@to": "2024-03-27T08:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T02:00:00Z", + "@to": "2024-03-27T08:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.1" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T09:00:00Z", + "@to": "2024-03-27T09:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.2" + }, + "windDirection": { + "@id": "dd", + "@deg": "54.0", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.1", + "@beaufort": "3", + "@name": "Lett bris" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "7.7" + }, + "humidity": { + "@unit": "percent", + "@value": "87.1" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "997.7" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "92.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "95.3" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.3" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T08:00:00Z", + "@to": "2024-03-27T09:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T03:00:00Z", + "@to": "2024-03-27T09:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.2" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T10:00:00Z", + "@to": "2024-03-27T10:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.2" + }, + "windDirection": { + "@id": "dd", + "@deg": "47.4", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.3", + "@beaufort": "3", + "@name": "Lett bris" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "8.4" + }, + "humidity": { + "@unit": "percent", + "@value": "83.6" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "997.2" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "99.5" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "73.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "80.9" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-0.2" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T09:00:00Z", + "@to": "2024-03-27T10:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T04:00:00Z", + "@to": "2024-03-27T10:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.2" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T11:00:00Z", + "@to": "2024-03-27T11:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "3.2" + }, + "windDirection": { + "@id": "dd", + "@deg": "53.8", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.0", + "@beaufort": "3", + "@name": "Lett bris" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "8.3" + }, + "humidity": { + "@unit": "percent", + "@value": "79.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "997.0" + }, + "cloudiness": { + "@id": "NN", + "@percent": "99.9" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "99.6" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "80.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "7.1" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.0" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T10:00:00Z", + "@to": "2024-03-27T11:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T05:00:00Z", + "@to": "2024-03-27T11:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.8" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "3.2" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T12:00:00Z", + "@to": "2024-03-27T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.1" + }, + "windDirection": { + "@id": "dd", + "@deg": "59.4", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.0", + "@beaufort": "3", + "@name": "Lett bris" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "8.0" + }, + "humidity": { + "@unit": "percent", + "@value": "77.0" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "996.9" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "69.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "35.2" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.5" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T11:00:00Z", + "@to": "2024-03-27T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T06:00:00Z", + "@to": "2024-03-27T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.0" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.1" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T13:00:00Z", + "@to": "2024-03-27T13:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "5.6" + }, + "windDirection": { + "@id": "dd", + "@deg": "63.9", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.3", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "7.9" + }, + "humidity": { + "@unit": "percent", + "@value": "77.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "996.9" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "77.7" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "72.7" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "1.9" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T12:00:00Z", + "@to": "2024-03-27T13:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T07:00:00Z", + "@to": "2024-03-27T13:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.1" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "5.6" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T14:00:00Z", + "@to": "2024-03-27T14:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "6.9" + }, + "windDirection": { + "@id": "dd", + "@deg": "59.9", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.1", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "6.5" + }, + "humidity": { + "@unit": "percent", + "@value": "76.2" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "996.8" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "99.9" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "85.2" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "99.7" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "3.0" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T13:00:00Z", + "@to": "2024-03-27T14:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T08:00:00Z", + "@to": "2024-03-27T14:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.2" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "6.9" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T15:00:00Z", + "@to": "2024-03-27T15:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.4" + }, + "windDirection": { + "@id": "dd", + "@deg": "55.8", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.8", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "6.0" + }, + "humidity": { + "@unit": "percent", + "@value": "75.7" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "996.6" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "99.3" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "57.6" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "94.3" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "3.4" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T14:00:00Z", + "@to": "2024-03-27T15:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T09:00:00Z", + "@to": "2024-03-27T15:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.2" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.4" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T16:00:00Z", + "@to": "2024-03-27T16:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.7" + }, + "windDirection": { + "@id": "dd", + "@deg": "51.5", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.1", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "5.7" + }, + "humidity": { + "@unit": "percent", + "@value": "75.4" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "996.3" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "99.4" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "37.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "99.4" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "3.6" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T15:00:00Z", + "@to": "2024-03-27T16:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T10:00:00Z", + "@to": "2024-03-27T16:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "3.2" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.7" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T17:00:00Z", + "@to": "2024-03-27T17:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.3" + }, + "windDirection": { + "@id": "dd", + "@deg": "48.6", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.7", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "5.7" + }, + "humidity": { + "@unit": "percent", + "@value": "77.2" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "996.3" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "97.1" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "72.3" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "100.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "3.5" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T16:00:00Z", + "@to": "2024-03-27T17:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T11:00:00Z", + "@to": "2024-03-27T17:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.1" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.7" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T18:00:00Z", + "@to": "2024-03-27T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "6.0" + }, + "windDirection": { + "@id": "dd", + "@deg": "27.4", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.3", + "@beaufort": "2", + "@name": "Svak vind" + }, + "windGust": { + "@id": "ff_gust", + "@mps": "5.9" + }, + "humidity": { + "@unit": "percent", + "@value": "80.2" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "995.9" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "fog": { + "@id": "FOG", + "@percent": "0.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "87.7" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "73.5" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "99.9" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "2.9" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T17:00:00Z", + "@to": "2024-03-27T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T12:00:00Z", + "@to": "2024-03-27T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "5.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.7" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-28T00:00:00Z", + "@to": "2024-03-28T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.1" + }, + "windDirection": { + "@id": "dd", + "@deg": "36.0", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.7", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "89.5" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "997.3" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "45.3" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "50.8" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "100.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "2.5" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-27T18:00:00Z", + "@to": "2024-03-28T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.1" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "6.7" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-28T06:00:00Z", + "@to": "2024-03-28T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "3.8" + }, + "windDirection": { + "@id": "dd", + "@deg": "33.7", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.6", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "90.2" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "996.7" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "75.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "79.7" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "98.4" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "2.2" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-28T00:00:00Z", + "@to": "2024-03-28T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "3.5" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.1" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-28T12:00:00Z", + "@to": "2024-03-28T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "6.4" + }, + "windDirection": { + "@id": "dd", + "@deg": "33.0", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.8", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "83.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "995.3" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "100.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "94.5" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "3.6" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-28T06:00:00Z", + "@to": "2024-03-28T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.7" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "3.8" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "6.7" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-28T18:00:00Z", + "@to": "2024-03-28T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "8.0" + }, + "windDirection": { + "@id": "dd", + "@deg": "29.7", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.8", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "95.9" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "991.8" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "100.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "68.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "7.4" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-28T12:00:00Z", + "@to": "2024-03-28T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "2.2", + "@minvalue": "0.0", + "@maxvalue": "5.1" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "6.4" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "8.2" + }, + "symbol": { + "@id": "LightRain", + "@number": "9", + "@code": "rain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-29T00:00:00Z", + "@to": "2024-03-29T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "5.8" + }, + "windDirection": { + "@id": "dd", + "@deg": "52.6", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.3", + "@beaufort": "2", + "@name": "Svak vind" + }, + "humidity": { + "@unit": "percent", + "@value": "97.0" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "991.0" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "100.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "99.2" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "5.3" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-28T18:00:00Z", + "@to": "2024-03-29T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "4.5", + "@minvalue": "0.4", + "@maxvalue": "11.8" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "5.8" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "8.0" + }, + "symbol": { + "@id": "LightRain", + "@number": "9", + "@code": "rain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-29T06:00:00Z", + "@to": "2024-03-29T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.4" + }, + "windDirection": { + "@id": "dd", + "@deg": "193.6", + "@name": "S" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.1", + "@beaufort": "2", + "@name": "Svak vind" + }, + "humidity": { + "@unit": "percent", + "@value": "98.2" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "992.3" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "89.8" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "100.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "100.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "4.0" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-29T00:00:00Z", + "@to": "2024-03-29T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "2.9", + "@minvalue": "0.0", + "@maxvalue": "7.4" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.3" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "5.8" + }, + "symbol": { + "@id": "LightRain", + "@number": "9", + "@code": "rain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-29T12:00:00Z", + "@to": "2024-03-29T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "8.3" + }, + "windDirection": { + "@id": "dd", + "@deg": "201.4", + "@name": "S" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.3", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "80.4" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "995.1" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "100.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "99.2" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "5.0" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-29T06:00:00Z", + "@to": "2024-03-29T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.4" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "8.3" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-29T18:00:00Z", + "@to": "2024-03-29T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.6" + }, + "windDirection": { + "@id": "dd", + "@deg": "191.5", + "@name": "S" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.1", + "@beaufort": "2", + "@name": "Svak vind" + }, + "humidity": { + "@unit": "percent", + "@value": "90.8" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "997.3" + }, + "cloudiness": { + "@id": "NN", + "@percent": "98.4" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "54.7" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "61.3" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "84.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "6.2" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-29T12:00:00Z", + "@to": "2024-03-29T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "9.2" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-30T00:00:00Z", + "@to": "2024-03-30T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.7" + }, + "windDirection": { + "@id": "dd", + "@deg": "194.1", + "@name": "S" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.9", + "@beaufort": "2", + "@name": "Svak vind" + }, + "humidity": { + "@unit": "percent", + "@value": "95.1" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1001.6" + }, + "cloudiness": { + "@id": "NN", + "@percent": "51.6" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "51.6" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "0.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "3.9" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-29T18:00:00Z", + "@to": "2024-03-30T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.5" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.6" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-30T06:00:00Z", + "@to": "2024-03-30T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "3.8" + }, + "windDirection": { + "@id": "dd", + "@deg": "200.5", + "@name": "S" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.2", + "@beaufort": "1", + "@name": "Flau vind" + }, + "humidity": { + "@unit": "percent", + "@value": "98.4" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1003.0" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "15.2" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "37.5" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "3.5" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-30T00:00:00Z", + "@to": "2024-03-30T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "3.4" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.9" + }, + "symbol": { + "@id": "PartlyCloud", + "@number": "3", + "@code": "partlycloudy_night" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-30T12:00:00Z", + "@to": "2024-03-30T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "9.4" + }, + "windDirection": { + "@id": "dd", + "@deg": "191.3", + "@name": "S" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.1", + "@beaufort": "2", + "@name": "Svak vind" + }, + "humidity": { + "@unit": "percent", + "@value": "79.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1005.3" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "100.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "99.6" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "6.0" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-30T06:00:00Z", + "@to": "2024-03-30T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "3.8" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "9.5" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-30T18:00:00Z", + "@to": "2024-03-30T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.8" + }, + "windDirection": { + "@id": "dd", + "@deg": "169.9", + "@name": "S" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.3", + "@beaufort": "2", + "@name": "Svak vind" + }, + "humidity": { + "@unit": "percent", + "@value": "87.6" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1006.6" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "0.8" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "49.2" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "100.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "5.9" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-30T12:00:00Z", + "@to": "2024-03-30T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.8" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "10.4" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-31T00:00:00Z", + "@to": "2024-03-31T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "5.1" + }, + "windDirection": { + "@id": "dd", + "@deg": "30.8", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "1.7", + "@beaufort": "2", + "@name": "Svak vind" + }, + "humidity": { + "@unit": "percent", + "@value": "95.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1008.5" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "98.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "63.7" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "35.9" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "4.4" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-30T18:00:00Z", + "@to": "2024-03-31T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.8" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-31T06:00:00Z", + "@to": "2024-03-31T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.7" + }, + "windDirection": { + "@id": "dd", + "@deg": "30.1", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.0", + "@beaufort": "2", + "@name": "Svak vind" + }, + "humidity": { + "@unit": "percent", + "@value": "94.6" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1009.9" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "100.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "39.1" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "3.8" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-31T00:00:00Z", + "@to": "2024-03-31T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.3" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "5.3" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-31T12:00:00Z", + "@to": "2024-03-31T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "9.6" + }, + "windDirection": { + "@id": "dd", + "@deg": "33.9", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.3", + "@beaufort": "2", + "@name": "Svak vind" + }, + "humidity": { + "@unit": "percent", + "@value": "80.1" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1011.1" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "94.9" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "26.2" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "6.3" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-31T06:00:00Z", + "@to": "2024-03-31T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.7" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "9.7" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-31T18:00:00Z", + "@to": "2024-03-31T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "8.3" + }, + "windDirection": { + "@id": "dd", + "@deg": "21.3", + "@name": "N" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.6", + "@beaufort": "2", + "@name": "Svak vind" + }, + "humidity": { + "@unit": "percent", + "@value": "86.1" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1011.0" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "82.8" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "100.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "6.1" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-31T12:00:00Z", + "@to": "2024-03-31T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "8.3" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "11.0" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-01T00:00:00Z", + "@to": "2024-04-01T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "5.0" + }, + "windDirection": { + "@id": "dd", + "@deg": "28.7", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.4", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "90.6" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1011.4" + }, + "cloudiness": { + "@id": "NN", + "@percent": "69.1" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "23.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "10.5" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "58.6" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "3.5" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-03-31T18:00:00Z", + "@to": "2024-04-01T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.5" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.3" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "8.3" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-01T06:00:00Z", + "@to": "2024-04-01T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.2" + }, + "windDirection": { + "@id": "dd", + "@deg": "30.6", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.0", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "84.9" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1012.3" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "94.5" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "96.9" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "1.7" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-01T00:00:00Z", + "@to": "2024-04-01T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "3.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "5.0" + }, + "symbol": { + "@id": "PartlyCloud", + "@number": "3", + "@code": "partlycloudy_night" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-01T12:00:00Z", + "@to": "2024-04-01T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.0" + }, + "windDirection": { + "@id": "dd", + "@deg": "33.6", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.1", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "72.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1011.1" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "92.2" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "100.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "82.8" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "2.3" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-01T06:00:00Z", + "@to": "2024-04-01T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.2" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.1" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-01T18:00:00Z", + "@to": "2024-04-01T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "6.1" + }, + "windDirection": { + "@id": "dd", + "@deg": "30.8", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.7", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "90.6" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1009.3" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "99.2" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "96.9" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "4.6" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-01T12:00:00Z", + "@to": "2024-04-01T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "1.3", + "@minvalue": "0.0", + "@maxvalue": "1.6" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "6.1" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "7.8" + }, + "symbol": { + "@id": "LightRain", + "@number": "9", + "@code": "rain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-02T00:00:00Z", + "@to": "2024-04-02T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.8" + }, + "windDirection": { + "@id": "dd", + "@deg": "30.7", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.3", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "87.7" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1009.3" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "93.7" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "95.3" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "0.8" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-01T18:00:00Z", + "@to": "2024-04-02T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "1.4", + "@minvalue": "0.0", + "@maxvalue": "1.7" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.8" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "6.1" + }, + "symbol": { + "@id": "LightRain", + "@number": "9", + "@code": "rain" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-02T06:00:00Z", + "@to": "2024-04-02T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.6" + }, + "windDirection": { + "@id": "dd", + "@deg": "28.8", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.4", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "78.9" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1008.9" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "100.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "53.1" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-0.8" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-02T00:00:00Z", + "@to": "2024-04-02T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.9" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "3.3" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-02T12:00:00Z", + "@to": "2024-04-02T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.7" + }, + "windDirection": { + "@id": "dd", + "@deg": "32.6", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.7", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "68.7" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1008.3" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "97.3" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "100.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-0.8" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-02T06:00:00Z", + "@to": "2024-04-02T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.8" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-02T18:00:00Z", + "@to": "2024-04-02T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.6" + }, + "windDirection": { + "@id": "dd", + "@deg": "29.8", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "3.9", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "70.9" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1006.6" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "100.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "100.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-0.4" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-02T12:00:00Z", + "@to": "2024-04-02T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.6" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "5.9" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-03T00:00:00Z", + "@to": "2024-04-03T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.5" + }, + "windDirection": { + "@id": "dd", + "@deg": "26.9", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.6", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "71.5" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1003.7" + }, + "cloudiness": { + "@id": "NN", + "@percent": "63.3" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "0.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "60.9" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "32.8" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-3.4" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-02T18:00:00Z", + "@to": "2024-04-03T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.5" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.6" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-03T06:00:00Z", + "@to": "2024-04-03T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.2" + }, + "windDirection": { + "@id": "dd", + "@deg": "21.0", + "@name": "N" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.4", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "76.4" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1006.4" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "88.3" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "100.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "100.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-2.7" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-03T00:00:00Z", + "@to": "2024-04-03T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.2" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.6" + }, + "symbol": { + "@id": "PartlyCloud", + "@number": "3", + "@code": "partlycloudy_night" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-03T12:00:00Z", + "@to": "2024-04-03T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "3.4" + }, + "windDirection": { + "@id": "dd", + "@deg": "24.5", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "4.1", + "@beaufort": "3", + "@name": "Lett bris" + }, + "humidity": { + "@unit": "percent", + "@value": "60.3" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1006.2" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "100.0" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "99.6" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "91.4" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-3.8" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-03T06:00:00Z", + "@to": "2024-04-03T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "1.2" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "3.4" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-03T18:00:00Z", + "@to": "2024-04-03T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.2" + }, + "windDirection": { + "@id": "dd", + "@deg": "21.6", + "@name": "N" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.9", + "@beaufort": "2", + "@name": "Svak vind" + }, + "humidity": { + "@unit": "percent", + "@value": "58.0" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1006.7" + }, + "cloudiness": { + "@id": "NN", + "@percent": "3.9" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "1.6" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "2.3" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "0.0" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-5.5" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-03T12:00:00Z", + "@to": "2024-04-03T18:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.2" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "3.6" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-04T00:00:00Z", + "@to": "2024-04-04T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.9" + }, + "windDirection": { + "@id": "dd", + "@deg": "21.7", + "@name": "N" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.8", + "@beaufort": "2", + "@name": "Svak vind" + }, + "humidity": { + "@unit": "percent", + "@value": "76.1" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1017.3" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "56.2" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "100.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "63.3" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-4.8" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-03T18:00:00Z", + "@to": "2024-04-04T00:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.9" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "2.2" + }, + "symbol": { + "@id": "Sun", + "@number": "1", + "@code": "clearsky_night" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-04T06:00:00Z", + "@to": "2024-04-04T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.1" + }, + "windDirection": { + "@id": "dd", + "@deg": "22.5", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.7", + "@beaufort": "2", + "@name": "Svak vind" + }, + "humidity": { + "@unit": "percent", + "@value": "76.4" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1008.0" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "96.9" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "100.0" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "77.3" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-4.0" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-04T00:00:00Z", + "@to": "2024-04-04T06:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-1.1" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "0.2" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-04T12:00:00Z", + "@to": "2024-04-04T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "temperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.1" + }, + "windDirection": { + "@id": "dd", + "@deg": "28.4", + "@name": "NE" + }, + "windSpeed": { + "@id": "ff", + "@mps": "2.4", + "@beaufort": "2", + "@name": "Svak vind" + }, + "humidity": { + "@unit": "percent", + "@value": "59.6" + }, + "pressure": { + "@id": "pr", + "@unit": "hPa", + "@value": "1007.7" + }, + "cloudiness": { + "@id": "NN", + "@percent": "100.0" + }, + "lowClouds": { + "@id": "LOW", + "@percent": "85.9" + }, + "mediumClouds": { + "@id": "MEDIUM", + "@percent": "97.7" + }, + "highClouds": { + "@id": "HIGH", + "@percent": "39.8" + }, + "dewpointTemperature": { + "@id": "TD", + "@unit": "celsius", + "@value": "-3.3" + } + } + }, + { + "@datatype": "forecast", + "@from": "2024-04-04T06:00:00Z", + "@to": "2024-04-04T12:00:00Z", + "location": { + "@altitude": "90", + "@latitude": "59.93", + "@longitude": "10.72", + "precipitation": { + "@unit": "mm", + "@value": "0.0", + "@minvalue": "0.0", + "@maxvalue": "0.0" + }, + "minTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "-0.1" + }, + "maxTemperature": { + "@id": "TTT", + "@unit": "celsius", + "@value": "4.1" + }, + "symbol": { + "@id": "Cloud", + "@number": "4", + "@code": "cloudy" + } + } + } + ] + } + } +} diff --git a/tests/data/forecast.xml b/tests/data/forecast.xml new file mode 100755 index 0000000..3cd18a3 --- /dev/null +++ b/tests/data/forecast.xml @@ -0,0 +1,2231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_parse.py b/tests/test_parse.py new file mode 100644 index 0000000..882a86c --- /dev/null +++ b/tests/test_parse.py @@ -0,0 +1,109 @@ +import json +from pathlib import Path + +import pytest +from quick_xmltodict import parse as rustparse +from xmltodict import parse as pyparse + +pytestmark = pytest.mark.parametrize("parse", [pyparse, rustparse]) + + +def test_empty(parse): + xml = "" + target = {"a": None} + assert parse(xml) == target + + +def test_empty_with_attributes(parse): + xml = '' + target = {"e": {"@name": "value"}} + assert parse(xml) == target + + +def test_text(parse): + xml = "text" + target = {"a": "text"} + assert parse(xml) == target + + +def test_text_whitespace(parse): + xml = " text " + target = {"a": "text"} + assert parse(xml) == target + + +def test_text_line_breaks(parse): + xml = "\ntext\n" + target = {"a": "text"} + assert parse(xml) == target + + +def test_text_and_attributes(parse): + xml = 'text' + target = {"e": {"@name": "value", "#text": "text"}} + assert parse(xml) == target + + +def test_with_children(parse): + xml = "12" + target = {"e": {"a": "1", "b": "2"}} + assert parse(xml) == target + + +def test_identically_named_children(parse): + xml = "12" + target = {"e": {"a": ["1", "2"]}} + assert parse(xml) == target + + +def test_more_identically_named_children(parse): + xml = "123" + target = {"e": {"a": ["1", "2", "3"]}} + assert parse(xml) == target + + +def test_mixed_type_identically_named_children(parse): + xml = """ + + + + 2 + 3 + + """ + target = {"e": {"a": [None, {"@attr": "attr-1"}, "2", {"@attr": "attr-3", "#text": "3"}]}} + assert parse(xml) == target + + +def test_elements_and_text(parse): + xml = "12" + target = {"e": {"#text": "1", "a": "2"}} + assert parse(xml) == target + + +def test_namespace_prefixed(parse): + xml = """ + + text + """ + target = {"a": {"@xmlns:ns": "http://example.com", "ns:b": "text"}} + assert parse(xml) == target + + +@pytest.fixture +def data_dir(): + return Path(__file__).parent / "data" + + +@pytest.fixture +def forecast_xml(data_dir): + return (data_dir / "forecast.xml").read_text() + + +@pytest.fixture +def forecast_target(data_dir): + return json.loads((data_dir / "forecast.json").read_text()) + + +def test_forecast(parse, forecast_xml, forecast_target): + assert parse(forecast_xml) == forecast_target