pax_global_header00006660000000000000000000000064145504570470014525gustar00rootroot0000000000000052 comment=9372ace32d43b812d32e3f9d93ad5889c45dbcfa killer0071234-python-zamg-9372ace/000077500000000000000000000000001455045704700164425ustar00rootroot00000000000000killer0071234-python-zamg-9372ace/.devcontainer/000077500000000000000000000000001455045704700212015ustar00rootroot00000000000000killer0071234-python-zamg-9372ace/.devcontainer/devcontainer.json000066400000000000000000000022351455045704700245570ustar00rootroot00000000000000{ "name": "zamg Dev", "context": "..", "dockerFile": "../Dockerfile.dev", "containerEnv": { "DEVCONTAINER": "1" }, "runArgs": ["-e", "GIT_EDITOR=code --wait"], "customizations": { "vscode": { "extensions": [ "ms-python.vscode-pylance", "visualstudioexptteam.vscodeintellicode", "redhat.vscode-yaml", "esbenp.prettier-vscode", "GitHub.vscode-pull-request-github" ] }, "settings": { "python.pythonPath": "/usr/local/bin/python", "python.formatting.provider": "black", "python.testing.pytestArgs": ["--no-cov"], "editor.formatOnPaste": false, "editor.formatOnSave": true, "editor.formatOnType": true, "files.trimTrailingWhitespace": true, "terminal.integrated.profiles.linux": { "zsh": { "path": "/usr/bin/zsh" } }, "terminal.integrated.defaultProfile.linux": "zsh", "yaml.customTags": [ "!input scalar", "!secret scalar", "!include_dir_named scalar", "!include_dir_list scalar", "!include_dir_merge_list scalar", "!include_dir_merge_named scalar" ] } } } killer0071234-python-zamg-9372ace/.flake8000066400000000000000000000001321455045704700176110ustar00rootroot00000000000000[flake8] max-line-length = 88 ignore = D202,E501,W503 per-file-ignores = tests/*:DAR,S101 killer0071234-python-zamg-9372ace/.gitattributes000066400000000000000000000000511455045704700213310ustar00rootroot00000000000000* text eol=lf *.py whitespace=error killer0071234-python-zamg-9372ace/.github/000077500000000000000000000000001455045704700200025ustar00rootroot00000000000000killer0071234-python-zamg-9372ace/.github/ISSUE_TEMPLATE/000077500000000000000000000000001455045704700221655ustar00rootroot00000000000000killer0071234-python-zamg-9372ace/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000010571455045704700257150ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. killer0071234-python-zamg-9372ace/.github/ISSUE_TEMPLATE/issue.md000066400000000000000000000014241455045704700236400ustar00rootroot00000000000000--- name: Issue about: Create a report to help us improve --- ## Version of zamg ## Describe the bug A clear and concise description of what the bug is. ## Debug log ```text Add your debug logs here. ``` killer0071234-python-zamg-9372ace/.github/dependabot.yml000066400000000000000000000004461455045704700226360ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: github-actions directory: "/" schedule: interval: daily - package-ecosystem: pip directory: "/.github/workflows" schedule: interval: daily - package-ecosystem: pip directory: "/" schedule: interval: daily killer0071234-python-zamg-9372ace/.github/labels.yml000066400000000000000000000034071455045704700217730ustar00rootroot00000000000000--- # Labels names are important as they are used by Release Drafter to decide # regarding where to record them in changelog or if to skip them. # # The repository labels will be automatically configured using this file and # the GitHub Action https://github.com/marketplace/actions/github-labeler. - name: breaking description: Breaking Changes color: bfd4f2 - name: bug description: Something isn't working color: d73a4a - name: build description: Build System and Dependencies color: bfdadc - name: ci description: Continuous Integration color: 4a97d6 - name: dependencies description: Pull requests that update a dependency file color: 0366d6 - name: documentation description: Improvements or additions to documentation color: 0075ca - name: duplicate description: This issue or pull request already exists color: cfd3d7 - name: enhancement description: New feature or request color: a2eeef - name: github_actions description: Pull requests that update Github_actions code color: "000000" - name: good first issue description: Good for newcomers color: 7057ff - name: help wanted description: Extra attention is needed color: 008672 - name: invalid description: This doesn't seem right color: e4e669 - name: performance description: Performance color: "016175" - name: python description: Pull requests that update Python code color: 2b67c6 - name: question description: Further information is requested color: d876e3 - name: refactoring description: Refactoring color: ef67c4 - name: removal description: Removals and Deprecations color: 9ae7ea - name: style description: Style color: c120e5 - name: testing description: Testing color: b1fc6f - name: wontfix description: This will not be worked on color: ffffff killer0071234-python-zamg-9372ace/.github/release-drafter.yml000066400000000000000000000013301455045704700235670ustar00rootroot00000000000000categories: - title: ":boom: Breaking Changes" label: "breaking" - title: ":rocket: Features" label: "enhancement" - title: ":fire: Removals and Deprecations" label: "removal" - title: ":beetle: Fixes" label: "bug" - title: ":racehorse: Performance" label: "performance" - title: ":rotating_light: Testing" label: "testing" - title: ":construction_worker: Continuous Integration" label: "ci" - title: ":books: Documentation" label: "documentation" - title: ":hammer: Refactoring" label: "refactoring" - title: ":lipstick: Style" label: "style" - title: ":package: Dependencies" labels: - "dependencies" - "build" template: | ## Changes $CHANGES killer0071234-python-zamg-9372ace/.github/workflows/000077500000000000000000000000001455045704700220375ustar00rootroot00000000000000killer0071234-python-zamg-9372ace/.github/workflows/constraints.txt000066400000000000000000000001721455045704700251470ustar00rootroot00000000000000pip==23.3.2 pre-commit==3.6.0 black==23.12.1 flake8==7.0.0 reorder-python-imports==3.12.0 pytest==7.4.4 aresponses==2.1.6 killer0071234-python-zamg-9372ace/.github/workflows/labeler.yml000066400000000000000000000005321455045704700241700ustar00rootroot00000000000000name: Manage labels on: push: branches: - main - master jobs: labeler: name: Labeler runs-on: ubuntu-latest steps: - name: Check out the repository uses: actions/checkout@v4 - name: Run Labeler uses: crazy-max/ghaction-github-labeler@v5.0.0 with: skip-delete: true killer0071234-python-zamg-9372ace/.github/workflows/python-publish.yml000066400000000000000000000021661455045704700255540ustar00rootroot00000000000000# This workflow will upload a Python Package using Twine when a release is created # For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries # This workflow uses actions that are not certified by GitHub. # They are provided by a third-party and are governed by # separate terms of service, privacy policy, and support # documentation. name: Upload Python Package on: release: types: [published] permissions: contents: read jobs: deploy: runs-on: ubuntu-latest permissions: # IMPORTANT: this permission is mandatory for trusted publishing id-token: write steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.11" - name: Install dependencies run: | python -m pip install --upgrade pip pip install build - name: Build package run: python -m build - name: Publish package uses: pypa/gh-action-pypi-publish@2f6f737ca5f74c637829c0f5c3acd0e29ea5e8bf killer0071234-python-zamg-9372ace/.github/workflows/release-drafter.yml000066400000000000000000000005011455045704700256230ustar00rootroot00000000000000name: Draft a release note on: push: branches: - main - master jobs: draft_release: name: Release Drafter runs-on: ubuntu-latest steps: - name: Run release-drafter uses: release-drafter/release-drafter@v5.25.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} killer0071234-python-zamg-9372ace/.github/workflows/tests.yaml000066400000000000000000000106621455045704700240720ustar00rootroot00000000000000name: Linting on: push: branches: - main - master - dev pull_request: schedule: - cron: "0 0 * * *" env: DEFAULT_PYTHON: 3.11 jobs: pre-commit: runs-on: ubuntu-latest name: Pre-commit steps: - name: Check out the repository uses: actions/checkout@v4 - name: Set up Python ${{ env.DEFAULT_PYTHON }} uses: actions/setup-python@v5 with: python-version: ${{ env.DEFAULT_PYTHON }} - name: Upgrade pip run: | pip install --constraint=.github/workflows/constraints.txt pip pip --version - name: Install Python modules run: | pip install --constraint=.github/workflows/constraints.txt pre-commit black flake8 reorder-python-imports poetry pytest pytest-asyncio pytest-cov aiohttp async_timeout yarl xmltodict numpy cachetools backoff aresponses - name: Run pre-commit on all files run: | pre-commit run --all-files --show-diff-on-failure --color=always pytest: name: Python ${{ matrix.python }} runs-on: ubuntu-latest strategy: matrix: python: ["3.9", "3.10", "3.11"] steps: - name: ⤵️ Check out code from GitHub uses: actions/checkout@v4 - name: 🏗 Set up Python ${{ matrix.python }} id: python uses: actions/setup-python@v5 with: python-version: ${{ matrix.python }} - name: 🏗 Get pip cache dir id: pip-cache run: | echo "::set-output name=dir::$(pip cache dir)" - name: ⤵️ Restore cached Python PIP packages uses: actions/cache@v3 with: path: ${{ steps.pip-cache.outputs.dir }} key: pip-${{ steps.python.outputs.python-version }}-${{ hashFiles('requirements.txt') }} restore-keys: | pip-${{ steps.python.outputs.python-version }}- - name: 🏗 Install workflow dependencies run: | pip install -r requirements.txt poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: ⤵️ Restore cached Python virtual environment id: cached-poetry-dependencies uses: actions/cache@v3 with: path: .venv key: venv-${{ steps.python.outputs.python-version }}-${{ hashFiles('poetry.lock') }} restore-keys: | venv-${{ runner.os }}-${{ steps.python.outputs.python-version }}- - name: 🏗 Install dependencies run: poetry install --no-interaction - name: 🚀 Run pytest run: poetry run pytest --cov cybro tests - name: ⬆️ Upload coverage artifact uses: actions/upload-artifact@v3 with: name: coverage-${{ matrix.python }} path: .coverage coverage: runs-on: ubuntu-latest needs: pytest steps: - name: ⤵️ Check out code from GitHub uses: actions/checkout@v4 - name: ⬇️ Download coverage data uses: actions/download-artifact@v3 - name: 🏗 Set up Python 3.11 id: python uses: actions/setup-python@v5 with: python-version: 3.11 - name: 🏗 Get pip cache dir id: pip-cache run: | echo "::set-output name=dir::$(pip cache dir)" - name: ⤵️ Restore cached Python PIP packages uses: actions/cache@v3 with: path: ${{ steps.pip-cache.outputs.dir }} key: pip-${{ steps.python.outputs.python-version }}-${{ hashFiles('requirements.txt') }} restore-keys: | pip-${{ steps.python.outputs.python-version }}- - name: 🏗 Install workflow dependencies run: | pip install -r requirements.txt poetry config virtualenvs.create true poetry config virtualenvs.in-project true - name: ⤵️ Restore cached Python virtual environment id: cached-poetry-dependencies uses: actions/cache@v3 with: path: .venv key: >- venv-${{ steps.python.outputs.python-version }}-${{ hashFiles('poetry.lock') }} venv-${{ steps.python.outputs.python-version }}- - name: 🏗 Install dependencies run: poetry install --no-interaction - name: 🚀 Process coverage results run: | poetry run coverage combine coverage*/.coverage* poetry run coverage xml -i - name: 🚀 Upload coverage report uses: codecov/codecov-action@v3 killer0071234-python-zamg-9372ace/.gitignore000066400000000000000000000034071455045704700204360ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # PEP 582; used by e.g. github.com/David-OConnor/pyflow __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ killer0071234-python-zamg-9372ace/.pre-commit-config.yaml000066400000000000000000000050371455045704700227300ustar00rootroot00000000000000repos: - repo: https://github.com/asottile/pyupgrade rev: v2.38.0 hooks: - id: pyupgrade args: [--py39-plus] - repo: https://github.com/codespell-project/codespell rev: v2.2.1 hooks: - id: codespell args: - --ignore-words-list=hass,alot,datas,dof,dur,ether,farenheit,hist,iff,iif,ines,ist,lightsensor,mut,nd,pres,referer,rime,ser,serie,te,technik,ue,uint,visability,wan,wanna,withing,iam,incomfort,ba,haa,pullrequests - --skip="./.*,*.csv,*.json" - --quiet-level=2 exclude_types: [csv, json] exclude: ^tests/fixtures/ - repo: https://github.com/PyCQA/bandit rev: 1.7.4 hooks: - id: bandit args: - --quiet - --format=custom - --configfile=tests/bandit.yaml files: ^(src|examples|tests)/.+\.py$ - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.3.0 hooks: - id: check-executables-have-shebangs stages: [manual] - id: check-json exclude: (.vscode|.devcontainer) - id: no-commit-to-branch args: - --branch=dev - --branch=master - --branch=rc - id: check-added-large-files - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/pre-commit/mirrors-prettier rev: v3.0.0-alpha.0 hooks: - id: prettier - repo: https://github.com/cdce8p/python-typing-update rev: v0.4.2 hooks: # Run `python-typing-update` hook manually from time to time # to update python typing syntax. # Will require manual work, before submitting changes! - id: python-typing-update stages: [manual] args: - --py39-plus - --force - --keep-updates files: ^(src|examples|tests)/.+\.py$ - repo: local hooks: - id: black name: black entry: black language: system types: [python] require_serial: true - id: flake8 name: flake8 entry: flake8 language: system types: [python] require_serial: true - id: reorder-python-imports name: Reorder python imports entry: reorder-python-imports language: system types: [python] args: [--application-directories=src] - id: pytest name: 🧪 Running tests and test coverage with pytest language: system types: [python] entry: poetry run pytest pass_filenames: false always_run: true killer0071234-python-zamg-9372ace/.prettierignore000066400000000000000000000026551455045704700215150ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # OSX useful to ignore *.DS_Store .AppleDouble .LSOverride # Thumbnails ._* # Files that might appear in the root of a volume .DocumentRevisions-V100 .fseventsd .Spotlight-V100 .TemporaryItems .Trashes .VolumeIcon.icns .com.apple.timemachine.donotpresent # Directories potentially created on remote AFP share .AppleDB .AppleDesktop Network Trash Folder Temporary Items .apdisk # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *,cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log # Sphinx documentation docs/_build/ # pyenv .python-version # virtualenv .venv venv/ ENV/ # mypy .mypy_cache/ # Visual Studio Code .vscode # IntelliJ Idea family of suites .idea *.iml ## File-based project format: *.ipr *.iws ## mpeltonen/sbt-idea plugin .idea_modules/ # PyBuilder target/ # Cookiecutter output/ python_boilerplate/ # Node node_modules/ # Deepcode AI .dccache killer0071234-python-zamg-9372ace/.vscode/000077500000000000000000000000001455045704700200035ustar00rootroot00000000000000killer0071234-python-zamg-9372ace/.vscode/launch.json000066400000000000000000000011431455045704700221470ustar00rootroot00000000000000{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name":"Python: Current File", "type":"python", "request":"launch", "module":"${file}", "console":"integratedTerminal" }, { "name": "Python: Run (control.py)", "type": "python", "request": "launch", "module": "control", "justMyCode": false, "args": ["--debug", "-c", "config"] }, ] } killer0071234-python-zamg-9372ace/.yamllint000066400000000000000000000023561455045704700203020ustar00rootroot00000000000000--- rules: braces: level: error min-spaces-inside: 0 max-spaces-inside: 1 min-spaces-inside-empty: -1 max-spaces-inside-empty: -1 brackets: level: error min-spaces-inside: 0 max-spaces-inside: 0 min-spaces-inside-empty: -1 max-spaces-inside-empty: -1 colons: level: error max-spaces-before: 0 max-spaces-after: 1 commas: level: error max-spaces-before: 0 min-spaces-after: 1 max-spaces-after: 1 comments: level: error require-starting-space: true min-spaces-from-content: 2 comments-indentation: level: error document-end: level: error present: false document-start: level: error present: true empty-lines: level: error max: 1 max-start: 0 max-end: 1 hyphens: level: error max-spaces-after: 1 indentation: level: error spaces: 2 indent-sequences: true check-multi-line-strings: false key-duplicates: level: error line-length: level: warning max: 120 allow-non-breakable-words: true allow-non-breakable-inline-mappings: true new-line-at-end-of-file: level: error new-lines: level: error type: unix trailing-spaces: level: error truthy: level: error killer0071234-python-zamg-9372ace/CONTRIBUTING.md000066400000000000000000000047321455045704700207010ustar00rootroot00000000000000# Contribution guidelines Contributing to this project should be as easy and transparent as possible, whether it's: - Reporting a bug - Discussing the current state of the code - Submitting a fix - Proposing new features ## Github is used for everything Github is used to host code, to track issues and feature requests, as well as accept pull requests. Pull requests are the best way to propose changes to the codebase. 1. Fork the repo and create your branch from `master`. 2. If you've changed something, update the documentation. 3. Make sure your code lints (using black). 4. Test you contribution. 5. Issue that pull request! ## Any contributions you make will be under the MIT Software License In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/) that covers the project. Feel free to contact the maintainers if that's a concern. ## Report bugs using Github's [issues](../../issues) GitHub issues are used to track public bugs. Report a bug by [opening a new issue](../../issues/new/choose); it's that easy! ## Write bug reports with detail, background, and sample code **Great Bug Reports** tend to have: - A quick summary and/or background - Steps to reproduce - Be specific! - Give sample code if you can. - What you expected would happen - What actually happens - Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) People _love_ thorough bug reports. I'm not even kidding. ## Use a Consistent Coding Style Use [black](https://github.com/ambv/black) and [prettier](https://prettier.io/) to make sure the code follows the style. Or use the `pre-commit` settings implemented in this repository (see deicated section below). ## Test your code modification You can use the `pre-commit` settings implemented in this repository to have linting tool checking your contributions (see dedicated section below). ## Pre-commit You can use the [pre-commit](https://pre-commit.com/) settings included in the repository to have code style and linting checks. With `pre-commit` tool already installed, activate the settings of the repository: ```console $ pre-commit install ``` Now the pre-commit tests will be done every time you commit. You can run the tests on all repository file with the command: ```console $ pre-commit run --all-files ``` ## License By contributing, you agree that your contributions will be licensed under its MIT License. killer0071234-python-zamg-9372ace/Dockerfile.dev000066400000000000000000000014411455045704700212110ustar00rootroot00000000000000FROM mcr.microsoft.com/vscode/devcontainers/python:3.11 SHELL ["/bin/bash", "-o", "pipefail", "-c"] RUN \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ # Additional library needed by some tests and accordingly by VScode Tests Discovery git \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* WORKDIR /usr/src WORKDIR /workspaces # Install Python dependencies from requirements COPY requirements.txt ./ COPY .github/workflows/constraints.txt ./ RUN pip3 install -r requirements.txt RUN pip3 install -r constraints.txt RUN rm -rf requirements.txt RUN rm -rf constraints.txt # Set the default shell to bash instead of sh ENV SHELL /bin/bash killer0071234-python-zamg-9372ace/LICENSE000066400000000000000000000020551455045704700174510ustar00rootroot00000000000000MIT License Copyright (c) 2022 Daniel Gangl 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 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. killer0071234-python-zamg-9372ace/README.md000066400000000000000000000101721455045704700177220ustar00rootroot00000000000000# python-zamg [![GitHub Release][releases-shield]][releases] [![GitHub Activity][commits-shield]][commits] [![License][license-shield]](LICENSE) [![pre-commit][pre-commit-shield]][pre-commit] [![Black][black-shield]][black] [![Code Coverage][codecov-shield]][codecov] [![Project Maintenance][maintenance-shield]][user_profile] Python library to read 10 min weather data from GeoSphere Austria former ZAMG ## About This package allows you to read the weather data from weather stations of GeoSphere Austria weather service. GeoSphere Austria joins Zentralanstalt für Meteorologie und Geodynamik (ZAMG) and the Geologische Bundesanstalt (GBA) since 1st January 2023. ## Installation ```bash pip install zamg ``` ## Usage Simple usage example to fetch specific data from the closest station. ```python """Asynchronous Python client for GeoSphere Austria weather data.""" import asyncio import src.zamg.zamg from src.zamg.exceptions import ZamgError async def main(): """Sample of getting data""" try: async with src.zamg.zamg.ZamgData() as zamg: # option to disable verify of ssl check zamg.verify_ssl = False # trying to read zamg station id of the closest station data = await zamg.closest_station(46.99, 15.499) # set closest station as default one to read zamg.set_default_station(data) print("closest_station = " + str(zamg.get_station_name) + " / " + str(data)) # print list with all possible parameters print(f"Possible station parameters: {zamg.get_all_parameters()}") # set parameters directly zamg.station_parameters = "TL,SO" # or set parameters as list zamg.set_parameters(("TL", "SO")) # if none of the above parameters are set, all possible parameters are read # do an update await zamg.update() print(f"---------- Weather for station {zamg.get_station_name} ({data})") for param in zamg.get_parameters(): print( str(param) + " -> " + str(zamg.get_data(parameter=param, data_type="name")) + " -> " + str(zamg.get_data(parameter=param)) + " " + str(zamg.get_data(parameter=param, data_type="unit")) ) print("last update: %s", zamg.last_update) except (ZamgError) as exc: print(exc) if __name__ == "__main__": asyncio.run(main()) ``` ## Contributions are welcome! If you want to contribute to this please read the [Contribution guidelines](https://github.com/killer0071234/python-zamg/blob/master/CONTRIBUTING.md) ## Credits Code template to read dataset API was mainly taken from [@LuisTheOne](https://github.com/LuisThe0ne)'s [zamg-api-cli-client][zamg_api_cli_client] [Dataset API Dokumentation][dataset_api_doc] --- [black]: https://github.com/psf/black [black-shield]: https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge [commits-shield]: https://img.shields.io/github/commit-activity/y/killer0071234/python-zamg.svg?style=for-the-badge [commits]: https://github.com/killer0071234/python-zamg/commits/main [codecov-shield]: https://img.shields.io/codecov/c/gh/killer0071234/python-zamg?style=for-the-badge&token=O5YDLF0X9G [codecov]: https://codecov.io/gh/killer0071234/python-zamg [license-shield]: https://img.shields.io/github/license/killer0071234/python-zamg.svg?style=for-the-badge [maintenance-shield]: https://img.shields.io/badge/maintainer-@killer0071234-blue.svg?style=for-the-badge [pre-commit]: https://github.com/pre-commit/pre-commit [pre-commit-shield]: https://img.shields.io/badge/pre--commit-enabled-brightgreen?style=for-the-badge [releases-shield]: https://img.shields.io/github/release/killer0071234/python-zamg.svg?style=for-the-badge [releases]: https://github.com/killer0071234/python-zamg/releases [user_profile]: https://github.com/killer0071234 [zamg_api_cli_client]: https://github.com/LuisThe0ne/zamg-api-cli-client [dataset_api_doc]: https://github.com/Geosphere-Austria/dataset-api-docs killer0071234-python-zamg-9372ace/control.py000066400000000000000000000034251455045704700205000ustar00rootroot00000000000000# pylint: disable=W0621 """Asynchronous Python client for GeoSphere Austria weather data.""" import asyncio import src.zamg.zamg from src.zamg.exceptions import ZamgError async def main(): """Sample of getting data""" try: async with src.zamg.zamg.ZamgData() as zamg: # option to disable verify of ssl check zamg.verify_ssl = False # trying to read GeoSphere Austria station id of the closest station data = await zamg.closest_station(46.99, 15.499) # set closest station as default one to read zamg.set_default_station(data) print("closest_station = " + str(zamg.get_station_name) + " / " + str(data)) # print list with all possible parameters print(f"Possible station parameters: {zamg.get_all_parameters()}") # set parameters directly zamg.station_parameters = "TL,SO" # or set parameters as list zamg.set_parameters(("TL", "SO")) # if none of the above parameters are set, all possible parameters are read # do an update await zamg.update() print(f"---------- Weather for station {zamg.get_station_name} ({data})") for param in zamg.get_parameters(): print( str(param) + " -> " + str(zamg.get_data(parameter=param, data_type="name")) + " -> " + str(zamg.get_data(parameter=param)) + " " + str(zamg.get_data(parameter=param, data_type="unit")) ) print("last update: %s", zamg.last_update) except ZamgError as exc: print(exc) if __name__ == "__main__": asyncio.run(main()) killer0071234-python-zamg-9372ace/examples/000077500000000000000000000000001455045704700202605ustar00rootroot00000000000000killer0071234-python-zamg-9372ace/examples/read_data.py000066400000000000000000000035411455045704700225410ustar00rootroot00000000000000# pylint: disable=W0621 """Asynchronous Python client for GeoSphere Austria weather data.""" import asyncio from os import curdir from zamg import ZamgData async def main(): """Sample of getting data.""" async with ZamgData() as zamg: data = await zamg.closest_station(46.99, 15.499, curdir) print(f"closest_station = {data} -> {zamg.get_data('Name', data)}") print("---------- Weather for all stations") stations = await zamg.zamg_stations(curdir) for station in stations: print(f"{station} -> {stations[station][2]}") print(f" -> T: {zamg.get_data('T °C', station)} °C") print(f" -> RF: {zamg.get_data('RF %', station)} %") print(f" -> LDstat: {zamg.get_data('LDstat hPa', station)} hPa") print(f" -> LDred: {zamg.get_data('LDred hPa', station)} hPa") print(f" -> WG: {zamg.get_data('WG km/h', station)} km/h") print(f" -> WSG: {zamg.get_data('WSG km/h', station)} km/h") print(f" -> SO: {zamg.get_data('SO %', station)} %") print(f" -> TP: {zamg.get_data('TP °C', station)} °C") print( f"---------- Weather for a specific station ({zamg.get_data('Name', data)})" ) zamg.set_default_station(data) print(f"T °C = {zamg.get_data('T °C')} °C") print(f"RF % = {zamg.get_data('RF %')} %") print(f"LDstat hPa = {zamg.get_data('LDstat hPa')} hPa") print(f"LDred hPa = {zamg.get_data('LDred hPa')} hPa") print(f"WG km/h = {zamg.get_data('WG km/h')} km/h") print(f"WSG km/h = {zamg.get_data('WSG km/h')} km/h") print(f"SO % = {zamg.get_data('SO %')} %") print(f"TP °C = {zamg.get_data('TP °C')} °C") if __name__ == "__main__": asyncio.run(main()) killer0071234-python-zamg-9372ace/package.json000066400000000000000000000006571455045704700207400ustar00rootroot00000000000000{ "name": "zamg", "version": "0.3.5", "private": true, "description": "Asynchronous Python client for GeoSphere Austria (ZAMG) weather data.", "scripts": { "pyright": "pyright", "prettier": "prettier --write **/*.{json,js,md,yml,yaml} *.{json,js,md,yml,yaml}" }, "author": "Daniel Gangl ", "license": "MIT", "devDependencies": { "prettier": "^2.6.2", "pyright": "^1.1.247" } } killer0071234-python-zamg-9372ace/pyproject.toml000066400000000000000000000101351455045704700213560ustar00rootroot00000000000000[tool.poetry] name = "zamg" version = "0.3.5" description = "Asynchronous Python client for GeoSphere Austria (ZAMG) weather data." authors = ["Daniel Gangl "] maintainers = ["Daniel Gangl "] license = "MIT" readme = "README.md" homepage = "https://github.com/killer0071234/python-zamg" repository = "https://github.com/killer0071234/python-zamg" documentation = "https://github.com/killer0071234/python-zamg" keywords = ["geosphere", "zamg", "api", "async", "client"] classifiers = [ "Development Status :: 4 - Beta", "Framework :: AsyncIO", "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3", "Topic :: Software Development :: Libraries :: Python Modules", ] packages = [ { include = "zamg", from = "src" }, ] [tool.poetry.dependencies] python = "^3.8" aiohttp = ">=3.8.0" async-timeout = "4.0.3" [tool.poetry.dev-dependencies] aresponses = "^2.1.5" black = "^23.12" blacken-docs = "^1.12.1" coverage = {version = "^7.2", extras = ["toml"]} flake8 = "^4.0.1" flake8-docstrings = "^1.5.0" isort = "^5.10.1" mypy = "^1.3" pre-commit = "^2.19.0" pre-commit-hooks = "^4.2.0" pylint = "^3.0.2" pytest = "^7.1.2" pytest-asyncio = "^0.21.1" pytest-cov = "^4.1.0" yamllint = "^1.26.3" pyupgrade = "^3.0.0" flake8-simplify = "^0.21.0" vulture = "^2.3" flake8-bandit = "^3.0.0" flake8-bugbear = "^23.2.13" flake8-builtins = "^2.0.0" flake8-comprehensions = "^3.9.0" flake8-eradicate = "^1.2.1" flake8-markdown = "^0.3.0" darglint = "^1.8.1" safety = "^2.1.1" codespell = "^2.1.0" bandit = "^1.7.4" types-cachetools = "^5.2.1" [tool.poetry.urls] "Bug Tracker" = "https://github.com/killer0071234/python-zamg/issues" Changelog = "https://github.com/killer0071234/python-zamg/releases" [tool.black] target-version = ['py311'] [tool.coverage.paths] source = ["src"] [tool.coverage.report] show_missing = true exclude_lines = ["pragma: no cover", "if TYPE_CHECKING:"] [tool.coverage.run] branch = true source = ["zamg"] [tool.isort] profile = "black" multi_line_output = 3 [tool.mypy] # Specify the target platform details in config, so your developers are # free to run mypy on Windows, Linux, or macOS and get consistent # results. platform = "linux" python_version = 3.11 # flake8-mypy expects the two following for sensible formatting show_column_numbers = true # show error messages from unrelated files follow_imports = "normal" # suppress errors about unsatisfied imports ignore_missing_imports = true # be strict check_untyped_defs = true disallow_any_generics = true disallow_incomplete_defs = true disallow_subclassing_any = true disallow_untyped_calls = true disallow_untyped_defs = true disallow_untyped_decorators = false # thanks backoff :( no_implicit_optional = true no_implicit_reexport = true strict_optional = true warn_incomplete_stub = true warn_no_return = true warn_redundant_casts = true warn_return_any = true warn_unused_configs = true warn_unused_ignores = true # No incremental mode cache_dir = "/dev/null" [tool.pylint.MASTER] load-plugins = [ "pylint.extensions.bad_builtin", "pylint.extensions.code_style", "pylint.extensions.docparams", "pylint.extensions.docstyle", "pylint.extensions.empty_comment", "pylint.extensions.overlapping_exceptions", "pylint.extensions.typing", ] ignore= [ "tests" ] [tool.pylint.BASIC] good-names = [ "_", "ex", "fp", "i", "id", "j", "k", "on", "Run", "T", "wv", ] [tool.pylint."MESSAGES CONTROL"] disable= [ "too-few-public-methods", "duplicate-code", "format", "unsubscriptable-object", ] [tool.pylint.SIMILARITIES] ignore-imports = true [tool.pylint.FORMAT] max-line-length=88 [tool.pylint.DESIGN] max-attributes=20 [tool.pytest.ini_options] addopts = " --cov=src/. --cov-report=term-missing" [tool.vulture] min_confidence = 80 paths = ["src", "tests"] verbose = true [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" killer0071234-python-zamg-9372ace/requirements.txt000066400000000000000000000002371455045704700217300ustar00rootroot00000000000000aiohttp async-timeout # for debug poetry pre-commit pylint black vulture tox tox-pip-version colorlog reorder-python-imports==3.9.0 prettier aresponses==2.1.6 killer0071234-python-zamg-9372ace/requirements_test.txt000066400000000000000000000021051455045704700227630ustar00rootroot00000000000000# linters such as flake8 and pylint should be pinned, as new releases # make new things fail. Manually update these pins when pulling in a # new version # types-* that have versions roughly corresponding to the packages they # contain hints for available should be kept in sync with them -r requirements.txt codecov==2.1.13 coverage==6.4.4 freezegun==1.4.0 mock-open==1.4.0 mypy==1.8.0 pipdeptree==2.13.2 pylint-strict-informational==0.1 pytest-aiohttp==1.0.4 aresponses==2.1.6 pytest-asyncio pytest-cov==4.1.0 pytest-freezegun==0.4.2 pytest-socket==0.6.0 pytest-test-groups==1.0.3 pytest-sugar==0.9.7 pytest-timeout==2.1.0 pytest-xdist==3.5.0 pytest==7.4.3 requests_mock==1.11.0 respx==0.20.2 stdlib-list==0.10.0 tqdm==4.66.1 types-atomicwrites==1.4.5.1 types-croniter==2.0.0.0 types-backports==0.1.3 types-certifi==2021.10.8.3 types-chardet==5.0.4.6 types-decorator==5.1.8.4 types-enum34==1.1.8 types-ipaddress==1.0.8 types-pkg-resources==0.1.3 types-python-slugify==8.0.0.3 types-pytz==2023.3.1.1 types-PyYAML==6.0.12.11 types-requests==2.31.0.2 types-toml==0.10.8.7 types-ujson==5.8.0.1 killer0071234-python-zamg-9372ace/src/000077500000000000000000000000001455045704700172315ustar00rootroot00000000000000killer0071234-python-zamg-9372ace/src/zamg/000077500000000000000000000000001455045704700201675ustar00rootroot00000000000000killer0071234-python-zamg-9372ace/src/zamg/__init__.py000066400000000000000000000007431455045704700223040ustar00rootroot00000000000000"""Asynchronous Python client for GeoSphere Austria weather data.""" __version__ = "0.3.5" from .exceptions import ZamgApiError from .exceptions import ZamgError from .exceptions import ZamgNoDataError from .exceptions import ZamgStationNotFoundError from .exceptions import ZamgStationUnknownError from .zamg import ZamgData __all__ = [ "ZamgApiError", "ZamgError", "ZamgNoDataError", "ZamgStationNotFoundError", "ZamgStationUnknownError", "ZamgData", ] killer0071234-python-zamg-9372ace/src/zamg/exceptions.py000066400000000000000000000007361455045704700227300ustar00rootroot00000000000000"""Exceptions for GeoSphere Austria.""" class ZamgError(Exception): """Generic GeoSphere Austria exception.""" class ZamgStationNotFoundError(ZamgError): """GeoSphere Austria weather station not found.""" class ZamgStationUnknownError(ZamgError): """GeoSphere Austria weather station is not known.""" class ZamgNoDataError(ZamgError): """GeoSphere Austria no data exception.""" class ZamgApiError(ZamgError): """GeoSphere Austria api exception.""" killer0071234-python-zamg-9372ace/src/zamg/zamg.py000066400000000000000000000234761455045704700215130ustar00rootroot00000000000000"""GeoSphere Austria Weather Data Client.""" from __future__ import annotations import json import zoneinfo from datetime import datetime from datetime import timedelta from sys import version_info import aiohttp import async_timeout from aiohttp.client_exceptions import ClientConnectorError from aiohttp.client_exceptions import ServerDisconnectedError from aiohttp.client_exceptions import ServerTimeoutError from aiohttp.hdrs import USER_AGENT from . import __version__ from .exceptions import ZamgApiError from .exceptions import ZamgNoDataError from .exceptions import ZamgStationNotFoundError from .exceptions import ZamgStationUnknownError CLIENT_AGENT = f"Python/{version_info[0]}.{version_info[1]} +https://github.com/killer0071234/python-zamg python-zamg/{__version__}" class ZamgData: """The class for handling the data retrieval.""" dataset_metadata_url: str = "https://dataset.api.hub.geosphere.at/v1/station/current/tawes-v1-10min/metadata" """API url to fetch possible stations and parameters.""" dataset_data_url: str = "https://dataset.api.hub.geosphere.at/v1/station/current/tawes-v1-10min?parameters=" """API url to fetch current conditions of a weather station.""" request_timeout: float = 8.0 headers = { USER_AGENT: CLIENT_AGENT, } session: aiohttp.client.ClientSession | None = None _close_session: bool = False verify_ssl: bool | None = None """Set to False to ignore SSL errors.""" station_parameters: str | None = None """Comma separated list of station parameter to get from GeoSphere Austria.""" _timestamp: str | None = None _station_id: str = "" _all_station_parameters: str | None = None """Comma separated list of all possible station parameters.""" _stations: tuple | None = None def __init__( self, default_station_id: str = "", session: aiohttp.client.ClientSession | None = None, ): """Initialize the api client.""" self.data = {} self._station_id = default_station_id self.session = session async def zamg_stations(self) -> dict[str:(float, float, str)]: """Return {station_id: (lat, lon, name)} for all public data stations. In addition we also get all possible readable parameters for a station.""" def _to_float(val: str) -> str | float: try: return float(val.replace(",", ".")) except ValueError: return val if self._stations is not None: return self._stations try: if self.session is None: self.session = aiohttp.client.ClientSession() self._close_session = True async with async_timeout.timeout(self.request_timeout): response = await self.session.get( url=self.dataset_metadata_url, allow_redirects=True, headers=self.headers, verify_ssl=self.verify_ssl, ) if response.status in (200, 301): contents = await response.read() response.close() # extract all possible parameters parameter_list = json.loads(contents)["parameters"] station_parameters = "" for parameter in parameter_list: station_parameters += parameter["name"] + "," station_parameters = station_parameters.rstrip(station_parameters[-1]) self._all_station_parameters = station_parameters # also set default station parameter to read if self.station_parameters is None: self.station_parameters = station_parameters # extract all stations out of parameters station_list = json.loads(contents)["stations"] stations = {} for station in station_list: stations[station["id"]] = tuple( _to_float(str(station[coord])) for coord in ("lat", "lon", "name") ) self._stations = stations return stations except ( ClientConnectorError, ServerTimeoutError, ServerDisconnectedError, ) as exc: raise ZamgApiError(exc) from exc except ValueError as exc: raise ZamgNoDataError(exc) from exc async def closest_station(self, lat: float, lon: float) -> str: """Return the station_id of the closest station to our lat/lon.""" try: stations = await self.zamg_stations() def _comparable_dist(zamg_id): """Calculate the pseudo-distance from lat/lon.""" station_lat, station_lon, _ = stations[zamg_id] return (lat - station_lat) ** 2 + (lon - station_lon) ** 2 self._station_id = min(stations, key=_comparable_dist) return self._station_id except (KeyError, TypeError, ValueError) as exc: raise ZamgStationNotFoundError(exc) from exc def get_data(self, parameter: str, data_type: str = "data") -> str | None: """Get a specific data entry. To get possible parameters use get_all_parameters() Possible data_types: - data: default, data value of parameter - name: name of parameter - unit: data value unit of parameter""" try: return self.data[self._station_id][parameter][data_type] except KeyError as exc: raise ZamgNoDataError(exc) from exc def get_all_parameters(self) -> list[str]: """Get a list of all possible Parameters which can be read from GeoSphere Austria.""" if self._all_station_parameters is None: return {} return self._all_station_parameters.split(",") def get_parameters(self) -> list[str]: """Get a list of parameters which are read from GeoSphere Austria. The returned list are possible data_type parameter for function get_data()""" if self.station_parameters is None: return {} return self.station_parameters.split(",") def set_parameters(self, param: list[str]) -> None: """Set the list of parameters to read with uodate() function from GeoSphere Austria.""" station_parameters = "" for parameter in param: station_parameters += parameter + "," self.station_parameters = station_parameters.rstrip(station_parameters[-1]) @property def get_station_name(self) -> str: """Return the current Station name.""" try: _, _, name = self._stations[self._station_id] return name except (KeyError, TypeError) as exc: raise ZamgStationUnknownError(exc) from exc def set_default_station(self, station_id: str): """Set the default station_id for update().""" self._station_id = station_id @property def last_update(self) -> datetime | None: """Return the timestamp of the most recent data.""" if self._timestamp is not None: return datetime.strptime(self._timestamp, "%Y-%m-%dT%H:%M%z") return None async def update(self) -> dict | None: """Return a list of all current observations of the default station id.""" if self._station_id == "": return None if self.last_update and ( self.last_update + timedelta(minutes=5) > datetime.utcnow().replace(tzinfo=zoneinfo.ZoneInfo("UTC")) ): return ( self.data ) # Not time to update yet; we are just reading every 5 minutes try: # initialize station parameters if self.station_parameters is None: await self.zamg_stations() if self.session is None: self.session = aiohttp.client.ClientSession() self._close_session = True async with async_timeout.timeout(self.request_timeout): response = await self.session.get( url=self.dataset_data_url + self.station_parameters + "&station_ids=" + str(self._station_id), allow_redirects=True, headers=self.headers, verify_ssl=self.verify_ssl, ) if response.status in (200, 301): contents = await response.read() response.close() observations = json.loads(contents)["features"][0]["properties"][ "parameters" ] self._timestamp = json.loads(contents)["timestamps"][0] self.data[self._station_id] = dict(observations) for observation in observations: # hack to put data into one single slot, maybe there are easier solutions, but hey it works ;-) self.data[self._station_id][observation]["data"] = self.data[ self._station_id ][observation]["data"][0] return self.data raise ZamgApiError(f"Got status {response.status} from GeoSphere Austria") except (ClientConnectorError, ServerTimeoutError, ZamgApiError) as exc: raise ZamgApiError(exc) from exc except (TypeError, ValueError, KeyError) as exc: raise ZamgNoDataError(exc) from exc async def __aenter__(self) -> ZamgData: """Async enter. Returns: The GeoSphere Austria object. """ return self async def __aexit__(self, *_exc_info) -> None: """Async exit. Args: _exc_info: Exec type. """ if self.session is not None and self._close_session: await self.session.close() self.session = None killer0071234-python-zamg-9372ace/tests/000077500000000000000000000000001455045704700176045ustar00rootroot00000000000000killer0071234-python-zamg-9372ace/tests/__init__.py000066400000000000000000000002241455045704700217130ustar00rootroot00000000000000"""Asynchronous GeoSphere Austria client.""" import sys sys.path.append(".") sys.path.append("../src/zamg") sys.path.append("/workspace/src/zamg") killer0071234-python-zamg-9372ace/tests/bandit.yaml000066400000000000000000000003441455045704700217320ustar00rootroot00000000000000--- # https://bandit.readthedocs.io/en/latest/config.html tests: - B103 - B108 - B306 - B307 - B313 - B314 - B315 - B316 - B317 - B318 - B319 - B320 - B325 - B601 - B602 - B604 - B608 - B609 killer0071234-python-zamg-9372ace/tests/data_metadata.json000066400000000000000000003112301455045704700232500ustar00rootroot00000000000000{ "title": "TAWES", "parameters": [ { "name": "DD", "long_name": "Windrichtung", "desc": "Windrichtung der letzten 10 Minuten", "unit": "°" }, { "name": "DDX", "long_name": "Windrichtung der Windspitze", "desc": "Windrichtung der Windspitze der letzetn 10 Minuten", "unit": "°" }, { "name": "FFAM", "long_name": "Arithmetisches Mittel der Windgeschwindigkeit", "desc": "Arithmetisches Mittel der Windgeschwindigkeit über 10 Minuten", "unit": "m/s" }, { "name": "FFX", "long_name": "Windspitze", "desc": "Windspitze der letzten 10 Minuten", "unit": "m/s" }, { "name": "FFN_2", "long_name": "Anzahl der 2 Sekunden-Messwerte des Windes", "desc": "Anzahl der 2 Sekunden-Messwerte des Windes in 10 Minuten", "unit": "" }, { "name": "GLOW", "long_name": "Globalstrahlung [W/m²]", "desc": "Globalstrahlung der letzten 10 Minuten", "unit": "W/m²" }, { "name": "P", "long_name": "Luftdruck", "desc": "Luftdruck 10 Minuten", "unit": "hPa" }, { "name": "PGPM", "long_name": "Geopotential", "desc": "Geopotentielle Meter 10 Minuten (gültiger Wert bei pred < 950 hPa)", "unit": "gpm" }, { "name": "PMAX", "long_name": "Luftdruck Maximalwert", "desc": "Luftdruck Maximalwert über 10 Minuten", "unit": "hPa" }, { "name": "PMIN", "long_name": "Luftdruck Minimalwert", "desc": "Luftdruck Minimalwert über 10 Minuten", "unit": "hPa" }, { "name": "PRED", "long_name": "Reduzierter Luftdruck", "desc": "Reduzierter Luftdruck 10 Minuten", "unit": "hPa" }, { "name": "RFAM", "long_name": "Relative Feuchte arithmetisches Mittel", "desc": "Relative Feuchte arithmetisches Mittel über 10 Minuten", "unit": "%" }, { "name": "RFMAX", "long_name": "Relative Feuchte Maximum", "desc": "Relative Feuchte Maximalwert über 10 Minuten", "unit": "%" }, { "name": "RFMIN", "long_name": "Relative Feuchte Minimum", "desc": "Relative Feuchte Minimalwert über 10 Minuten", "unit": "%" }, { "name": "RR", "long_name": "Niederschlag der letzten 10 Minuten", "desc": "Niederschlag der letzten 10 Minuten", "unit": "mm" }, { "name": "RR1", "long_name": "Niederschlag der 1.Minute", "desc": "Niederschlag der 1.Minute (stdmin -9 min)", "unit": "mm" }, { "name": "RR10", "long_name": "Niederschlag der 10.Minute", "desc": "Niederschlag der 10.Minute (stdmin -0 min)", "unit": "mm" }, { "name": "RR2", "long_name": "Niederschlag der 2.Minute", "desc": "Niederschlag der 2.Minute (stdmin -8 min)", "unit": "mm" }, { "name": "RR3", "long_name": "Niederschlag der 3.Minute", "desc": "Niederschlag der 3.Minute (stdmin -7 min)", "unit": "mm" }, { "name": "RR4", "long_name": "Niederschlag der 4.Minute", "desc": "Niederschlag der 4.Minute (stdmin -6 min)", "unit": "mm" }, { "name": "RR5", "long_name": "Niederschlag der 5.Minute", "desc": "Niederschlag der 5.Minute (stdmin -5 min)", "unit": "mm" }, { "name": "RR6", "long_name": "Niederschlag der 6.Minute", "desc": "Niederschlag der 6.Minute (stdmin -4 min)", "unit": "mm" }, { "name": "RR7", "long_name": "Niederschlag der 7.Minute", "desc": "Niederschlag der 7.Minute (stdmin -3 min)", "unit": "mm" }, { "name": "RR8", "long_name": "Niederschlag der 8.Minute", "desc": "Niederschlag der 8.Minute (stdmin -2 min)", "unit": "mm" }, { "name": "RR9", "long_name": "Niederschlag der 9.Minute", "desc": "Niederschlag der 9.Minute (stdmin -1 min)", "unit": "mm" }, { "name": "RRM", "long_name": "Niederschlagsmelder der letzten 10 Minuten", "desc": "Niederschlagsmelder der letzten 10 Minuten, Summe", "unit": "min" }, { "name": "RRM1", "long_name": "Niederschlagsmelder der 1.Minute", "desc": "Niederschlagsmelder der 1.Minute (stdmin -9 min)", "unit": "min" }, { "name": "RRM10", "long_name": "Niederschlagsmelder der 10.Minute", "desc": "Niederschlagsmelder der 10.Minute (stdmin -0 min)", "unit": "min" }, { "name": "RRM2", "long_name": "Niederschlagsmelder der 2.Minute", "desc": "Niederschlagsmelder der 2.Minute (stdmin -8 min)", "unit": "min" }, { "name": "RRM3", "long_name": "Niederschlagsmelder der 3.Minute", "desc": "Niederschlagsmelder der 3.Minute (stdmin -7 min)", "unit": "min" }, { "name": "RRM4", "long_name": "Niederschlagsmelde rder 4.Minute", "desc": "Niederschlagsmelde rder 4.Minute (stdmin -6 min)", "unit": "min" }, { "name": "RRM5", "long_name": "Niederschlagsmelder der 5.Minute", "desc": "Niederschlagsmelder der 5.Minute (stdmin -5 min)", "unit": "min" }, { "name": "RRM6", "long_name": "Niederschlagsmelder der 6.Minute", "desc": "Niederschlagsmelder der 6.Minute (stdmin -4 min)", "unit": "min" }, { "name": "RRM7", "long_name": "Niederschlagsmelder der 7.Minute", "desc": "Niederschlagsmelder der 7.Minute (stdmin -3 min)", "unit": "min" }, { "name": "RRM8", "long_name": "Niederschlagsmelder der 8.Minute", "desc": "Niederschlagsmelder der 8.Minute (stdmin -2 min)", "unit": "min" }, { "name": "RRM9", "long_name": "Niederschlagsmelder der 9.Minute", "desc": "Niederschlagsmelder der 9.Minute (stdmin -1 min)", "unit": "min" }, { "name": "SCHNEE", "long_name": "Schneehöhe", "desc": "Gesamtschneehöhe 10 Minuten aus Schneepegelmessung", "unit": "cm" }, { "name": "SO", "long_name": "Sonnenscheindauer", "desc": "Sonnenscheindauer der letzten 10 Minuten", "unit": "sec" }, { "name": "TB1", "long_name": "1.Erdbodentemperatu", "desc": "1.Erdbodentemperatur in 10cm Tiefe 10 Minuten", "unit": "°C" }, { "name": "TB2", "long_name": "2.Erdbodentemperatur", "desc": "2.Erdbodentemperatur in 20cm Tiefe 10 Minuten", "unit": "°C" }, { "name": "TB3", "long_name": "3.Erdbodentemperatur", "desc": "3.Erdbodentemperatur in 50cm Tiefe 10 Minuten", "unit": "°C" }, { "name": "TL", "long_name": "Lufttemperatur", "desc": "Lufttemperatur 10 Minuten", "unit": "°C" }, { "name": "TLAM", "long_name": "Lufttempertur arithmetisches Mittel", "desc": "Lufttempertur arithmetisches Mittel über 10 Minuten", "unit": "°C" }, { "name": "TLMAX", "long_name": "Lufttemperatur Maximum", "desc": "Lufttemperatur Maximalwert der letzten 10 Minuten", "unit": "°C" }, { "name": "TLMIN", "long_name": "Lufttemperatur Minimum", "desc": "Lufttemperatur Minimalwert der letzten 10 Minuten", "unit": "°C" }, { "name": "TP", "long_name": "Taupunktstemperatur gemessen", "desc": "Taupunktstemperatur gemessen 10 Minuten", "unit": "°C" }, { "name": "TPAM", "long_name": "Taupunkt arithmetisches Mittel", "desc": "Taupunkt arithmetisches Mittel über 10 Minuten", "unit": "°C" }, { "name": "TS", "long_name": "5cm Lufttemperatur", "desc": "5cm Lufttemperatur 10 Minuten", "unit": "°C" }, { "name": "TSMAX", "long_name": "5cm Lufttemperatur Maximum", "desc": "5cm Lufttemperatur Maximalwert der letzten 10 Minuten", "unit": "°C" }, { "name": "TSMIN", "long_name": "5cm Lufttemperatur Minimum", "desc": "5cm Lufttemperatur Minimalwert der letzten 10 Minuten", "unit": "°C" }, { "name": "ZEITX", "long_name": "Zeitpunkt der Windspitze", "desc": "Zeitpunkt der Windspitze der letzten 10 Minuten im Format hhmm", "unit": "" } ], "frequency": "10T", "type": "station", "mode": "current", "response_formats": ["geojson", "csv"], "time": "2022-12-15T10:20+00:00", "stations": [ { "type": "INDIVIDUAL", "id": "11266", "group_id": null, "name": "ACHENKIRCH CAMPINGPLATZ", "state": "Tirol", "lat": 47.49944444444444, "lon": 11.706666666666665, "altitude": 931.0, "valid_from": "2016-06-28T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11125", "group_id": null, "name": "ALPBACH", "state": "Tirol", "lat": 47.39694444444444, "lon": 11.940277777777778, "altitude": 929.0, "valid_from": "2007-10-22T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11330", "group_id": null, "name": "MAYRHOFEN", "state": "Tirol", "lat": 47.1625, "lon": 11.851666666666667, "altitude": 640.0, "valid_from": "2007-08-28T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11369", "group_id": null, "name": "ABTENAU", "state": "Salzburg", "lat": 47.56666666666667, "lon": 13.343333333333334, "altitude": 709.0, "valid_from": "2008-04-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11157", "group_id": null, "name": "AIGEN IM ENNSTAL", "state": "Steiermark", "lat": 47.532777777777774, "lon": 14.138333333333334, "altitude": 641.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11301", "group_id": null, "name": "ALBERSCHWENDE", "state": "Vorarlberg", "lat": 47.4575, "lon": 9.848611111111111, "altitude": 715.0, "valid_from": "1996-01-16T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11019", "group_id": null, "name": "ALLENTSTEIG", "state": "Niederösterreich", "lat": 48.69083333333333, "lon": 15.366944444444444, "altitude": 599.0, "valid_from": "1988-05-30T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11254", "group_id": null, "name": "ALTMUENSTER", "state": "Oberösterreich", "lat": 47.87916666666667, "lon": 13.773333333333333, "altitude": 438.0, "valid_from": "2014-06-25T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11018", "group_id": null, "name": "AMSTETTEN", "state": "Niederösterreich", "lat": 48.10888888888889, "lon": 14.895, "altitude": 266.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11275", "group_id": null, "name": "ARRIACH", "state": "Kärnten", "lat": 46.72777777777778, "lon": 13.8525, "altitude": 890.0, "valid_from": "2003-11-10T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11188", "group_id": null, "name": "ASPANG", "state": "Niederösterreich", "lat": 47.575, "lon": 16.10138888888889, "altitude": 454.0, "valid_from": "2007-11-06T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11356", "group_id": null, "name": "BAD AUSSEE", "state": "Steiermark", "lat": 47.61055555555556, "lon": 13.758333333333333, "altitude": 743.0, "valid_from": "1992-08-29T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11218", "group_id": null, "name": "BAD BLEIBERG", "state": "Kärnten", "lat": 46.625277777777775, "lon": 13.684444444444445, "altitude": 909.0, "valid_from": "2007-08-07T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11234", "group_id": null, "name": "BAD EISENKAPPEL", "state": "Kärnten", "lat": 46.49055555555556, "lon": 14.593333333333334, "altitude": 623.0, "valid_from": "1992-08-29T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11372", "group_id": null, "name": "BAD GASTEIN", "state": "Salzburg", "lat": 47.11055555555556, "lon": 13.133333333333333, "altitude": 1092.0, "valid_from": "2008-04-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11244", "group_id": null, "name": "BAD GLEICHENBERG", "state": "Steiermark", "lat": 46.87222222222222, "lon": 15.903611111111111, "altitude": 269.0, "valid_from": "2003-04-30T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11361", "group_id": null, "name": "BAD ISCHL", "state": "Oberösterreich", "lat": 47.70611111111111, "lon": 13.647222222222222, "altitude": 507.0, "valid_from": "2007-07-19T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11264", "group_id": null, "name": "BAD RADKERSBURG", "state": "Steiermark", "lat": 46.69222222222222, "lon": 15.993333333333332, "altitude": 207.0, "valid_from": "2016-02-08T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11057", "group_id": null, "name": "BAD ZELL", "state": "Oberösterreich", "lat": 48.355000000000004, "lon": 14.663611111111111, "altitude": 554.0, "valid_from": "2008-07-15T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11367", "group_id": null, "name": "BAERNKOPF", "state": "Niederösterreich", "lat": 48.39111111111111, "lon": 15.002777777777778, "altitude": 969.0, "valid_from": "2003-11-10T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11079", "group_id": null, "name": "BERNDORF", "state": "Niederösterreich", "lat": 47.939166666666665, "lon": 16.101111111111113, "altitude": 337.0, "valid_from": "2007-07-24T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11197", "group_id": null, "name": "BERNSTEIN", "state": "Burgenland", "lat": 47.40833333333333, "lon": 16.261388888888888, "altitude": 631.0, "valid_from": "2007-04-30T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11141", "group_id": null, "name": "BISCHOFSHOFEN", "state": "Salzburg", "lat": 47.406666666666666, "lon": 13.221111111111112, "altitude": 550.0, "valid_from": "1981-03-04T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11099", "group_id": null, "name": "BLUDENZ", "state": "Vorarlberg", "lat": 47.147777777777776, "lon": 9.829444444444444, "altitude": 571.0, "valid_from": "2015-07-28T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11051", "group_id": null, "name": "BRAUNAU/RANSHOFEN", "state": "Oberösterreich", "lat": 48.22416666666667, "lon": 13.028333333333334, "altitude": 382.0, "valid_from": "1992-11-09T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11101", "group_id": null, "name": "BREGENZ", "state": "Vorarlberg", "lat": 47.49916666666667, "lon": 9.74611111111111, "altitude": 424.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11129", "group_id": null, "name": "BRENNER NEU", "state": "Tirol", "lat": 47.007222222222225, "lon": 11.510833333333334, "altitude": 1412.0, "valid_from": "2007-09-12T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11175", "group_id": null, "name": "BRUCK/MUR", "state": "Steiermark", "lat": 47.40555555555555, "lon": 15.249722222222221, "altitude": 482.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11394", "group_id": null, "name": "BRUCKNEUDORF", "state": "Burgenland", "lat": 48.01277777777778, "lon": 16.845, "altitude": 166.0, "valid_from": "2007-11-06T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11077", "group_id": null, "name": "BRUNN AM GEBIRGE", "state": "Niederösterreich", "lat": 48.106944444444444, "lon": 16.27, "altitude": 291.0, "valid_from": "2008-08-27T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11318", "group_id": null, "name": "BRUNNENKOGEL / OETZTALER ALPEN", "state": "Tirol", "lat": 46.91277777777778, "lon": 10.861666666666666, "altitude": 3437.0, "valid_from": "2002-01-18T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11066", "group_id": null, "name": "BUCHBERG", "state": "Niederösterreich", "lat": 48.21361111111111, "lon": 15.945, "altitude": 460.0, "valid_from": "2009-06-25T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11108", "group_id": null, "name": "GASCHURN", "state": "Vorarlberg", "lat": 46.98027777777778, "lon": 10.031666666666668, "altitude": 985.0, "valid_from": "2007-07-24T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11267", "group_id": null, "name": "DACHSTEIN-HUNERKOGEL", "state": "Oberösterreich", "lat": 47.467777777777776, "lon": 13.62638888888889, "altitude": 2700.0, "valid_from": "2017-03-27T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11268", "group_id": null, "name": "DACHSTEIN-SCHLADMINGER GLETSCHER", "state": "Oberösterreich", "lat": 47.474444444444444, "lon": 13.6325, "altitude": 2520.0, "valid_from": "2017-05-29T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11285", "group_id": null, "name": "DEUTSCHLANDSBERG", "state": "Steiermark", "lat": 46.82166666666667, "lon": 15.226944444444445, "altitude": 354.0, "valid_from": "1994-10-24T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11206", "group_id": null, "name": "DOELLACH", "state": "Kärnten", "lat": 46.95805555555556, "lon": 12.9025, "altitude": 1071.0, "valid_from": "2004-05-17T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11302", "group_id": null, "name": "DORNBIRN", "state": "Vorarlberg", "lat": 47.4325, "lon": 9.725555555555555, "altitude": 407.0, "valid_from": "1993-06-16T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11118", "group_id": null, "name": "EHRWALD", "state": "Tirol", "lat": 47.40416666666667, "lon": 10.92, "altitude": 982.0, "valid_from": "2007-08-24T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11190", "group_id": null, "name": "EISENSTADT", "state": "Burgenland", "lat": 47.85416666666667, "lon": 16.538333333333334, "altitude": 184.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11002", "group_id": null, "name": "ENNS", "state": "Oberösterreich", "lat": 48.19583333333333, "lon": 14.450277777777776, "altitude": 317.0, "valid_from": "2008-04-21T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11150", "group_id": null, "name": "SALZBURG-FLUGHAFEN", "state": "Salzburg", "lat": 47.78944444444444, "lon": 13.008611111111112, "altitude": 430.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11135", "group_id": null, "name": "HAHNENKAMM/EHRENBACHHOEHE", "state": "Tirol", "lat": 47.41833333333333, "lon": 12.359166666666667, "altitude": 1794.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11298", "group_id": null, "name": "FELDBACH", "state": "Steiermark", "lat": 46.94888888888889, "lon": 15.879722222222222, "altitude": 323.0, "valid_from": "1999-08-16T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11105", "group_id": null, "name": "FELDKIRCH", "state": "Vorarlberg", "lat": 47.27111111111111, "lon": 9.609722222222222, "altitude": 438.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11227", "group_id": null, "name": "FELDKIRCHEN", "state": "Kärnten", "lat": 46.721944444444446, "lon": 14.096944444444444, "altitude": 546.0, "valid_from": "1995-05-04T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11235", "group_id": null, "name": "FERLACH", "state": "Kärnten", "lat": 46.53111111111111, "lon": 14.314166666666667, "altitude": 459.0, "valid_from": "2007-08-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11155", "group_id": null, "name": "FEUERKOGEL", "state": "Oberösterreich", "lat": 47.81666666666667, "lon": 13.717777777777778, "altitude": 1618.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11222", "group_id": null, "name": "FLATTNITZ", "state": "Kärnten", "lat": 46.94083333333333, "lon": 14.036111111111111, "altitude": 1437.0, "valid_from": "2007-07-19T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11104", "group_id": null, "name": "FRAXERN", "state": "Vorarlberg", "lat": 47.314166666666665, "lon": 9.674444444444443, "altitude": 807.0, "valid_from": "2003-07-04T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11068", "group_id": null, "name": "FREISTADT", "state": "Oberösterreich", "lat": 48.49472222222222, "lon": 14.506388888888889, "altitude": 539.0, "valid_from": "2014-01-21T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11249", "group_id": null, "name": "FROHNLEITEN", "state": "Steiermark", "lat": 47.25555555555555, "lon": 15.315000000000001, "altitude": 421.0, "valid_from": "2008-08-27T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11246", "group_id": null, "name": "FUERSTENFELD", "state": "Steiermark", "lat": 47.030833333333334, "lon": 16.080833333333334, "altitude": 271.0, "valid_from": "2007-07-19T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11048", "group_id": null, "name": "GAENSERNDORF", "state": "Niederösterreich", "lat": 48.33777777777778, "lon": 16.71361111111111, "altitude": 163.0, "valid_from": "2002-11-12T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11312", "group_id": null, "name": "GALTUER", "state": "Tirol", "lat": 46.96805555555556, "lon": 10.185555555555556, "altitude": 1587.0, "valid_from": "1997-02-17T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11110", "group_id": null, "name": "GALZIG", "state": "Tirol", "lat": 47.12972222222222, "lon": 10.230277777777777, "altitude": 2079.0, "valid_from": "1981-03-05T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11064", "group_id": null, "name": "GARS AM KAMP", "state": "Niederösterreich", "lat": 48.591944444444444, "lon": 15.7, "altitude": 273.0, "valid_from": "2016-02-08T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11247", "group_id": null, "name": "GLEISDORF", "state": "Steiermark", "lat": 47.11555555555556, "lon": 15.708055555555555, "altitude": 377.0, "valid_from": "2007-07-19T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11350", "group_id": null, "name": "SALZBURG-FREISAAL", "state": "Salzburg", "lat": 47.79111111111111, "lon": 13.054166666666667, "altitude": 419.0, "valid_from": "1992-08-29T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11273", "group_id": null, "name": "GMUEND/KAERNTEN", "state": "Kärnten", "lat": 46.90277777777778, "lon": 13.534166666666666, "altitude": 738.0, "valid_from": "2008-04-21T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11371", "group_id": null, "name": "GOLLING", "state": "Salzburg", "lat": 47.59111111111111, "lon": 13.181666666666667, "altitude": 490.0, "valid_from": "2008-09-09T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11290", "group_id": null, "name": "GRAZ UNIVERSITAET", "state": "Steiermark", "lat": 47.07777777777778, "lon": 15.44888888888889, "altitude": 367.0, "valid_from": "1992-08-29T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11232", "group_id": null, "name": "FEISTRITZ OB BLEIBURG", "state": "Kärnten", "lat": 46.55888888888889, "lon": 14.766666666666667, "altitude": 522.0, "valid_from": "2004-08-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11240", "group_id": null, "name": "GRAZ-THALERHOF-FLUGHAFEN", "state": "Steiermark", "lat": 46.980555555555554, "lon": 15.44, "altitude": 340.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11238", "group_id": null, "name": "GRAZ/STRASSGANG", "state": "Steiermark", "lat": 47.04611111111111, "lon": 15.410277777777779, "altitude": 357.0, "valid_from": "2007-08-24T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11037", "group_id": null, "name": "GROSSENZERSDORF", "state": "Niederösterreich", "lat": 48.19972222222222, "lon": 16.559166666666666, "altitude": 154.0, "valid_from": "1994-01-12T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11198", "group_id": null, "name": "GUESSING", "state": "Burgenland", "lat": 47.0625, "lon": 16.321944444444444, "altitude": 215.0, "valid_from": "2008-04-21T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11378", "group_id": null, "name": "GUTENSTEIN-MARIAHILFBERG", "state": "Niederösterreich", "lat": 47.87138888888889, "lon": 15.876111111111111, "altitude": 709.0, "valid_from": "1996-09-04T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11309", "group_id": null, "name": "HAIMING", "state": "Tirol", "lat": 47.25972222222222, "lon": 10.889444444444443, "altitude": 659.0, "valid_from": "2007-08-10T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11167", "group_id": null, "name": "HALL/ADMONT", "state": "Steiermark", "lat": 47.59444444444445, "lon": 14.490833333333333, "altitude": 637.0, "valid_from": "2007-07-19T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11390", "group_id": null, "name": "HARTBERG", "state": "Steiermark", "lat": 47.28055555555555, "lon": 15.97861111111111, "altitude": 330.0, "valid_from": "1994-10-24T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11259", "group_id": null, "name": "HERMAGOR", "state": "Kärnten", "lat": 46.609722222222224, "lon": 13.492222222222221, "altitude": 562.0, "valid_from": "2008-06-03T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11384", "group_id": null, "name": "HIRSCHENKOGEL", "state": "Niederösterreich", "lat": 47.623333333333335, "lon": 15.833333333333334, "altitude": 1318.0, "valid_from": "1994-06-13T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11339", "group_id": null, "name": "HOCHFILZEN", "state": "Tirol", "lat": 47.47027777777778, "lon": 12.621111111111112, "altitude": 962.0, "valid_from": "2007-10-22T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11385", "group_id": null, "name": "HOHE WAND/HOCHKOGELHAUS", "state": "Niederösterreich", "lat": 47.82222222222222, "lon": 16.035, "altitude": 937.0, "valid_from": "1993-05-14T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11315", "group_id": null, "name": "HOLZGAU", "state": "Tirol", "lat": 47.2575, "lon": 10.338611111111112, "altitude": 1092.0, "valid_from": "2007-08-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11115", "group_id": null, "name": "IMST", "state": "Tirol", "lat": 47.23694444444445, "lon": 10.742222222222221, "altitude": 773.0, "valid_from": "2007-08-10T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11297", "group_id": null, "name": "HORN", "state": "Niederösterreich", "lat": 48.675, "lon": 15.643888888888888, "altitude": 308.0, "valid_from": "2018-07-10T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11121", "group_id": null, "name": "INNSBRUCK-FLUGHAFEN (AUTOMAT)", "state": "Tirol", "lat": 47.26, "lon": 11.356666666666666, "altitude": 578.0, "valid_from": "2002-07-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11320", "group_id": null, "name": "INNSBRUCK/UNIVERSITAET", "state": "Tirol", "lat": 47.26, "lon": 11.384166666666665, "altitude": 578.0, "valid_from": "2009-07-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11176", "group_id": null, "name": "KAPFENBERG-FLUGFELD", "state": "Steiermark", "lat": 47.458333333333336, "lon": 15.335555555555556, "altitude": 515.0, "valid_from": "1997-02-13T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11024", "group_id": null, "name": "JAUERLING", "state": "Niederösterreich", "lat": 48.33444444444444, "lon": 15.339166666666667, "altitude": 955.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11200", "group_id": null, "name": "KALS", "state": "Tirol", "lat": 47.00472222222222, "lon": 12.646388888888888, "altitude": 1352.0, "valid_from": "2007-07-19T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11362", "group_id": null, "name": "KALWANG", "state": "Steiermark", "lat": 47.421388888888885, "lon": 14.759722222222223, "altitude": 744.0, "valid_from": "1994-05-17T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11216", "group_id": null, "name": "KANZELHOEHE", "state": "Kärnten", "lat": 46.67722222222222, "lon": 13.901944444444444, "altitude": 1520.0, "valid_from": "2001-12-18T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11349", "group_id": null, "name": "KATSCHBERG", "state": "Kärnten", "lat": 47.06055555555555, "lon": 13.614722222222222, "altitude": 1635.0, "valid_from": "1998-10-29T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11086", "group_id": null, "name": "KORNAT", "state": "Kärnten", "lat": 46.684999999999995, "lon": 12.88888888888889, "altitude": 990.0, "valid_from": "2017-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11327", "group_id": null, "name": "KIRCHDORF/TIROL", "state": "Tirol", "lat": 47.566111111111105, "lon": 12.463055555555554, "altitude": 637.0, "valid_from": "2006-02-16T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11279", "group_id": null, "name": "KITZBUEHEL", "state": "Tirol", "lat": 47.443888888888885, "lon": 12.389166666666666, "altitude": 772.0, "valid_from": "2014-10-14T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11255", "group_id": null, "name": "KOETSCHACH-MAUTHEN", "state": "Kärnten", "lat": 46.67638888888889, "lon": 12.998333333333333, "altitude": 705.0, "valid_from": "1990-09-10T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11331", "group_id": null, "name": "KLAGENFURT-FLUGHAFEN (AUTOMAT)", "state": "Kärnten", "lat": 46.64833333333333, "lon": 14.318333333333333, "altitude": 450.0, "valid_from": "2002-07-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11391", "group_id": null, "name": "KLAUSEN-LEOPOLDSDORF", "state": "Niederösterreich", "lat": 48.08861111111111, "lon": 16.001666666666665, "altitude": 389.0, "valid_from": "2007-11-06T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11192", "group_id": null, "name": "KLEINZICKEN", "state": "Burgenland", "lat": 47.2075, "lon": 16.335555555555555, "altitude": 265.0, "valid_from": "1978-05-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11131", "group_id": null, "name": "KOESSEN", "state": "Tirol", "lat": 47.66277777777778, "lon": 12.393888888888888, "altitude": 588.0, "valid_from": "2008-07-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11073", "group_id": null, "name": "MITTERSILL", "state": "Salzburg", "lat": 47.27916666666667, "lon": 12.495833333333332, "altitude": 783.0, "valid_from": "2017-08-03T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11007", "group_id": null, "name": "KOLLERSCHLAG", "state": "Oberösterreich", "lat": 48.60277777777778, "lon": 13.839166666666667, "altitude": 714.0, "valid_from": "2007-12-05T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11344", "group_id": null, "name": "KOLM-SAIGURN", "state": "Salzburg", "lat": 47.06944444444445, "lon": 12.98472222222222, "altitude": 1626.0, "valid_from": "2003-11-10T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11012", "group_id": null, "name": "KREMSMUENSTER", "state": "Oberösterreich", "lat": 48.055, "lon": 14.131111111111112, "altitude": 382.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "8989042", "group_id": null, "name": "KROISEGG", "state": "Burgenland", "lat": 47.37861111111111, "lon": 16.042222222222225, "altitude": 444.0, "valid_from": "2016-04-11T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11136", "group_id": null, "name": "KRIMML", "state": "Salzburg", "lat": 47.22916666666667, "lon": 12.181944444444444, "altitude": 1009.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11130", "group_id": null, "name": "KUFSTEIN", "state": "Tirol", "lat": 47.57527777777778, "lon": 12.162777777777778, "altitude": 490.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11335", "group_id": null, "name": "LAA/THAYA", "state": "Niederösterreich", "lat": 48.731388888888894, "lon": 16.389722222222222, "altitude": 184.0, "valid_from": "2006-12-12T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11112", "group_id": null, "name": "LANDECK", "state": "Tirol", "lat": 47.140277777777776, "lon": 10.563611111111111, "altitude": 796.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11307", "group_id": null, "name": "LANGEN/ARLBERG", "state": "Vorarlberg", "lat": 47.13166666666667, "lon": 10.123333333333333, "altitude": 1221.0, "valid_from": "2007-08-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11075", "group_id": null, "name": "LANGENLOIS", "state": "Niederösterreich", "lat": 48.472500000000004, "lon": 15.697222222222223, "altitude": 207.0, "valid_from": "1990-07-04T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11083", "group_id": null, "name": "LEISER BERGE", "state": "Niederösterreich", "lat": 48.55888888888889, "lon": 16.371666666666666, "altitude": 457.0, "valid_from": "1999-09-27T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11274", "group_id": null, "name": "LEOBEN", "state": "Steiermark", "lat": 47.37833333333333, "lon": 15.086666666666668, "altitude": 544.0, "valid_from": "2012-06-19T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11204", "group_id": null, "name": "LIENZ", "state": "Tirol", "lat": 46.82555555555556, "lon": 12.80638888888889, "altitude": 661.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11078", "group_id": null, "name": "LILIENFELD/TARSCHBERG", "state": "Niederösterreich", "lat": 48.028055555555554, "lon": 15.5875, "altitude": 696.0, "valid_from": "1993-04-15T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11060", "group_id": null, "name": "LINZ-STADT", "state": "Oberösterreich", "lat": 48.296388888888885, "lon": 14.285555555555556, "altitude": 262.0, "valid_from": "1992-11-18T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11010", "group_id": null, "name": "LINZ/HOERSCHING-FLUGHAFEN", "state": "Oberösterreich", "lat": 48.23527777777778, "lon": 14.188055555555556, "altitude": 298.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11021", "group_id": null, "name": "LITSCHAU", "state": "Niederösterreich", "lat": 48.95472222222222, "lon": 15.038333333333334, "altitude": 558.0, "valid_from": "1976-04-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11140", "group_id": null, "name": "LOFER", "state": "Salzburg", "lat": 47.58444444444444, "lon": 12.695277777777777, "altitude": 622.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11217", "group_id": null, "name": "LOIBL/TUNNEL", "state": "Kärnten", "lat": 46.443888888888885, "lon": 14.249166666666666, "altitude": 1097.0, "valid_from": "2007-08-07T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11170", "group_id": null, "name": "LUNZ", "state": "Niederösterreich", "lat": 47.85444444444445, "lon": 15.067499999999999, "altitude": 612.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11393", "group_id": null, "name": "LUTZMANNSBURG", "state": "Burgenland", "lat": 47.46527777777778, "lon": 16.645555555555553, "altitude": 201.0, "valid_from": "1995-10-03T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11337", "group_id": null, "name": "LOFERER ALM", "state": "Salzburg", "lat": 47.59777777777778, "lon": 12.64611111111111, "altitude": 1619.0, "valid_from": "1995-02-24T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11171", "group_id": null, "name": "MARIAZELL/ST SEBASTIAN", "state": "Steiermark", "lat": 47.78916666666667, "lon": 15.302222222222223, "altitude": 864.0, "valid_from": "1987-07-29T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11189", "group_id": null, "name": "MATTERSBURG", "state": "Burgenland", "lat": 47.745, "lon": 16.389166666666664, "altitude": 284.0, "valid_from": "2007-11-06T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11049", "group_id": null, "name": "MATTIGHOFEN", "state": "Oberösterreich", "lat": 48.09722222222222, "lon": 13.151111111111112, "altitude": 460.0, "valid_from": "2008-04-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11152", "group_id": null, "name": "MATTSEE", "state": "Salzburg", "lat": 47.977222222222224, "lon": 13.105555555555556, "altitude": 502.0, "valid_from": "1972-01-03T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11054", "group_id": null, "name": "MELK", "state": "Niederösterreich", "lat": 48.209722222222226, "lon": 15.331388888888888, "altitude": 307.0, "valid_from": "2008-06-20T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11332", "group_id": null, "name": "MISTELBACH", "state": "Niederösterreich", "lat": 48.57083333333334, "lon": 16.609444444444446, "altitude": 191.0, "valid_from": "2004-06-15T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11187", "group_id": null, "name": "MITTELBERG", "state": "Vorarlberg", "lat": 47.32333333333334, "lon": 10.1525, "altitude": 1204.0, "valid_from": "2009-02-23T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11185", "group_id": null, "name": "MOENICHKIRCHEN", "state": "Niederösterreich", "lat": 47.51111111111111, "lon": 16.033333333333335, "altitude": 991.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11153", "group_id": null, "name": "MONDSEE", "state": "Oberösterreich", "lat": 47.850833333333334, "lon": 13.347222222222223, "altitude": 481.0, "valid_from": "2008-07-15T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11199", "group_id": null, "name": "MOOSLANDL", "state": "Steiermark", "lat": 47.6475, "lon": 14.761666666666667, "altitude": 530.0, "valid_from": "2005-06-10T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11177", "group_id": null, "name": "MUERZZUSCHLAG", "state": "Steiermark", "lat": 47.602222222222224, "lon": 15.672777777777776, "altitude": 705.0, "valid_from": "2007-11-30T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11280", "group_id": null, "name": "MURAU", "state": "Steiermark", "lat": 47.111111111111114, "lon": 14.176944444444445, "altitude": 816.0, "valid_from": "1990-07-26T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11113", "group_id": null, "name": "NAUDERS", "state": "Tirol", "lat": 46.89111111111111, "lon": 10.496944444444443, "altitude": 1330.0, "valid_from": "2003-10-16T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11258", "group_id": null, "name": "NEUDORF/LANDSEE", "state": "Burgenland", "lat": 47.562777777777775, "lon": 16.38138888888889, "altitude": 429.0, "valid_from": "2015-08-04T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11220", "group_id": null, "name": "NEUMARKT", "state": "Steiermark", "lat": 47.069722222222225, "lon": 14.424722222222222, "altitude": 869.0, "valid_from": "1993-05-27T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11194", "group_id": null, "name": "NEUSIEDL AM SEE", "state": "Burgenland", "lat": 47.950833333333335, "lon": 16.841666666666665, "altitude": 148.0, "valid_from": "1984-12-05T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11324", "group_id": null, "name": "NEUSTIFT/MILDERS", "state": "Tirol", "lat": 47.10277777777778, "lon": 11.291944444444445, "altitude": 1007.0, "valid_from": "2004-10-21T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11072", "group_id": null, "name": "NEUSIEDL AM SEE", "state": "Burgenland", "lat": 47.94916666666666, "lon": 16.828888888888887, "altitude": 117.0, "valid_from": "2016-10-14T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11376", "group_id": null, "name": "OBERNDORF/MELK", "state": "Niederösterreich", "lat": 48.0625, "lon": 15.213888888888889, "altitude": 295.0, "valid_from": "2007-07-17T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11149", "group_id": null, "name": "OBERTAUERN", "state": "Salzburg", "lat": 47.24888888888889, "lon": 13.559722222222224, "altitude": 1772.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11262", "group_id": null, "name": "OBERVELLACH", "state": "Kärnten", "lat": 46.93527777777778, "lon": 13.194444444444445, "altitude": 688.0, "valid_from": "2014-02-10T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11377", "group_id": null, "name": "OBERWOELZ", "state": "Steiermark", "lat": 47.20194444444445, "lon": 14.286666666666667, "altitude": 842.0, "valid_from": "2007-07-26T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11127", "group_id": null, "name": "OBERGURGL", "state": "Tirol", "lat": 46.86694444444444, "lon": 11.024444444444445, "altitude": 1941.0, "valid_from": "1982-02-26T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11061", "group_id": null, "name": "OSTERMIETHING", "state": "Oberösterreich", "lat": 48.05305555555555, "lon": 12.831666666666667, "altitude": 412.0, "valid_from": "2008-04-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11126", "group_id": null, "name": "PATSCHERKOFEL", "state": "Tirol", "lat": 47.20888888888889, "lon": 11.462222222222222, "altitude": 2251.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11316", "group_id": null, "name": "PITZTALER GLETSCHER", "state": "Tirol", "lat": 46.926944444444445, "lon": 10.879166666666666, "altitude": 2864.0, "valid_from": "1993-12-09T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11084", "group_id": null, "name": "PODERSDORF", "state": "Burgenland", "lat": 47.86611111111111, "lon": 16.834444444444443, "altitude": 116.0, "valid_from": "2014-05-16T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11278", "group_id": null, "name": "POERTSCHACH", "state": "Kärnten", "lat": 46.630833333333335, "lon": 14.165277777777778, "altitude": 450.0, "valid_from": "1996-12-09T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11381", "group_id": null, "name": "POTTSCHACH", "state": "Niederösterreich", "lat": 47.700833333333335, "lon": 16.008055555555554, "altitude": 416.0, "valid_from": "2007-07-24T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11032", "group_id": null, "name": "POYSDORF", "state": "Niederösterreich", "lat": 48.66916666666666, "lon": 16.6375, "altitude": 198.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11161", "group_id": null, "name": "PRAEBICHL", "state": "Steiermark", "lat": 47.52166666666667, "lon": 14.954166666666666, "altitude": 1215.0, "valid_from": "2000-09-26T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11214", "group_id": null, "name": "PREITENEGG", "state": "Kärnten", "lat": 46.93805555555555, "lon": 14.915000000000001, "altitude": 1034.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11382", "group_id": null, "name": "PUCHBERG", "state": "Niederösterreich", "lat": 47.790277777777774, "lon": 15.906944444444445, "altitude": 583.0, "valid_from": "1991-03-07T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11047", "group_id": null, "name": "RAABS/THAYA", "state": "Niederösterreich", "lat": 48.84805555555556, "lon": 15.501944444444444, "altitude": 459.0, "valid_from": "2008-03-26T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11208", "group_id": null, "name": "RADSTADT-TANDALIER", "state": "Salzburg", "lat": 47.38, "lon": 13.440833333333334, "altitude": 835.0, "valid_from": "2016-02-09T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11346", "group_id": null, "name": "RAURIS", "state": "Salzburg", "lat": 47.22361111111111, "lon": 12.9925, "altitude": 934.0, "valid_from": "1993-06-17T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11180", "group_id": null, "name": "RAX/SEILBAHN-BERGSTAT", "state": "Niederösterreich", "lat": 47.7175, "lon": 15.778611111111111, "altitude": 1547.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11050", "group_id": null, "name": "REICHENAU/MUEHLKREIS", "state": "Oberösterreich", "lat": 48.45916666666667, "lon": 14.345555555555556, "altitude": 689.0, "valid_from": "2008-04-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11380", "group_id": null, "name": "REICHENAU/RAX", "state": "Niederösterreich", "lat": 47.69972222222222, "lon": 15.836944444444445, "altitude": 488.0, "valid_from": "1991-01-28T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11004", "group_id": null, "name": "REICHERSBERG", "state": "Oberösterreich", "lat": 48.33111111111111, "lon": 13.376111111111111, "altitude": 351.0, "valid_from": "2007-12-05T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11022", "group_id": null, "name": "RETZ", "state": "Niederösterreich", "lat": 48.76111111111111, "lon": 15.941666666666666, "altitude": 320.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11314", "group_id": null, "name": "REUTTE", "state": "Tirol", "lat": 47.49444444444445, "lon": 10.715277777777777, "altitude": 842.0, "valid_from": "1994-12-06T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11053", "group_id": null, "name": "RIED IM INNKREIS", "state": "Oberösterreich", "lat": 48.217222222222226, "lon": 13.475, "altitude": 427.0, "valid_from": "1997-06-16T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11123", "group_id": null, "name": "RINN", "state": "Tirol", "lat": 47.24916666666667, "lon": 11.50388888888889, "altitude": 924.0, "valid_from": "2007-10-22T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11299", "group_id": null, "name": "ROHRSPITZ", "state": "Vorarlberg", "lat": 47.49722222222222, "lon": 9.63, "altitude": 395.0, "valid_from": "2008-06-20T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11063", "group_id": null, "name": "ROTTENMANN", "state": "Steiermark", "lat": 47.507777777777775, "lon": 14.430277777777777, "altitude": 707.0, "valid_from": "2009-06-25T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11138", "group_id": null, "name": "RUDOLFSHUETTE-ALPINZENTRUM", "state": "Salzburg", "lat": 47.135, "lon": 12.625833333333334, "altitude": 2317.0, "valid_from": "1980-07-21T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11366", "group_id": null, "name": "SAALBACH", "state": "Salzburg", "lat": 47.38777777777778, "lon": 12.648333333333333, "altitude": 975.0, "valid_from": "2007-12-05T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11082", "group_id": null, "name": "GUMPOLDSKIRCHEN", "state": "Niederösterreich", "lat": 48.03583333333333, "lon": 16.280833333333334, "altitude": 212.0, "valid_from": "1991-11-07T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11055", "group_id": null, "name": "SCHAERDING", "state": "Oberösterreich", "lat": 48.46416666666667, "lon": 13.434444444444445, "altitude": 307.0, "valid_from": "1994-02-17T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11326", "group_id": null, "name": "SCHMIRN", "state": "Tirol", "lat": 47.08722222222222, "lon": 11.580277777777777, "altitude": 1464.0, "valid_from": "2004-10-19T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11340", "group_id": null, "name": "SCHMITTENHOEHE", "state": "Salzburg", "lat": 47.328611111111115, "lon": 12.738055555555555, "altitude": 1956.0, "valid_from": "1990-04-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11241", "group_id": null, "name": "SCHOECKL", "state": "Steiermark", "lat": 47.198611111111106, "lon": 15.466388888888888, "altitude": 1443.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11334", "group_id": null, "name": "SCHOENGRABERN", "state": "Niederösterreich", "lat": 48.60333333333333, "lon": 16.061666666666667, "altitude": 253.0, "valid_from": "2007-04-30T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11303", "group_id": null, "name": "SCHOPPERNAU", "state": "Vorarlberg", "lat": 47.311388888888885, "lon": 10.017777777777779, "altitude": 839.0, "valid_from": "2007-08-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11306", "group_id": null, "name": "SCHROECKEN", "state": "Vorarlberg", "lat": 47.26166666666666, "lon": 10.086111111111112, "altitude": 1244.0, "valid_from": "2007-10-22T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11166", "group_id": null, "name": "SECKAU", "state": "Steiermark", "lat": 47.270833333333336, "lon": 14.778611111111111, "altitude": 872.0, "valid_from": "2001-12-18T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11119", "group_id": null, "name": "SEEFELD", "state": "Tirol", "lat": 47.32472222222223, "lon": 11.175555555555555, "altitude": 1182.0, "valid_from": "1997-06-11T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11387", "group_id": null, "name": "SEIBERSDORF", "state": "Niederösterreich", "lat": 47.97638888888889, "lon": 16.505, "altitude": 185.0, "valid_from": "2002-12-09T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11383", "group_id": null, "name": "SEMMERING/PASS", "state": "Niederösterreich", "lat": 47.63333333333333, "lon": 15.828333333333333, "altitude": 988.0, "valid_from": "1991-01-28T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11201", "group_id": null, "name": "SILLIAN", "state": "Tirol", "lat": 46.74638888888889, "lon": 12.42361111111111, "altitude": 1081.0, "valid_from": "1997-03-04T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11343", "group_id": null, "name": "SONNBLICK - AUTOM.", "state": "Salzburg", "lat": 47.05416666666667, "lon": 12.9575, "altitude": 3109.0, "valid_from": "1997-08-31T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11272", "group_id": null, "name": "SPITTAL/DRAU", "state": "Kärnten", "lat": 46.79055555555556, "lon": 13.487222222222222, "altitude": 542.0, "valid_from": "1997-09-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11229", "group_id": null, "name": "ST.ANDRAE I.L.", "state": "Kärnten", "lat": 46.76416666666667, "lon": 14.828055555555554, "altitude": 403.0, "valid_from": "1976-11-15T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11311", "group_id": null, "name": "ST.ANTON/ARLBERG", "state": "Tirol", "lat": 47.13138888888889, "lon": 10.266666666666667, "altitude": 1304.0, "valid_from": "2001-01-28T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11300", "group_id": null, "name": "ST.JAKOB/DEFEREGGEN", "state": "Tirol", "lat": 46.91694444444444, "lon": 12.35388888888889, "altitude": 1383.0, "valid_from": "2007-07-19T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11317", "group_id": null, "name": "ST.LEONHARD/PITZTAL", "state": "Tirol", "lat": 47.02722222222222, "lon": 10.865555555555556, "altitude": 1454.0, "valid_from": "2007-09-12T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11148", "group_id": null, "name": "ST.MICHAEL/LUNGAU", "state": "Salzburg", "lat": 47.09444444444445, "lon": 13.622777777777777, "altitude": 1052.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11389", "group_id": null, "name": "ST.POELTEN LANDHAUS", "state": "Niederösterreich", "lat": 48.19972222222222, "lon": 15.631111111111112, "altitude": 274.0, "valid_from": "2003-07-04T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11237", "group_id": null, "name": "ST.VEIT/GLAN", "state": "Kärnten", "lat": 46.73916666666667, "lon": 14.385555555555555, "altitude": 463.0, "valid_from": "2007-07-31T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11020", "group_id": null, "name": "STIFT ZWETTL", "state": "Niederösterreich", "lat": 48.617777777777775, "lon": 15.20361111111111, "altitude": 502.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11027", "group_id": null, "name": "STOCKERAU", "state": "Niederösterreich", "lat": 48.39694444444444, "lon": 16.1925, "altitude": 203.0, "valid_from": "2002-04-10T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11363", "group_id": null, "name": "STOLZALPE", "state": "Steiermark", "lat": 47.12305555555555, "lon": 14.188333333333334, "altitude": 1291.0, "valid_from": "2007-07-26T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11100", "group_id": null, "name": "SULZBERG", "state": "Vorarlberg", "lat": 47.52194444444444, "lon": 9.914444444444445, "altitude": 1016.0, "valid_from": "2008-06-20T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11399", "group_id": null, "name": "TAMSWEG", "state": "Salzburg", "lat": 47.13305555555556, "lon": 13.808333333333334, "altitude": 1025.0, "valid_from": "2008-04-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11111", "group_id": null, "name": "TANNHEIM", "state": "Tirol", "lat": 47.500277777777775, "lon": 10.505833333333333, "altitude": 1100.0, "valid_from": "2008-07-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11030", "group_id": null, "name": "TULLN/LANGENLEBARN", "state": "Niederösterreich", "lat": 48.323888888888895, "lon": 16.118055555555557, "altitude": 175.0, "valid_from": "1972-01-03T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11117", "group_id": null, "name": "UMHAUSEN", "state": "Tirol", "lat": 47.13916666666667, "lon": 10.928888888888888, "altitude": 1035.0, "valid_from": "2003-07-04T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11124", "group_id": null, "name": "VALLUGA (RADAR)", "state": "Vorarlberg", "lat": 47.1575, "lon": 10.212777777777777, "altitude": 2805.0, "valid_from": "2009-05-06T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11213", "group_id": null, "name": "VILLACH", "state": "Kärnten", "lat": 46.61805555555556, "lon": 13.873888888888889, "altitude": 493.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11265", "group_id": null, "name": "VILLACHER ALPE - AUTOM.", "state": "Kärnten", "lat": 46.603611111111114, "lon": 13.672777777777776, "altitude": 2117.0, "valid_from": "1997-08-31T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11056", "group_id": null, "name": "VOECKLABRUCK", "state": "Oberösterreich", "lat": 48.00666666666667, "lon": 13.645555555555555, "altitude": 432.0, "valid_from": "2008-04-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11257", "group_id": null, "name": "VOELKERMARKT-GOLDBRUNNHOF", "state": "Kärnten", "lat": 46.670833333333334, "lon": 14.639166666666666, "altitude": 466.0, "valid_from": "2015-07-07T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11374", "group_id": null, "name": "WACHTBERG BEI STEYR", "state": "Niederösterreich", "lat": 48.0475, "lon": 14.46111111111111, "altitude": 384.0, "valid_from": "2008-05-08T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11058", "group_id": null, "name": "WAIZENKIRCHEN", "state": "Oberösterreich", "lat": 48.32666666666667, "lon": 13.864722222222222, "altitude": 400.0, "valid_from": "2008-04-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11308", "group_id": null, "name": "WARTH", "state": "Vorarlberg", "lat": 47.255833333333335, "lon": 10.186111111111112, "altitude": 1478.0, "valid_from": "1990-12-15T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11225", "group_id": null, "name": "WEITENSFELD", "state": "Kärnten", "lat": 46.84916666666667, "lon": 14.190833333333334, "altitude": 704.0, "valid_from": "2007-07-19T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11025", "group_id": null, "name": "WEITRA", "state": "Niederösterreich", "lat": 48.702222222222225, "lon": 14.89861111111111, "altitude": 572.0, "valid_from": "2003-08-21T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11044", "group_id": null, "name": "WIEN JUBILAEUMSWARTE", "state": "Wien", "lat": 48.221111111111114, "lon": 16.26527777777778, "altitude": 450.0, "valid_from": "2008-09-17T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11042", "group_id": null, "name": "WIEN STAMMERSDORF", "state": "Wien", "lat": 48.30583333333333, "lon": 16.405555555555555, "altitude": 191.0, "valid_from": "2008-07-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11090", "group_id": null, "name": "WIEN-DONAUFELD", "state": "Wien", "lat": 48.257222222222225, "lon": 16.43138888888889, "altitude": 160.0, "valid_from": "2001-05-30T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11034", "group_id": null, "name": "WIEN-INNERE STADT", "state": "Wien", "lat": 48.19833333333333, "lon": 16.366944444444446, "altitude": 177.0, "valid_from": "1990-03-09T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11035", "group_id": null, "name": "WIEN/HOHE WARTE", "state": "Wien", "lat": 48.24861111111111, "lon": 16.35638888888889, "altitude": 198.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11080", "group_id": null, "name": "WIEN/MARIABRUNN", "state": "Wien", "lat": 48.206944444444446, "lon": 16.229444444444443, "altitude": 225.0, "valid_from": "1997-02-17T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11036", "group_id": null, "name": "WIEN/SCHWECHAT-FLUGHAFEN", "state": "Niederösterreich", "lat": 48.1175, "lon": 16.58138888888889, "altitude": 183.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11040", "group_id": null, "name": "WIEN/UNTERLAA", "state": "Wien", "lat": 48.125, "lon": 16.419444444444444, "altitude": 200.0, "valid_from": "1997-09-09T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11182", "group_id": null, "name": "WIENER NEUSTADT", "state": "Niederösterreich", "lat": 47.83222222222223, "lon": 16.231388888888887, "altitude": 275.0, "valid_from": "1972-01-03T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11379", "group_id": null, "name": "WIESELBURG", "state": "Niederösterreich", "lat": 48.12722222222222, "lon": 15.146666666666667, "altitude": 259.0, "valid_from": "2007-07-19T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11392", "group_id": null, "name": "WOERTERBERG", "state": "Burgenland", "lat": 47.226111111111116, "lon": 16.096666666666664, "altitude": 404.0, "valid_from": "2007-04-30T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11001", "group_id": null, "name": "WOLFSEGG", "state": "Oberösterreich", "lat": 48.105555555555554, "lon": 13.670833333333333, "altitude": 635.0, "valid_from": "1972-01-01T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11045", "group_id": null, "name": "WOLKERSDORF", "state": "Niederösterreich", "lat": 48.38027777777778, "lon": 16.5075, "altitude": 185.0, "valid_from": "2008-06-20T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11071", "group_id": null, "name": "WAIDHOFEN/YBBS", "state": "Niederösterreich", "lat": 47.94555555555555, "lon": 14.809722222222224, "altitude": 384.0, "valid_from": "2016-10-14T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11085", "group_id": null, "name": "ZWERNDORF-MARCHEGG", "state": "Niederösterreich", "lat": 48.338055555555556, "lon": 16.83138888888889, "altitude": 144.0, "valid_from": "1997-03-20T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11059", "group_id": null, "name": "WELS/SCHLEISSHEIM", "state": "Oberösterreich", "lat": 48.16277777777778, "lon": 14.071388888888889, "altitude": 309.0, "valid_from": "1992-08-29T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11228", "group_id": null, "name": "FRIESACH", "state": "Kärnten", "lat": 46.95861111111111, "lon": 14.405833333333334, "altitude": 640.0, "valid_from": "2007-07-19T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11070", "group_id": null, "name": "KREMS", "state": "Niederösterreich", "lat": 48.41861111111111, "lon": 15.622222222222224, "altitude": 202.0, "valid_from": "1996-05-07T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11395", "group_id": null, "name": "ANDAU", "state": "Burgenland", "lat": 47.769999999999996, "lon": 17.035555555555558, "altitude": 117.0, "valid_from": "1995-08-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11304", "group_id": null, "name": "BRAND", "state": "Vorarlberg", "lat": 47.10305555555556, "lon": 9.738333333333333, "altitude": 1029.0, "valid_from": "2001-06-26T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "8989076", "group_id": null, "name": "KLAGENFURT/HTL1-LASTENSTRASSE", "state": "Kärnten", "lat": 46.61944444444445, "lon": 14.316666666666666, "altitude": 441.0, "valid_from": "2021-01-14T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11333", "group_id": null, "name": "HOHENAU", "state": "Niederösterreich", "lat": 48.60583333333334, "lon": 16.913055555555555, "altitude": 151.0, "valid_from": "2007-03-30T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true }, { "type": "INDIVIDUAL", "id": "11347", "group_id": null, "name": "MICHELDORF", "state": "Oberösterreich", "lat": 47.88305555555556, "lon": 14.134444444444444, "altitude": 443.0, "valid_from": "2008-04-02T00:00+00:00", "valid_to": "2023-12-15T10:26+00:00", "has_sunshine": false, "has_global_radiation": false, "is_active": true } ], "id_type": "Synop" } killer0071234-python-zamg-9372ace/tests/data_station.json000066400000000000000000000036721455045704700231610ustar00rootroot00000000000000{ "media_type": "application/json", "type": "FeatureCollection", "version": "v1", "timestamps": ["2022-11-13T10:20+00:00"], "features": [ { "type": "Feature", "geometry": { "type": "Point", "coordinates": [15.44, 46.980555555555554] }, "properties": { "parameters": { "TL": { "name": "Lufttemperatur", "unit": "°C", "data": [8.6] }, "P": { "name": "Luftdruck", "unit": "hPa", "data": [987.3] }, "PRED": { "name": "Reduzierter Luftdruck", "unit": "hPa", "data": [1031.4] }, "RFAM": { "name": "Relative Feuchte arithmetisches Mittel", "unit": "%", "data": [null] }, "FFAM": { "name": "Arithmetisches Mittel der Windgeschwindigkeit", "unit": "m/s", "data": [null] }, "DD": { "name": "Windrichtung", "unit": "°", "data": [160.0] }, "FFX": { "name": "Windspitze", "unit": "m/s", "data": [3.1] }, "DDX": { "name": "Windrichtung der Windspitze", "unit": "°", "data": [null] }, "SO": { "name": "Sonnenscheindauer", "unit": "sec", "data": [599.0] }, "TLAM": { "name": "Lufttempertur arithmetisches Mittel", "unit": "°C", "data": [null] }, "RR": { "name": "Niederschlag der letzten 10 Minuten", "unit": "mm", "data": [0.0] }, "SCHNEE": { "name": "Schneehöhe", "unit": "cm", "data": [0.0] }, "TP": { "name": "Taupunktstemperatur gemessen", "unit": "°C", "data": [6.5] }, "TPAM": { "name": "Taupunkt arithmetisches Mittel", "unit": "°C", "data": [null] } }, "station": "11240" } } ] } killer0071234-python-zamg-9372ace/tests/test_zamg.py000066400000000000000000000226471455045704700221660ustar00rootroot00000000000000"""Tests GeoSphere Austria.""" import json import pathlib import zoneinfo from datetime import datetime import aiohttp import pytest from aiohttp.client_exceptions import ClientConnectorError from src.zamg.exceptions import ZamgApiError from src.zamg.exceptions import ZamgNoDataError from src.zamg.exceptions import ZamgStationNotFoundError from src.zamg.exceptions import ZamgStationUnknownError from src.zamg.zamg import ZamgData @pytest.mark.asyncio async def test_update(fix_data, fix_metadata) -> None: """Test update function.""" zamg = ZamgData() zamg.set_default_station("11240") await zamg.update() # picking few values to compare assert zamg.get_data("TL") == 8.6 assert zamg.get_data("P") == 987.3 @pytest.mark.asyncio async def test_update_twice(fix_data, fix_metadata) -> None: """Test update function with short interval.""" zamg = ZamgData() zamg.set_default_station("11240") await zamg.update() zamg._timestamp = ( datetime.utcnow() .replace(tzinfo=zoneinfo.ZoneInfo("UTC")) .strftime("%Y-%m-%dT%H:%M%z") ) await zamg.update() # picking few values to compare assert zamg.get_data("TL") == 8.6 assert zamg.get_data("P") == 987.3 @pytest.mark.asyncio async def test_update_aenter(fix_data, fix_metadata) -> None: """Test update function.""" async with ZamgData(session=aiohttp.client.ClientSession()) as zamg: zamg.set_default_station("11240") zamg._close_session = True @pytest.mark.asyncio async def test_update_aenter_session(fix_data, fix_metadata) -> None: """Test update function.""" async with ZamgData() as zamg: zamg.set_default_station("11240") @pytest.mark.asyncio async def test_update_fixed_param(fix_data) -> None: """Test update function.""" zamg = ZamgData() zamg.set_default_station("11240") zamg.set_parameters(["P"]) await zamg.update() assert zamg.get_data("P") == 987.3 @pytest.mark.asyncio async def test_update_fail(aresponses) -> None: """Test update function.""" aresponses.add( "dataset.api.hub.geosphere.at", "/v1/station/current/tawes-v1-10min", "GET", aresponses.Response(text="error", status=500), ) zamg = ZamgData() zamg.set_default_station("11240") zamg.set_parameters(["P"]) with pytest.raises(ZamgApiError): await zamg.update() @pytest.mark.asyncio async def test_update_fail_1(aresponses) -> None: """Test update function.""" aresponses.add( "dataset.api.hub.geosphere.at", "/v1/station/current/tawes-v1-10min", "GET", aresponses.Response(text="error", status=500), ) zamg = ZamgData(session=aiohttp.client.ClientSession()) zamg.set_default_station("11240") zamg.set_parameters(["P"]) with pytest.raises(ZamgApiError): await zamg.update() @pytest.mark.asyncio async def test_update_fail_2(aresponses) -> None: """Test update function.""" aresponses.add( "dataset.api.hub.geosphere.at", "/v1/station/current/tawes-v1-10min", "GET", aresponses.Response(text="{}", status=200), ) zamg = ZamgData(session=aiohttp.client.ClientSession()) zamg.set_default_station("11240") zamg.set_parameters(["P"]) with pytest.raises(ZamgNoDataError): await zamg.update() @pytest.mark.asyncio async def test_update_fail_3(aresponses) -> None: """Test update function.""" aresponses.add( "dataset.api.hub.geosphere.at", "/v1/station/current/tawes-v1-10min", "GET", aresponses.Response(text="{}", status=200), ) zamg = ZamgData(session=aiohttp.client.ClientSession()) zamg.set_default_station("11240") with pytest.raises(ZamgApiError): await zamg.update() @pytest.mark.asyncio async def test_properties(fix_metadata) -> None: """Test getting properties.""" zamg = ZamgData() await zamg.zamg_stations() stations = await zamg.zamg_stations() # check that we get at least one correct station assert stations.get("11240") == ( 46.980555555555554, 15.44, "GRAZ-THALERHOF-FLUGHAFEN", ) @pytest.mark.asyncio async def test_properties_pre_loaded(fix_metadata) -> None: """Test getting properties.""" zamg = ZamgData() zamg.set_parameters(["TL"]) await zamg.zamg_stations() stations = await zamg.zamg_stations() # check that we get at least one correct station assert stations.get("11240") == ( 46.980555555555554, 15.44, "GRAZ-THALERHOF-FLUGHAFEN", ) @pytest.mark.asyncio async def test_properties_fail_1(aresponses) -> None: """Test getting properties.""" aresponses.add( "dataset.api.hub.geosphere.at", "/v1/station/current/tawes-v1-10min/metadata", "GET", response=aresponses.Response(text="", status=404), ) zamg = ZamgData(session=aiohttp.client.ClientSession()) stations = await zamg.zamg_stations() assert stations is None @pytest.mark.asyncio async def test_properties_fail_2(aresponses) -> None: """Test getting properties.""" aresponses.side_effect = ClientConnectorError zamg = ZamgData(session=aiohttp.client.ClientSession()) with pytest.raises(ZamgApiError): await zamg.zamg_stations() @pytest.mark.asyncio async def test_properties_fail_3(aresponses) -> None: """Test getting properties.""" aresponses.add( "dataset.api.hub.geosphere.at", "/v1/station/current/tawes-v1-10min/metadata", "GET", response=aresponses.Response(text=""), ) zamg = ZamgData(session=aiohttp.client.ClientSession()) with pytest.raises(ZamgNoDataError): await zamg.zamg_stations() @pytest.mark.asyncio async def test_properties_fail_4(fix_metadata) -> None: """Test getting properties.""" zamg = ZamgData() await zamg.zamg_stations() with pytest.raises(ZamgNoDataError): zamg.get_data("not_in_list") def test_get_all_parameters_empty() -> None: """Test getting get_all_parameters is empty.""" zamg = ZamgData() assert zamg.get_all_parameters() == {} def test_get_parameters_empty() -> None: """Test getting get_parameters is empty.""" zamg = ZamgData() assert zamg.get_parameters() == {} @pytest.mark.asyncio async def test_get_all_parameters(fix_metadata) -> None: """Test getting get_all_parameters.""" zamg = ZamgData() await zamg.zamg_stations() params = zamg.get_all_parameters() in_list = False if "TL" in params: in_list = True assert in_list is True @pytest.mark.asyncio async def test_get_parameters(fix_metadata) -> None: """Test getting get_parameters.""" zamg = ZamgData() await zamg.zamg_stations() params = zamg.get_parameters() in_list = False if "TL" in params: in_list = True assert in_list is True @pytest.mark.asyncio async def test_closest_station(fix_metadata) -> None: """Test getting closest station.""" zamg = ZamgData() station = await zamg.closest_station(46.9, 15.4) assert station == "11240" @pytest.mark.asyncio async def test_closest_station_not_found(aresponses) -> None: """Test getting closest station.""" aresponses.add( "dataset.api.hub.geosphere.at", "/v1/station/current/tawes-v1-10min/metadata", "GET", response={"title": "TAWES", "stations": []}, ) zamg = ZamgData() with pytest.raises(ZamgStationNotFoundError): await zamg.closest_station(46.9, 15.4) @pytest.mark.asyncio async def test_get_station_name(fix_metadata) -> None: """Test getting get_station_name.""" zamg = ZamgData() await zamg.zamg_stations() zamg.set_default_station("11240") assert zamg.get_station_name == "GRAZ-THALERHOF-FLUGHAFEN" @pytest.mark.asyncio async def test_get_station_name_unknown(fix_metadata) -> None: """Test getting get_station_name.""" zamg = ZamgData() await zamg.zamg_stations() with pytest.raises(ZamgStationUnknownError): _ = zamg.get_station_name @pytest.mark.asyncio async def test_last_update(fix_data, fix_metadata) -> None: """Test getting last_update.""" zamg = ZamgData() zamg.set_default_station("11240") await zamg.update() assert zamg.last_update == datetime( 2022, 11, 13, 10, 20, tzinfo=zoneinfo.ZoneInfo(key="UTC") ) @pytest.mark.asyncio async def test_update_no_station(fix_data, fix_metadata) -> None: """Test getting update.""" zamg = ZamgData() data = await zamg.update() assert data is None def test_last_update_unknown() -> None: """Test getting last_update.""" zamg = ZamgData() update = zamg.last_update assert update is None @pytest.fixture def fix_metadata(aresponses): """Fixture to get metadata.""" data_metadata = json.loads( pathlib.Path(__file__) .parent.joinpath("data_metadata.json") .read_text(encoding="utf-8") ) aresponses.add( "dataset.api.hub.geosphere.at", "/v1/station/current/tawes-v1-10min/metadata", "GET", response=data_metadata, ) @pytest.fixture def fix_data(aresponses): """Fixture to get data of a station.""" data_station = json.loads( pathlib.Path(__file__) .parent.joinpath("data_station.json") .read_text(encoding="utf-8") ) aresponses.add( "dataset.api.hub.geosphere.at", "/v1/station/current/tawes-v1-10min", "GET", response=data_station, )