[
  {
    "path": ".devcontainer.json",
    "content": "{\n  \"name\": \"renenulschde/dev-mbapi2020\",\n  \"image\": \"mcr.microsoft.com/devcontainers/python:1-3.12\",\n  \"postCreateCommand\": \"scripts/setup\",\n  \"appPort\": [\n    \"9123:8123\"\n  ],\n  \"portsAttributes\": {\n    \"8123\": {\n      \"label\": \"Home Assistant internal\",\n      \"onAutoForward\": \"notify\"\n    },\n    \"9123\": {\n      \"label\": \"Home Assistant remote\",\n      \"onAutoForward\": \"notify\"\n    }\n  },\n  \"customizations\": {\n    \"vscode\": {\n      \"extensions\": [\n        \"ms-python.python\",\n        \"github.vscode-pull-request-github\",\n        \"ryanluker.vscode-coverage-gutters\",\n        \"ms-python.vscode-pylance\",\n        \"ms-python.pylint\",\n        \"charliermarsh.ruff\"\n      ],\n      \"settings\": {\n        \"files.eol\": \"\\n\",\n        \"editor.tabSize\": 4,\n        \"python.pythonPath\": \"/usr/bin/python3\",\n        \"python.analysis.autoSearchPaths\": false,\n        \"[python]\": {\n          \"editor.defaultFormatter\": \"charliermarsh.ruff\",\n          \"editor.formatOnSave\": true\n        },\n        \"editor.formatOnPaste\": false,\n        \"editor.formatOnSave\": true,\n        \"editor.formatOnType\": true,\n        \"files.trimTrailingWhitespace\": true,\n        \"[markdown]\": {\n          \"files.trimTrailingWhitespace\": false\n        },\n        \"terminal.integrated.defaultProfile.linux\": \"zsh\"\n      }\n    }\n  },\n  \"remoteUser\": \"vscode\",\n  \"features\": {\n    \"ghcr.io/devcontainers/features/rust:1\": {},\n    \"ghcr.io/devcontainers-extra/features/ffmpeg-apt-get:1\": {}\n  }\n}"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: ReneNulschDE\nbuy_me_a_coffee: renenulsch\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: Report an issue with MBAPI2020\ndescription: Report an issue with Mercedes ME integration.\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        This issue form is for reporting bugs only!\n\n        If you have a feature or enhancement request, please use the  [Forum][fr].\n\n        [fr]: https://community.home-assistant.io/t/mercedes-me-component/41911\n  - type: textarea\n    validations:\n      required: true\n    attributes:\n      label: The problem\n      description: >-\n        Describe the issue you are experiencing here, to communicate to the\n        maintainers. Tell us what you were trying to do and what happened.\n\n        Provide a clear and concise description of what the problem is.\n  - type: markdown\n    attributes:\n      value: |\n        ## Environment\n  - type: input\n    id: version\n    validations:\n      required: true\n    attributes:\n      label: What version of MBAPI2020 do use?\n      placeholder: v0.xx.x\n      description: >\n        Can be found in: [Settings ⇒ System ⇒ Repairs ⇒ Three Dots in Upper Right ⇒ System information](https://my.home-assistant.io/redirect/system_health/).\n\n        [![Open your Home Assistant instance and show the system information.](https://my.home-assistant.io/badges/system_health.svg)](https://my.home-assistant.io/redirect/system_health/)\n  - type: input\n    attributes:\n      label: What was the last working version of MBAPI2020?\n      placeholder: v0.xx.x\n      description: >\n        If known, otherwise leave blank.\n  - type: dropdown\n    validations:\n      required: true\n    attributes:\n      label: What type of installation are you running?\n      description: >\n        Can be found in: [Settings ⇒ System ⇒ Repairs ⇒ Three Dots in Upper Right ⇒ System information](https://my.home-assistant.io/redirect/system_health/).\n\n        [![Open your Home Assistant instance and show the system information.](https://my.home-assistant.io/badges/system_health.svg)](https://my.home-assistant.io/redirect/system_health/)\n      options:\n        - Home Assistant OS\n        - Home Assistant Container\n        - Home Assistant Supervised\n        - Home Assistant Core\n  - type: markdown\n    attributes:\n      value: |\n        # Details\n  - type: textarea\n    attributes:\n      label: Diagnostics information\n      placeholder: \"drag-and-drop the diagnostics data file here (do not copy-and-paste the content)\"\n      description: >-\n        The MBAPI2020 integration provides the ability to [download diagnostic data](https://www.home-assistant.io/docs/configuration/troubleshooting/#download-diagnostics).\n\n        **It would really help if you could download the diagnostics data for the account/hub you are having issues with,\n        and <ins>drag-and-drop that file into the textbox below.</ins>**\n\n        It generally allows pinpointing defects and thus resolving issues faster.\n  - type: textarea\n    attributes:\n      label: Example YAML snippet\n      description: |\n        If applicable, please provide an example piece of YAML that can help reproduce this problem.\n        This can be from an automation, script, scene or configuration.\n      render: yaml\n  - type: textarea\n    attributes:\n      label: Anything in the logs that might be useful for us?\n      description: For example, error message, or stack traces.\n      render: txt\n  - type: textarea\n    attributes:\n      label: Additional information\n      description: >\n        If you have any additional information for us, use the field below.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Feature Request or other questions\n    url: https://community.home-assistant.io/t/mercedes-me-component/41911\n    about: Please use our Community Forum for making feature requests or asking general questions.\n  - name: I'm unsure where to go\n    url: https://community.home-assistant.io/t/mercedes-me-component/41911\n    about: If you are unsure where to go, then joining and searching in the Forum is a good start.\n"
  },
  {
    "path": ".github/dependabot.yaml",
    "content": "version: 2\nupdates:\n- package-ecosystem: pip\n  directory: \"/\"\n  schedule:\n    interval: daily\n    time: \"04:00\"\n  reviewers:\n  - ReneNulschDE\n  assignees:\n  - ReneNulschDE\n  labels:\n  - dependencies"
  },
  {
    "path": ".github/workflows/HACS_validate.yaml",
    "content": "name: Validate with HACS\n\non:\n  push:\n  pull_request:\n  schedule:\n    - cron: \"0 0 * * *\"\n\njobs:\n  validate:\n    runs-on: \"ubuntu-latest\"\n    steps:\n      - uses: \"actions/checkout@v4\"\n      - name: HACS validation\n        uses: \"hacs/action@main\"\n        with:\n          category: \"integration\"\n"
  },
  {
    "path": ".github/workflows/hassfest.yaml",
    "content": "name: Validate with hassfest\n\non:\n  push:\n  pull_request:\n  schedule:\n    - cron: \"0 0 * * *\"\n\njobs:\n  validate:\n    runs-on: \"ubuntu-latest\"\n    steps:\n      - uses: \"actions/checkout@v4\"\n      - uses: home-assistant/actions/hassfest@master\n"
  },
  {
    "path": ".github/workflows/publish.yaml",
    "content": "name: Publish Workflow\n\non:\n  release:\n    types:\n      - published\n\njobs:\n  release:\n    name: Release\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout the repository\n        uses: actions/checkout@v4\n      - name: Get integration information\n        id: information\n        run: |\n          name=$(find custom_components/ -type d -maxdepth 1 | tail -n 1 | cut -d \"/\" -f2)\n          echo \"name=$name\" >> $GITHUB_OUTPUT\n      - name: Adjust version number\n        if: ${{ github.event_name == 'release' }}\n        shell: bash\n        env:\n          TAG_NAME: ${{ github.event.release.tag_name }}\n        run: |\n          yq -i -o json \".version=\\\"$TAG_NAME\\\"\" \\\n            \"${{ github.workspace }}/custom_components/${{ steps.information.outputs.name }}/manifest.json\"\n      - name: Create zip file for the integration\n        shell: bash\n        run: |\n          cd \"${{ github.workspace }}/custom_components/${{ steps.information.outputs.name }}\"\n          zip ${{ steps.information.outputs.name }}.zip -r ./\n      - name: Upload the zipfile as a release asset\n        uses: softprops/action-gh-release@v2\n        if: ${{ github.event_name == 'release' }}\n        with:\n          files: ${{ github.workspace }}/custom_components/${{ steps.information.outputs.name }}/${{ steps.information.outputs.name }}.zip\n          tag_name: ${{ github.event.release.tag_name }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n.hypothesis/\n.pytest_cache/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# pyenv\n.python-version\n\n# celery beat schedule file\ncelerybeat-schedule\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n\n\nsec_*.txt\n.vscode/\n/custom_components/mbapi2020/messages/*\n\n/custom_components/mbapi2020/resources*\n/local\n\nbin/\nobj/\n.DS_Store\n*.csproj.user\n[Tt]humbs.db\n.ruff_cache\n.claude/settings.local.json"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "repos:\n  - repo: https://github.com/astral-sh/ruff-pre-commit\n    rev: v0.14.5\n    hooks:\n#      - id: ruff\n#        args:\n#          - --fix\n      - id: ruff-format\n        files: ^((custom_components/mbapi2020|pylint|script|tests|simulator)/.+)?[^/]+\\.py$\n  - repo: https://github.com/adrienverge/yamllint.git\n    rev: v1.37.1\n    hooks:\n      - id: yamllint\n  - repo: https://github.com/cdce8p/python-typing-update\n    rev: v0.8.1\n    hooks:\n      # Run `python-typing-update` hook manually from time to time\n      # to update python typing syntax.\n      # Will require manual work, before submitting changes!\n      # pre-commit run --hook-stage manual python-typing-update --all-files\n      - id: python-typing-update\n        stages: [manual]\n        args:\n          - --py313-plus\n          - --force\n          - --keep-updates\n        files: ^(custom_components/ha-mysmartbike|tests|script|simulator)/.+\\.py$\n  - repo: local\n    hooks:\n      - id: const-check-proxy-not-disabled\n        name: const-check-proxy-not-disabled\n        entry: \"USE_PROXY = True\"\n        language: pygrep\n        types: [python]\n      - id: const-check-ssl-check-not-correct\n        name: const-check-ssl-check-not-correct\n        entry: \"VERIFY_SSL = False\"\n        language: pygrep\n        types: [python]\n"
  },
  {
    "path": ".yamllint.yaml",
    "content": "extends: default\n\nrules:\n  # 120 chars should be enough, but don't fail if a line is longer\n  line-length:\n    max: 120\n    level: warning\n"
  },
  {
    "path": "CLAUDE.md",
    "content": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nHome Assistant custom component integration for Mercedes-Benz vehicles. Connects to Mercedes-Benz API via OAuth2 and WebSocket to monitor and control vehicle features (charging, locks, preconditioning, etc.).\n\n**Python:** 3.13 | **Home Assistant:** >= 2024.02.0 | **Domain:** `mbapi2020`\n\n## Development Commands\n\n```bash\n# Setup development environment (installs dependencies + pre-commit hooks)\nscripts/setup\n\n# Run ruff formatter\nruff format custom_components/mbapi2020\n\n# Run ruff linter\nruff check custom_components/mbapi2020\n\n# Run pylint on integration\npylint custom_components/mbapi2020\n\n# Validate Home Assistant manifest\n# (done via GitHub Actions: hassfest.yaml, HACS_validate.yaml)\n```\n\n## Code Style\n\n- **Line length:** 120 characters\n- **Formatter:** Ruff (v0.6.8+)\n- **Linting:** Ruff and PyLint\n- **Type checking:** MyPy (Python 3.13)\n- **Import alias conventions:** `voluptuous` as `vol`, `homeassistant.helpers.config_validation` as `cv`\n- Pre-commit hooks enforce formatting and check that `USE_PROXY = True` and `VERIFY_SSL = False` are not committed\n\n## Architecture\n\n### Core Files\n\n| File | Purpose |\n|------|---------|\n| `custom_components/mbapi2020/__init__.py` | Integration setup, async_setup_entry |\n| `client.py` | Main API client - OAuth2, WebSocket, command handling |\n| `car.py` | Vehicle data model with nested components (Tires, Doors, Windows, Electric, Auxheat, Precond) |\n| `coordinator.py` | Home Assistant DataUpdateCoordinator |\n| `oauth.py` | OAuth2 authentication with token caching |\n| `websocket.py` | Real-time updates via WebSocket |\n| `webapi.py` | REST API wrapper for general queries |\n| `const.py` | All constants, enums, and sensor definitions |\n\n### Entity Types\n\nEach entity type has its own file: `sensor.py`, `binary_sensor.py`, `lock.py`, `switch.py`, `button.py`, `device_tracker.py`\n\nAll entities extend `MercedesMeEntity` base class and use the coordinator pattern.\n\n### Protocol Buffers\n\nThe `proto/` directory contains auto-generated Python files from `.proto` definitions. Do not edit these files directly.\n\n### Data Flow\n\n1. `oauth.py` handles authentication and token refresh\n2. `client.py` establishes WebSocket connection for real-time updates\n3. `coordinator.py` manages data updates and distributes to entities\n4. Vehicle state stored in `Car` objects with nested component classes\n\n## Home Assistant Patterns\n\n### Async Programming\n- All external I/O operations must be async\n- Use `asyncio.gather()` instead of awaiting in loops\n- Use `hass.async_add_executor_job()` for blocking operations\n- Use `asyncio.sleep()` instead of `time.sleep()`\n- Use `@callback` decorator for event loop safe functions\n\n### Error Handling\n- `ConfigEntryNotReady`: Temporary setup issues (device offline, timeout)\n- `ConfigEntryAuthFailed`: Authentication problems\n- `ConfigEntryError`: Permanent setup issues\n- `ServiceValidationError`: User input errors\n- Keep try blocks minimal - process data after the try/catch\n- Bare exceptions allowed only in config flows and background tasks\n\n### Logging Guidelines\n- No periods at end of messages\n- No integration names/domains (added automatically)\n- No sensitive data (keys, tokens, passwords)\n- Use lazy logging: `_LOGGER.debug(\"Message with %s\", variable)`\n- Use debug level for non-user-facing messages\n\n### Documentation\n- File headers: `\"\"\"Integration for Mercedes-Benz vehicles.\"\"\"`\n- All functions/methods require docstrings\n- American English, sentence case\n\n## Key Patterns\n\n- Config entries for per-account configuration\n- Services defined in `services.yaml` with implementations in `services.py`\n- PIN required for secured commands (locks, windows, engine start)\n- Capability checking enabled by default (can be disabled for North America)\n- Entity names use `_attr_translation_key` for translations\n\n## Region Notes\n\n- Tested regions: EU, NA, AU, and others (see README)\n- Thailand/India: Use \"Europe\" region\n- China: Currently not working\n- North America: Cars 2019 or newer only; may need capability check disabled\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 Rene Nulsch\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n// Protocol Buffers for Go with Gadgets\n//\n// Copyright (c) 2013, The GoGo Authors. All rights reserved.\n// http://github.com/gogo/protobuf\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nMIT License\n\nCopyright (c) 2019 MBition GmbH\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "README.md",
    "content": "# \"Mercedes-Benz\" custom component\n\n![HassFest tests](https://github.com/renenulschde/mbapi2020/workflows/Validate%20with%20hassfest/badge.svg) ![Validate with HACS](https://github.com/ReneNulschDE/mbapi2020/workflows/Validate%20with%20HACS/badge.svg) ![](https://img.shields.io/github/downloads/renenulschde/mbapi2020/total) ![](https://img.shields.io/github/downloads/renenulschde/mbapi2020/latest/total)\n\nMercedes-Benz platform as a Custom Component for Home Assistant.\n\n\n> ⚠️ **SEEKING NEW MAINTAINER** ⚠️  \n> After 8+ years of development, I'm selling my last Mercedes and can no longer maintain this integration effectively. **[Looking for someone to take over →](https://github.com/ReneNulschDE/mbapi2020/issues/372)**  \n\n\n\nIMPORTANT:\n\n- Please login once into the Mercedes-Benz IOS or Android app before you install this component. (For North America, the app name is Mercedes Me Connect)\n\n- Tested Countries: AT, AU, BE, CA, CH, ~~CN~~, DE, DK, ES, FI, FR, IN, IT, IR, NL, NO, NZ, PT, RO, SE, TH, UK, US\n\n- North America: For Cars built 2019 or newer only\n- Thailand, India: Please use the region \"Europe\".\n- Mexico, Brazil,...: Please use the region \"APAC\"\n- China: Is not working currently (captcha).\n- Smart cars data are not available after 2025-01-06\n- Discussions, Feature Requests via [HA-Community Forum](https://community.home-assistant.io/t/mercedes-me-component/41911)\n\n### Installation\n\n- First: This is not a Home Assistant Add-On. It's a custom component.\n- There are two ways to install. First you can download the folder custom_component and copy it into your Home-Assistant config folder. Second option is to install HACS (Home Assistant Custom Component Store) and select \"MercedesME 2020\" from the Integrations catalog.\n- [How to install a custom component?](https://www.google.com/search?q=how+to+install+custom+components+home+assistant)\n- [How to install HACS?](https://hacs.xyz/docs/use/)\n- Restart HA after the installation\n- Make sure that you refresh your browser window too\n- Use the \"Add Integration\" in Home Assistant, Settings, Devices & Services and select \"MercedesME 2020\".\n- Enter your Mercedes-Benz account credentials (username/password) in the integration setup\n  **Important Notes:**\n- consider using a dedicated Mercedes-Benz account for Home Assistant\n- if MFA is enabled on your Mercedes-Benz account, authentication will fail. You must disable MFA or use a separate account without MFA.\n\n\n### How to Prevent Account Blocking\n\nTo reduce the risk of your account being blocked, please follow these recommendations:\n\n1. **Create a separate MB user account for use with this component.**\n2. **Invite the new user to the vehicle:**  \n   The primary user of the vehicle can invite the new HA-MB account to access the vehicle. Up to six additional users can be invited to each vehicle.\n3. **Use each account in a single environment only:**  \n   Use one account exclusively in HA or in the official MB tools, but never in both simultaneously.\n\n#### Important Notes\n\n- Certain features, such as geofencing data, are available only to the primary user.\n- If geofencing is required in your HA environment, use the primary user account in HA and the secondary accounts in the official MB apps.\n\n---\n\n### Optional configuration values\n\nSee Options dialog in the Integration under Home-Assistant/Configuration/Integration.\n\n```\nExcluded Cars: comma-separated list of VINs.\nPIN: Security PIN to execute special services. Please use your MB mobile app to setup\nDisable Capability Check: By default the component checks the capabilities of a car. Active this option to disable the capability check. (For North America)\nDebug Save Messages: Enable this option to save all relevant received message into the messages folder of the component\n```\n\n## Available components\n\nDepends on your own car or purchased Mercedes-Benz licenses.\n\n### Binary Sensors\n\n- warningwashwater\n\n- warningcoolantlevellow\n\n- warningbrakefluid\n\n- warningenginelight\n\n  ```\n  attributes:\n  warningbrakefluid, warningwashwater, warningcoolantlevellow, warninglowbattery\n  ```\n\n- parkbrakestatus\n\n  ```\n  attributes:\n  preWarningBrakeLiningWear\n  ```\n\n- theftsystemarmed\n\n  ```\n  attributes:\n  carAlarmLastTime, carAlarmReason, collisionAlarmTimestamp, interiorSensor, interiorProtectionStatus, interiorMonitoringLastEvent, interiorMonitoringStatus, exteriorMonitoringLastEvent, exteriorMonitoringStatus, lastParkEvent, lastTheftWarning, lastTheftWarningReason, parkEventLevel, parkEventType, theftAlarmActive, towProtectionSensorStatus, towSensor,\n  ```\n\n- tirewarninglamp\n\n  ```\n  attributes:\n  tireMarkerFrontRight, tireMarkerFrontLeft,tireMarkerRearLeft, tireMarkerRearRight, tirewarningsrdk, tirewarningsprw, tireTemperatureRearLeft, tireTemperatureFrontRight,\n  tireTemperatureRearRight, tireTemperatureFrontLeft\n  ```\n\n- windowsClosed\n\n  ```\n  attributes:\n  windowstatusrearleft, windowstatusrearright, windowstatusfrontright, windowstatusfrontleft\n  ```\n\n- remoteStartActive\n\n  ```\n  attributes:\n  remoteStartTemperature\n  ```\n\n- engineState\n\n- chargeFlapACStatus\n\n- Preclimate Status (Preconditioning)\n\n  ```\n  attributes:\n  precondState, precondActive, precondError, precondNow, precondNowError, precondDuration, precondatdeparture, precondAtDepartureDisable, precondSeatFrontLeft, precondSeatFrontRight, precondSeatRearLeft, precondSeatRearRight, temperature_points_frontLeft, temperature_points_frontRight, temperature_points_rearLeft, temperature_points_rearRight,\n\n  ```\n\n- wiperHealth\n\n  ```\n  attributes:\n  wiperLifetimeExceeded\n  ```\n\n### Buttons\n\n- Flash light\n- Preclimate start\n- Preclimate stop\n\n### Device Tracker\n\n```\nattributes:\npositionHeading\n```\n\n### Locks\n\n- lock\n\n  PIN setup in MB App is required. If the pin is not set in the integration options then the lock asks for the PIN.\n\n### Sensors\n\n- lock\n\n  ```\n  attributes:\n  decklidstatus, doorStatusOverall, doorLockStatusOverall, doorlockstatusgas, doorlockstatusvehicle, doorlockstatusfrontleft,doorlockstatusfrontright, doorlockstatusrearright, doorlockstatusrearleft, doorlockstatusdecklid, doorstatusrearleft, doorstatusfrontright, doorstatusrearright, doorstatusfrontleft, rooftopstatus, sunroofstatus, engineHoodStatus\n  ```\n\n  Internal value: doorlockstatusvehicle\n\n  Values:\n  0: vehicle unlocked\n  1: vehicle internal locked\n  2: vehicle external locked\n  3: vehicle selective unlocked\n\n- Fuel Level (%)\n\n  ```\n  attributes:\n  tankLevelAdBlue\n  ```\n\n- Geofencing Violation\n\n  ```\n  attributes:\n  Last_event_zone\n  ```\n\n  Values:\n  ENTER\n  LEAVE\n\n- odometer\n\n  ```\n  attributes:\n  distanceReset, distanceStart, averageSpeedReset, averageSpeedStart, distanceZEReset, drivenTimeZEReset, drivenTimeReset, drivenTimeStart, ecoscoretotal, ecoscorefreewhl, ecoscorebonusrange, ecoscoreconst, ecoscoreaccel, gasconsumptionstart, gasconsumptionreset, gasTankRange, gasTankLevel, liquidconsumptionstart, liquidconsumptionreset, liquidRangeSkipIndication, rangeliquid, serviceintervaldays, tanklevelpercent, tankReserveLamp, batteryState, tankLevelAdBlue\n  ```\n\n- Oil Level (%)\n\n- Range Electric\n\n  ```\n  attributes:\n  chargingstatus, distanceElectricalReset, distanceElectricalStart, ecoElectricBatteryTemperature, endofchargetime, maxrange, selectedChargeProgram, precondActive [DEPRECATED], precondNow [DEPRECATED], precondDuration [DEPRECATED]\n\n  ```\n\n- Electric consumption start\n\n- Electric consumption reset\n\n- Charging power\n\n- Charging Power Limit\n\n  ```\n  attributes:\n  chargingPowerRestriction\n  ```\n\n- Starter Battery State\n\n  ```\n  Internal Name: starterBatteryState\n\n  Values     Description_short     Description_long\n  \"0\"        \"green\"               \"Vehicle ok\"\n  \"1\"        \"yellow\"              \"Battery partly charged\"\n  \"2\"        \"red\"                 \"Vehicle not available\"\n  \"3\"        \"serviceDisabled\"     \"Remote service disabled\"\n  \"4\"        \"vehicleNotAvalable\"  \"Vehicle no longer available\"\n  ```\n\n- tirepressureRearLeft\n\n- tirepressureRearRight\n\n- tirepressureFrontRight\n\n- tirepressureFrontLeft\n\n- State of Charge (soc)\n\n  ```\n  Internal Name: soc\n\n  State of charge (SoC) is the level of charge of an electric battery relative to its capacity. The units of SoC are percentage points (0% = empty; 100% = full).\n\n  attributes:\n  maxSocLowerLimit, maxSoc\n\n  ```\n\n- Ignition state\n\n  ```\n  Internal Name: ignitionstate\n\n  Values     Description_short     Description_long\n  \"0\"        \"lock\"                \"Ignition lock\"\n  \"1\"        \"off\"                 \"Ignition off\"\n  \"2\"        \"accessory\"           \"Ignition accessory\"\n  \"4\"        \"on\"                  \"Ignition on\"\n  \"5\"        \"start\"               \"Ignition start\"\n  ```\n\n- Aux Heat Status\n\n  ```\n  Internal Name: auxheatstatus\n\n  Values    Description\n  \"0\"       inactive\n  \"1\"       normal heating\n  \"2\"       normal ventilation\n  \"3\"       manual heating\n  \"4\"       post heating\n  \"5\"       post ventilation\n  \"6\"       auto heating\n\n  attributes:\n  auxheattime1, auxheattime2, auxheattime3, auxheattimeselection, auxheatActive, auxheatwarnings, auxheattime2, temperature_points_frontLeft, temperature_points_frontRight\n\n  ```\n\n- Departure Time\n\n  ```\n  Internal Name: departuretime\n\n  Planned departure time to initiate preclimate functions\n\n  attributes:\n  departureTimeWeekday\n\n  ```\n\n### Diagnostic Sensors\n\n[Diagnostic sensors](https://www.home-assistant.io/blog/2021/11/03/release-202111/#entity-categorization) are hidden by default, check the devices page to see the current values\n\n- Car\n\n  ```\n  attributes:\n  full_update_messages_received, partital_update_messages_received, last_message_received, last_command_type, last_command_state, last_command_error_code, last_command_error_message\n  ```\n\n- RCP_Features\n\n  Sensor shows true if extended configuration like interior lighting is available. This feature requires a reauthentication in case you used a version <0.6 before (We need some more permissions...). Shows False in case reauthentication has not happened or the feature is not available for your car.\n\n  ```\n  attributes:\n  rcp_supported_settings (List of all remote configuration options, I'll implement them step by step as services or buttons)\n  ```\n\n### Services\n\nSome services require that the security PIN is created in your mobile Android/IOS app. Please store the pin to the options-dialog of the integration\n\n- refresh_access_token:\n  Refresh the API access token\n\n- auxheat_start:\n  Start the auxiliary heating of a car defined by a vin.\n\n- auxheat_stop:\n  Stop the auxiliary heating of a car defined by a vin.\n\n- battery_max_soc_configure:\n  Configure the maximum value for the state of charge of the HV battery of a car defined by a vin.\n\n- doors_unlock:\n  Unlock a car defined by a vin. PIN required.\n\n- doors_lock:\n  Lock a car defined by a vin.\n\n- engine_start:\n  Start the engine of a car defined by a vin. PIN required.\n\n- engine_stop:\n  Stop the engine of a car defined by a vin.\n\n- preconditioning_configure_seats:\n  Configure which seats should be preconditioned of a car defined by a vin.\n\n- preheat_start:\n  Start the preheating of a zero emission car defined by a vin.\n\n- preheat_start_departure_time:\n  Start the preheating of a zero emission car defined by a vin and the departure time in minutes since midnight\n\n- preheat_stop:\n  Stop the preheating of a zero emission car defined by a vin.\n\n- preheat_stop_departure_time:\n  Disable scheduled departure preconditioning of a zero emission car defined by a vin.\n\n- preconditioning_configure:\n  Configure the departure time preconditioning mode (disabled, single, or weekly) of a zero emission car defined by a vin.\n\n- send_route:\n  Send a route to a car defined by a vin.\n\n- sigpos_start:\n  Start light signaling of a car defined by a vin.\n\n- sunroof_open:\n  Open the sunroof of a car defined by a vin. PIN required.\n\n- sunroof_tilt:\n  Tilt the sunroof of a car defined by a vin. PIN required.\n\n- sunroof_close:\n  Close the sunroof of a car defined by a vin.\n\n- temperature_configure:\n  Configure the target preconditioning/auxheat temperatures for zones in a car defined by a VIN.\n\n- windows_close:\n  Close the windows of a car defined by a vin.\n\n- windows_move\n  Move the windows to a given position. PIN required.\n\n- windows_open:\n  Open the windows of a car defined by a vin. PIN required.\n\n### Switches\n\n- AuxHeat - Start/Stop the auxiliary heating of the car\n- Preclimate - Start/Stop the preclimate function of the car\n\n### Logging\n\nSet the logging to debug with the following settings in case of problems.\n\n```\nlogger:\n  default: warn\n  logs:\n    custom_components.mbapi2020: debug\n```\n\n### Open Items\n\n- Find a maintainer\n\n### Useful links\n\n- [Forum post](https://community.home-assistant.io/t/mercedes-me-component/41911/520)\n\n## Custom Lovelace Card\n\nEnhance your experience with this integration by using [VEHICLE INFO CARD](https://github.com/ngocjohn/vehicle-info-card). This card is designed to work seamlessly with the integration, providing a beautiful and intuitive interface to display the data in your Home Assistant dashboard.\n\n### Key Features\n\n- **Seamless Integration**: Automatically pulls in data from the integration.\n- **Customizable**: Easily modify the card’s appearance to fit your theme.\n- **Interactive**: Includes controls to interact with the data directly from your dashboard.\n- **Multilingual Support**: The card includes various translations, making it accessible in multiple languages.\n\n[Check out the Custom Lovelace Card](https://github.com/ngocjohn/vehicle-info-card) for more details and installation instructions.\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nPlease send an email to [secure-mbapi2020@nulsch.de](mailto:secure-mbapi2020@nulsch.de). \n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email and keep in mind this project is the hobby of one person.\n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n  * Full paths of source file(s) related to the manifestation of the issue\n  * The location of the affected source code (tag/branch/commit or direct URL)\n  * Any special configuration required to reproduce the issue\n  * Step-by-step instructions to reproduce the issue\n  * Proof-of-concept or exploit code (if possible)\n  * Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help me triage your report more quickly.\n\nIf you are reporting for a bug bounty, then this is the wrong project. I do not have a bug bounty programm.\n\n## Preferred Languages\n\nI prefer all communications to be in English or German.\n"
  },
  {
    "path": "custom_components/mbapi2020/__init__.py",
    "content": "\"\"\"The MercedesME 2020 integration.\"\"\"\n\nfrom __future__ import annotations\n\nimport asyncio\nfrom collections.abc import Callable, Coroutine\nfrom dataclasses import dataclass\nfrom datetime import datetime\nimport time\nfrom typing import Any\n\nimport aiohttp\nimport voluptuous as vol\n\nfrom custom_components.mbapi2020.car import Car, CarAttribute, RcpOptions\nfrom custom_components.mbapi2020.const import (\n    ATTR_MB_MANUFACTURER,\n    CONF_ENABLE_CHINA_GCJ_02,\n    CONF_OVERWRITE_PRECONDNOW,\n    DOMAIN,\n    LOGGER,\n    LOGIN_BASE_URI,\n    MERCEDESME_COMPONENTS,\n    UNITS,\n    SensorConfigFields as scf,\n)\nfrom custom_components.mbapi2020.coordinator import MBAPI2020DataUpdateCoordinator\nfrom custom_components.mbapi2020.errors import WebsocketError\nfrom custom_components.mbapi2020.helper import LogHelper as loghelper\nfrom custom_components.mbapi2020.services import setup_services\nfrom homeassistant.config_entries import ConfigEntry\nfrom homeassistant.core import HomeAssistant, callback\nfrom homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryError, ConfigEntryNotReady\nfrom homeassistant.helpers import device_registry as dr\nfrom homeassistant.helpers.device_registry import DeviceInfo\nfrom homeassistant.helpers.entity import Entity, EntityDescription\nfrom homeassistant.helpers.typing import ConfigType\nfrom homeassistant.helpers.update_coordinator import CoordinatorEntity\nfrom homeassistant.util import slugify\n\nCONFIG_SCHEMA = vol.Schema({DOMAIN: vol.Schema({})}, extra=vol.ALLOW_EXTRA)\n\n\nasync def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:\n    \"\"\"Set up MBAPI2020.\"\"\"\n    LOGGER.debug(\"Start async_setup - Initializing services.\")\n    hass.data.setdefault(DOMAIN, {})\n    setup_services(hass)\n\n    return True\n\n\nasync def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry):\n    \"\"\"Set up MercedesME 2020 from a config entry.\"\"\"\n    LOGGER.debug(\"Start async_setup_entry.\")\n\n    try:\n        coordinator = MBAPI2020DataUpdateCoordinator(hass, config_entry)\n        hass.data.setdefault(DOMAIN, {})[config_entry.entry_id] = coordinator\n\n        await coordinator.client.set_rlock_mode()\n\n        try:\n            token_info = await coordinator.client.oauth.async_get_cached_token()\n        except aiohttp.ClientError as err:\n            LOGGER.warning(\"Can not connect to MB OAuth API %s. Will try again.\", LOGIN_BASE_URI)\n            LOGGER.debug(\"Can not connect to MB OAuth API %s. Will try again. %s\", LOGIN_BASE_URI, err)\n            raise ConfigEntryNotReady from err\n\n        if token_info is None:\n            LOGGER.error(\"Authentication failed. Please reauthenticate.\")\n            raise ConfigEntryAuthFailed\n\n        bff_app_config = await coordinator.client.webapi.get_config()\n        masterdata = await coordinator.client.webapi.get_user_info()\n        hass.async_add_executor_job(coordinator.client.write_debug_json_output, bff_app_config, \"app\", True)\n        hass.async_add_executor_job(coordinator.client.write_debug_json_output, masterdata, \"md\", True)\n\n        vehicles = []\n\n        if not masterdata:\n            LOGGER.error(\"No masterdata found. Please check your account/credentials.\")\n            raise ConfigEntryNotReady(\"No masterdata found. Please check your account/credentials.\")\n\n        for fleet in masterdata.get(\"fleets\", []):\n            company_id = fleet.get(\"companyId\")\n            fleet_id = fleet.get(\"fleetId\")\n            LOGGER.debug(\n                \"Fleet %s with company %s found. Collectting car information.\",\n                fleet.get(\"fleetName\", \"unknown fleet name\"),\n                fleet.get(\"companyName\", \"unknown company\"),\n            )\n            fleet_info = await coordinator.client.webapi.get_fleet_info(company_id, fleet_id)\n            hass.async_add_executor_job(\n                coordinator.client.write_debug_json_output,\n                fleet_info,\n                f\"fleet_{company_id}_{fleet_id}\",\n                True,\n            )\n\n            vehicles.extend(fleet.get(\"bookedVehicles\", []))\n\n        vehicles.extend(masterdata.get(\"assignedVehicles\", []))\n\n        for car in vehicles:\n            # Check if the car has a separate VIN key, if not, use the FIN.\n            vin = car.get(\"vin\")\n            if vin is None:\n                vin = car.get(\"fin\")\n                LOGGER.debug(\n                    \"VIN not found in masterdata. Used FIN %s instead.\",\n                    loghelper.Mask_VIN(vin),\n                )\n\n            # Car is excluded, we do not add this\n            if vin in config_entry.options.get(\"excluded_cars\", \"\"):\n                continue\n\n            features: dict[str, bool] = {}\n            vehicle_information: dict = {}\n\n            try:\n                car_capabilities = await coordinator.client.webapi.get_car_capabilities(vin)\n                hass.async_add_executor_job(\n                    coordinator.client.write_debug_json_output,\n                    car_capabilities,\n                    f\"cai-{loghelper.Mask_VIN(vin)}-\",\n                    True,\n                )\n                if car_capabilities and \"features\" in car_capabilities:\n                    features.update(car_capabilities[\"features\"])\n                if car_capabilities and \"vehicle\" in car_capabilities:\n                    vehicle_information = car_capabilities[\"vehicle\"]\n            except aiohttp.ClientError:\n                # For some cars a HTTP401 is raised when asking for capabilities, see github issue #83\n                LOGGER.info(\n                    \"Car Capabilities not available for the car with VIN %s.\",\n                    loghelper.Mask_VIN(vin),\n                )\n\n            try:\n                capabilities = await coordinator.client.webapi.get_car_capabilities_commands(vin)\n                hass.async_add_executor_job(\n                    coordinator.client.write_debug_json_output,\n                    capabilities,\n                    f\"ca-{loghelper.Mask_VIN(vin)}-\",\n                    True,\n                )\n                if capabilities:\n                    for feature in capabilities.get(\"commands\"):\n                        features[feature.get(\"commandName\")] = bool(feature.get(\"isAvailable\"))\n                        if feature.get(\"commandName\", \"\") == \"ZEV_PRECONDITION_CONFIGURE_SEATS\":\n                            capabilityInformation = feature.get(\"capabilityInformation\", None)\n                            if capabilityInformation and len(capabilityInformation) > 0:\n                                features[feature.get(\"capabilityInformation\")[0]] = bool(feature.get(\"isAvailable\"))\n                        if feature.get(\"commandName\", \"\") == \"CHARGE_PROGRAM_CONFIGURE\":\n                            max_soc_found = False\n                            parameters = feature.get(\"parameters\", [])\n                            if parameters is not None:\n                                for parameter in parameters:\n                                    if parameter.get(\"parameterName\", \"\") == \"MAX_SOC\":\n                                        max_soc_found = True\n                            features[\"CHARGE_PROGRAM_CONFIGURE\"] = max_soc_found\n            except aiohttp.ClientError:\n                # For some cars a HTTP401 is raised when asking for capabilities, see github issue #83\n                # We just ignore the capabilities\n                LOGGER.info(\n                    \"Command Capabilities not available for the car with VIN %s. Make sure you disable the capability check in the option of this component.\",\n                    loghelper.Mask_VIN(vin),\n                )\n\n            rcp_options = RcpOptions()\n            rcp_supported = False  # await coordinator.client.webapi.is_car_rcp_supported(vin)\n            LOGGER.debug(\"RCP supported for car %s: %s\", loghelper.Mask_VIN(vin), rcp_supported)\n            setattr(rcp_options, \"rcp_supported\", CarAttribute(rcp_supported, \"VALID\", 0))\n            # rcp_supported = False\n            # if rcp_supported:\n            #     rcp_supported_settings = await coordinator.client.webapi.get_car_rcp_supported_settings(vin)\n            #     if rcp_supported_settings:\n            #         hass.async_add_executor_job(\n            #             coordinator.client.write_debug_json_output,\n            #             rcp_supported_settings,\n            #             \"rcs\",\n            #         )\n            #         if rcp_supported_settings.get(\"data\"):\n            #             if rcp_supported_settings.get(\"data\").get(\"attributes\"):\n            #                 if rcp_supported_settings.get(\"data\").get(\"attributes\").get(\"supportedSettings\"):\n            #                     LOGGER.debug(\n            #                         \"RCP supported settings: %s\",\n            #                         str(rcp_supported_settings.get(\"data\").get(\"attributes\").get(\"supportedSettings\")),\n            #                     )\n            #                     setattr(\n            #                         rcp_options,\n            #                         \"rcp_supported_settings\",\n            #                         CarAttribute(\n            #                             rcp_supported_settings.get(\"data\").get(\"attributes\").get(\"supportedSettings\"),\n            #                             \"VALID\",\n            #                             0,\n            #                         ),\n            #                     )\n\n            #                     for setting in (\n            #                         rcp_supported_settings.get(\"data\").get(\"attributes\").get(\"supportedSettings\")\n            #                     ):\n            #                         setting_result = await coordinator.client.webapi.get_car_rcp_settings(vin, setting)\n            #                         if setting_result is not None:\n            #                             hass.async_add_executor_job(\n            #                                 coordinator.client.write_debug_json_output,\n            #                                 setting_result,\n            #                                 f\"rcs_{setting}\",\n            #                             )\n\n            current_car = Car(vin)\n            current_car.licenseplate = car.get(\"licensePlate\", vin)\n            current_car.baumuster_description = (\n                car.get(\"salesRelatedInformation\", \"\").get(\"baumuster\", \"\").get(\"baumusterDescription\", \"\")\n            )\n            if not current_car.licenseplate.strip():\n                current_car.licenseplate = vin\n            current_car.features = features\n            current_car.vehicle_information = vehicle_information\n            current_car.masterdata = car\n            current_car.app_configuration = bff_app_config\n            current_car.rcp_options = rcp_options\n            current_car.capabilities = capabilities\n            current_car.last_message_received = int(round(time.time() * 1000))\n            current_car.is_owner = car.get(\"isOwner\")\n\n            if config_entry.options.get(CONF_OVERWRITE_PRECONDNOW, False):\n                current_car.features[\"precondNow\"] = True\n\n            coordinator.client.cars[vin] = current_car\n            # await coordinator.client.update_poll_states(vin)\n\n            LOGGER.debug(\"Init - car added - %s\", loghelper.Mask_VIN(current_car.finorvin))\n\n        await coordinator.async_config_entry_first_refresh()\n\n        if len(coordinator.client.cars) == 0:\n            LOGGER.error(\"No cars found. Please check your account/credentials or excluded VINs.\")\n            raise ConfigEntryError(\"No cars found. Please check your account/credentials or excluded VINs.\")\n\n        hass.loop.create_task(coordinator.ws_connect())\n\n    except aiohttp.ClientError as err:\n        LOGGER.warning(\"Can't connect to MB APIs; Retrying in background: %s\", err)\n        raise ConfigEntryNotReady from err\n    except WebsocketError as err:\n        LOGGER.error(\"Websocket error: %s\", err)\n        raise ConfigEntryNotReady from err\n\n    retry_counter: int = 0\n    while not coordinator.entry_setup_complete:\n        # async websocket data load not complete, wait 0.5 seconds or break up after 60 checks (30sec)\n        if retry_counter == 60 and coordinator.client.websocket.account_blocked:\n            for vin in coordinator.client.cars:\n                await coordinator.client.update_poll_states(vin)\n            LOGGER.warning(\"Account is blocked. Reload will happen after unblock at midnight (GMT).\")\n            break\n        if retry_counter == 60 and not coordinator.client.account_blocked:\n            for vin in coordinator.client.cars:\n                await coordinator.client.update_poll_states(vin)\n            LOGGER.warning(\n                \"No full_update set received via websocket for some/all cars. Not all sensors may be available. Missing sensors will be created after the data will be available.\"\n            )\n            break\n\n        await asyncio.sleep(0.5)\n        retry_counter += 1\n\n    return True\n\n\nasync def config_entry_update_listener(hass: HomeAssistant, config_entry: ConfigEntry) -> None:\n    \"\"\"Update listener, called when the config entry options are changed.\"\"\"\n    LOGGER.debug(\"Start config_entry_update async_reload\")\n    await hass.config_entries.async_reload(config_entry.entry_id)\n\n\nasync def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry):\n    \"\"\"Unload mbapi2020 Home config entry.\"\"\"\n    LOGGER.debug(\"Start unload component.\")\n    unload_ok = False\n\n    if len(hass.data[DOMAIN][config_entry.entry_id].client.cars) > 0:\n        # Cancel all watchdogs on final shutdown\n        websocket = hass.data[DOMAIN][config_entry.entry_id].client.websocket\n        websocket._reconnectwatchdog.cancel()\n        websocket._watchdog.cancel()\n        websocket._pingwatchdog.cancel()\n        websocket.component_reload_watcher.cancel()\n\n        # EVENT_HOMEASSISTANT_STOP-Listener deregistrieren, damit alte\n        # Instanzen beim HA-Shutdown nicht erneut aufgerufen werden.\n        if websocket.ha_stop_handler:\n            websocket.ha_stop_handler()\n            websocket.ha_stop_handler = None\n\n        result = await websocket.async_stop()\n\n        websocket._reconnectwatchdog.cancel()\n        websocket._watchdog.cancel()\n        websocket._pingwatchdog.cancel()\n        websocket.component_reload_watcher.cancel()\n\n        hass.data[DOMAIN][config_entry.entry_id].client.websocket = None\n        if unload_ok := await hass.config_entries.async_unload_platforms(config_entry, MERCEDESME_COMPONENTS):\n            del hass.data[DOMAIN][config_entry.entry_id]\n    else:\n        # No cars loaded, we destroy the config entry only\n        del hass.data[DOMAIN][config_entry.entry_id]\n        unload_ok = True\n\n    LOGGER.debug(\"unload result: %s\", unload_ok)\n    return unload_ok\n\n\nasync def async_remove_config_entry_device(\n    hass: HomeAssistant, config_entry: ConfigEntry, device_entry: dr.DeviceEntry\n) -> bool:\n    \"\"\"Remove a config entry from a device.\"\"\"\n    return True\n\n\n@dataclass(frozen=True, kw_only=True)\nclass MercedesMeEntityDescription(EntityDescription):\n    \"\"\"Configuration class for MercedesMe entities.\"\"\"\n\n    attributes: list[str] | None = None\n    check_capability_fn: Callable[[Car], Callable[[], Coroutine[Any, Any, bool]]]\n\n\nclass MercedesMeEntity(CoordinatorEntity[MBAPI2020DataUpdateCoordinator], Entity):\n    \"\"\"Entity class for MercedesMe devices.\"\"\"\n\n    _attr_has_entity_name = True\n\n    def __init__(\n        self,\n        internal_name: str,\n        config: list | EntityDescription,\n        vin: str,\n        coordinator: MBAPI2020DataUpdateCoordinator,\n        should_poll: bool = False,\n    ) -> None:\n        \"\"\"Initialize the MercedesMe entity.\"\"\"\n\n        self._hass = coordinator.hass\n        self._coordinator = coordinator\n        self._vin = vin\n        self._internal_name = internal_name\n        self._sensor_config = config\n        self._car = self._coordinator.client.cars[self._vin]\n        self._feature_name = None\n        self._object_name = None\n        self._attrib_name = None\n\n        self._flip_result = False\n        self._state = None\n\n        # Temporary workaround: If PR get's approved, all entity types should be migrated to the new config classes\n        if isinstance(config, EntityDescription):\n            self._attributes = config.attributes\n            self.entity_description = config\n        else:\n            self._feature_name = config[scf.OBJECT_NAME.value]\n            self._object_name = config[scf.ATTRIBUTE_NAME.value]\n            self._attrib_name = config[scf.VALUE_FIELD_NAME.value]\n            self._flip_result = config[scf.FLIP_RESULT.value]\n            self._attr_device_class = self._sensor_config[scf.DEVICE_CLASS.value]\n            self._attr_icon = self._sensor_config[scf.ICON.value]\n            self._attr_state_class = self._sensor_config[scf.STATE_CLASS.value]\n            self._attr_entity_category = self._sensor_config[scf.ENTITY_CATEGORY.value]\n            self._attributes = self._sensor_config[scf.EXTENDED_ATTRIBUTE_LIST.value]\n            self._attr_native_unit_of_measurement = self.unit_of_measurement\n            self._attr_suggested_display_precision = self._sensor_config[scf.SUGGESTED_DISPLAY_PRECISION.value]\n            self._use_chinese_location_data: bool = self._coordinator.config_entry.options.get(\n                CONF_ENABLE_CHINA_GCJ_02, False\n            )\n            self._attr_translation_key = self._internal_name.lower()\n            self._attr_name = config[scf.DISPLAY_NAME.value]\n            self._name = f\"{self._car.licenseplate} {config[scf.DISPLAY_NAME.value]}\"\n\n        self._attr_device_info = {\"identifiers\": {(DOMAIN, self._vin)}}\n        self._attr_should_poll = should_poll\n        self._attr_unique_id = slugify(f\"{self._vin}_{self._internal_name}\")\n\n        super().__init__(coordinator)\n\n    def device_retrieval_status(self):\n        \"\"\"Return the retrieval_status of the sensor.\"\"\"\n        if self._internal_name == \"car\":\n            return \"VALID\"\n\n        return self._get_car_value(self._feature_name, self._object_name, \"retrievalstatus\", \"error\")\n\n    @property\n    def extra_state_attributes(self):\n        \"\"\"Return the state attributes.\"\"\"\n\n        state = {\"car\": self._car.licenseplate, \"vin\": self._vin}\n\n        if self._attrib_name == \"display_value\":\n            value = self._get_car_value(self._feature_name, self._object_name, \"value\", None)\n            if value:\n                state[\"original_value\"] = value\n\n        for item in [\"retrievalstatus\", \"timestamp\", \"unit\"]:\n            value = self._get_car_value(self._feature_name, self._object_name, item, None)\n            if value:\n                state[item] = value if item != \"timestamp\" else datetime.fromtimestamp(int(value))\n\n        if self._attributes is not None:\n            for attrib in sorted(self._attributes):\n                if \".\" in attrib:\n                    object_name = attrib.split(\".\")[0]\n                    attrib_name = attrib.split(\".\")[1]\n                else:\n                    object_name = self._feature_name\n                    attrib_name = attrib\n                retrievalstatus = self._get_car_value(object_name, attrib_name, \"retrievalstatus\", \"error\")\n\n                if retrievalstatus == \"VALID\":\n                    state[attrib_name] = self._get_car_value(object_name, attrib_name, \"display_value\", None)\n                    if not state[attrib_name]:\n                        state[attrib_name] = self._get_car_value(object_name, attrib_name, \"value\", \"error\")\n\n                if retrievalstatus in [\"NOT_RECEIVED\"]:\n                    state[attrib_name] = \"NOT_RECEIVED\"\n        return state\n\n    @property\n    def device_info(self) -> DeviceInfo:\n        \"\"\"Device information.\"\"\"\n        return DeviceInfo(\n            identifiers={(DOMAIN, self._vin)},\n            manufacturer=ATTR_MB_MANUFACTURER,\n            model=self._car.baumuster_description,\n            name=self._car.licenseplate,\n            sw_version=f\"{self._car.vehicle_information.get('headUnitSoftwareVersion', '')} - {self._car.vehicle_information.get('headUnitType', '')}\",\n            hw_version=f\"{self._car.vehicle_information.get('starArchitecture', '')} - {self._car.vehicle_information.get('tcuType', '')}\",\n        )\n\n    @property\n    def unit_of_measurement(self):\n        \"\"\"Return the unit of measurement.\"\"\"\n\n        if \"unit\" in self.extra_state_attributes:\n            reported_unit: str = self.extra_state_attributes[\"unit\"]\n            if reported_unit.upper() in UNITS:\n                return UNITS[reported_unit.upper()]\n\n            LOGGER.warning(\n                \"Unknown unit %s found. Please report via issue https://www.github.com/renenulschde/mbapi2020/issues\",\n                reported_unit,\n            )\n            return reported_unit\n\n        if isinstance(self._sensor_config, EntityDescription):\n            return None\n        return self._sensor_config[scf.UNIT_OF_MEASUREMENT.value]\n\n    def update(self):\n        \"\"\"Get the latest data and updates the states.\"\"\"\n        if not self.enabled:\n            return\n\n        if isinstance(self._sensor_config, EntityDescription):\n            self._mercedes_me_update()\n        else:\n            self._state = self._get_car_value(self._feature_name, self._object_name, self._attrib_name, \"error\")\n            self.async_write_ha_state()\n\n    def _mercedes_me_update(self) -> None:\n        \"\"\"Update Mercedes Me entity.\"\"\"\n        raise NotImplementedError\n\n    def _get_car_value(self, feature, object_name, attrib_name, default_value):\n        value = None\n\n        if object_name:\n            if not feature:\n                value = getattr(\n                    getattr(self._car, object_name, default_value),\n                    attrib_name,\n                    default_value,\n                )\n            else:\n                value = getattr(\n                    getattr(\n                        getattr(self._car, feature, default_value),\n                        object_name,\n                        default_value,\n                    ),\n                    attrib_name,\n                    default_value,\n                )\n\n        else:\n            value = getattr(self._car, attrib_name, default_value)\n\n        return value\n\n    def _get_car_attribute(self, feature, object_name):\n        \"\"\"Get the CarAttribute object for this sensor.\"\"\"\n        if object_name:\n            if not feature:\n                return getattr(self._car, object_name, None)\n            feature_obj = getattr(self._car, feature, None)\n            if feature_obj:\n                return getattr(feature_obj, object_name, None)\n        else:\n            return getattr(self._car, self._attrib_name, None)\n\n        return None\n\n    def pushdata_update_callback(self):\n        \"\"\"Schedule a state update.\"\"\"\n        self.update()\n\n    @callback\n    def _handle_coordinator_update(self) -> None:\n        \"\"\"Handle updated data from the coordinator.\"\"\"\n        self.update()\n\n    async def async_added_to_hass(self):\n        \"\"\"Add callback after being added to hass.\n\n        Show latest data after startup.\n        \"\"\"\n        await super().async_added_to_hass()\n        if not self._attr_should_poll:\n            self._car.add_update_listener(self.pushdata_update_callback)\n\n        self.async_schedule_update_ha_state(True)\n        self._handle_coordinator_update()\n\n    async def async_will_remove_from_hass(self):\n        \"\"\"Entity being removed from hass.\"\"\"\n        await super().async_will_remove_from_hass()\n        self._car.remove_update_callback(self.pushdata_update_callback)\n"
  },
  {
    "path": "custom_components/mbapi2020/binary_sensor.py",
    "content": "\"\"\"Support for Mercedes cars with Mercedes ME.\n\nFor more details about this component, please refer to the documentation at\nhttps://github.com/ReneNulschDE/mbapi2020/\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom homeassistant.components.binary_sensor import BinarySensorEntity\nfrom homeassistant.config_entries import ConfigEntry\nfrom homeassistant.core import HomeAssistant\nfrom homeassistant.helpers.entity_platform import AddEntitiesCallback\nfrom homeassistant.helpers.restore_state import RestoreEntity\n\nfrom . import MercedesMeEntity\nfrom .const import (\n    CONF_FT_DISABLE_CAPABILITY_CHECK,\n    DOMAIN,\n    LOGGER,\n    BinarySensors,\n    DefaultValueModeType,\n    SensorConfigFields as scf,\n)\nfrom .coordinator import MBAPI2020DataUpdateCoordinator\n\n\ndef _create_binary_sensor_if_eligible(key, config, car, coordinator):\n    \"\"\"Check if binary sensor should be created and return device if eligible.\"\"\"\n    # Skip special sensors that should not be created dynamically\n    if key in [\"car\", \"data_mode\"]:\n        return None\n\n    if (\n        config[scf.CAPABILITIES_LIST.value] is None\n        or coordinator.config_entry.options.get(CONF_FT_DISABLE_CAPABILITY_CHECK, False)\n        or car.features.get(config[scf.CAPABILITIES_LIST.value], False)\n    ):\n        device = MercedesMEBinarySensor(\n            internal_name=key,\n            config=config,\n            vin=car.finorvin,\n            coordinator=coordinator,\n        )\n\n        # Check eligibility\n        status = device.device_retrieval_status()\n        is_eligible = status in [\"VALID\", \"NOT_RECEIVED\", \"3\", 3] or (\n            config[scf.DEFAULT_VALUE_MODE.value] is not None\n            and config[scf.DEFAULT_VALUE_MODE.value] != DefaultValueModeType.NONE\n            and str(status) != \"4\"\n        )\n\n        if is_eligible:\n            return device\n\n    return None\n\n\nasync def create_missing_binary_sensors_for_car(car, coordinator, async_add_entities):\n    \"\"\"Create missing binary sensors for a specific car.\"\"\"\n\n    missing_sensors = []\n\n    for key, value in sorted(BinarySensors.items()):\n        device = _create_binary_sensor_if_eligible(key, value, car, coordinator)\n        if device and f\"binary_sensor.{device.unique_id}\" not in car.sensors:\n            missing_sensors.append(device)\n            LOGGER.debug(\"Sensor added: %s\", device._name)\n\n    if missing_sensors:\n        await async_add_entities(missing_sensors, True)\n        return len(missing_sensors)\n    return 0\n\n\nasync def async_setup_entry(\n    hass: HomeAssistant,\n    config_entry: ConfigEntry,\n    async_add_entities: AddEntitiesCallback,\n):\n    \"\"\"Set up integration from a config entry.\"\"\"\n\n    coordinator: MBAPI2020DataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id]\n\n    if not coordinator.client.cars:\n        LOGGER.info(\"No Cars found.\")\n        return\n\n    sensors = []\n    for car in coordinator.client.cars.values():\n        for key, value in sorted(BinarySensors.items()):\n            device = _create_binary_sensor_if_eligible(key, value, car, coordinator)\n            if device:\n                sensors.append(device)\n\n    async_add_entities(sensors, True)\n\n\nclass MercedesMEBinarySensor(MercedesMeEntity, BinarySensorEntity, RestoreEntity):\n    \"\"\"Representation of a Sensor.\"\"\"\n\n    def flip(self, state):\n        \"\"\"Flip the result.\"\"\"\n        if self._flip_result:\n            return not state\n        return state\n\n    @property\n    def is_on(self):\n        \"\"\"Return the state of the binary sensor.\"\"\"\n\n        if self._state is None:\n            self.update()\n\n        if self._state == \"INACTIVE\":\n            return self.flip(False)\n        if self._state == \"ACTIVE\":\n            return self.flip(True)\n        if self._state == \"0\":\n            return self.flip(False)\n        if self._state == \"1\":\n            return self.flip(True)\n        if self._state == \"2\":\n            return self.flip(False)\n        if self._state == 0:\n            return self.flip(False)\n        if self._state == 1:\n            return self.flip(True)\n        if self._state == 2:\n            return self.flip(False)\n        if self._state == \"true\":\n            return self.flip(True)\n        if self._state == \"false\":\n            return self.flip(False)\n        if self._state is False:\n            return self.flip(False)\n        if self._state is True:\n            return self.flip(True)\n\n        return self._state\n\n    async def async_added_to_hass(self):\n        \"\"\"Add callback after being added to hass.\"\"\"\n\n        self._car.add_sensor(f\"binary_sensor.{self._attr_unique_id}\")\n        await super().async_added_to_hass()\n\n    async def async_will_remove_from_hass(self):\n        \"\"\"Entity being removed from hass.\"\"\"\n\n        self._car.remove_sensor(f\"binary_sensor.{self._attr_unique_id}\")\n        await super().async_will_remove_from_hass()\n"
  },
  {
    "path": "custom_components/mbapi2020/button.py",
    "content": "\"\"\"Button support for Mercedes cars with Mercedes ME.\n\nFor more details about this component, please refer to the documentation at\nhttps://github.com/ReneNulschDE/mbapi2020/\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom homeassistant.components.button import ButtonEntity\nfrom homeassistant.config_entries import ConfigEntry\nfrom homeassistant.core import HomeAssistant\nfrom homeassistant.helpers.entity_platform import AddEntitiesCallback\n\nfrom . import MercedesMeEntity\nfrom .const import BUTTONS, CONF_FT_DISABLE_CAPABILITY_CHECK, DOMAIN, LOGGER, SensorConfigFields as scf\nfrom .coordinator import MBAPI2020DataUpdateCoordinator\n\n\nasync def async_setup_entry(\n    hass: HomeAssistant,\n    config_entry: ConfigEntry,\n    async_add_entities: AddEntitiesCallback,\n) -> None:\n    \"\"\"Set up the demo button platform.\"\"\"\n\n    coordinator: MBAPI2020DataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id]\n\n    if not coordinator.client.cars:\n        LOGGER.info(\"No Cars found.\")\n        return\n\n    button_list = []\n    for car in coordinator.client.cars.values():\n        for key, value in sorted(BUTTONS.items()):\n            if (\n                value[scf.CAPABILITIES_LIST.value] is None\n                or config_entry.options.get(CONF_FT_DISABLE_CAPABILITY_CHECK, False) is True\n                or car.features.get(value[scf.CAPABILITIES_LIST.value], False) is True\n            ):\n                device = MercedesMEButton(\n                    internal_name=key,\n                    config=value,\n                    vin=car.finorvin,\n                    coordinator=coordinator,\n                )\n\n                button_list.append(device)\n\n    async_add_entities(button_list, False)\n\n\nclass MercedesMEButton(MercedesMeEntity, ButtonEntity):\n    \"\"\"Representation of a Sensor.\"\"\"\n\n    async def async_press(self) -> None:\n        \"\"\"Send out a persistent notification.\"\"\"\n        service = getattr(self._coordinator.client, self._sensor_config[3])\n        await service(self._vin)\n        self._state = None\n\n    def update(self):\n        \"\"\"Nothing to update as buttons are stateless.\"\"\"\n"
  },
  {
    "path": "custom_components/mbapi2020/car.py",
    "content": "\"\"\"Define the objects to store care data.\"\"\"\n\nfrom __future__ import annotations\n\nimport collections\nfrom dataclasses import dataclass\nfrom datetime import datetime\nfrom typing import Any\n\nODOMETER_OPTIONS = [\n    \"odo\",\n    \"distanceReset\",\n    \"distanceStart\",\n    \"averageSpeedReset\",\n    \"averageSpeedStart\",\n    \"drivenTimeZEReset\",\n    \"drivenTimeReset\",\n    \"drivenTimeStart\",\n    \"ecoscoretotal\",\n    \"ecoscorefreewhl\",\n    \"ecoscorebonusrange\",\n    \"ecoscoreconst\",\n    \"ecoscoreaccel\",\n    \"gasconsumptionstart\",\n    \"gasconsumptionreset\",\n    \"gasTankRange\",\n    \"gasTankLevel\",\n    \"gasTankLevelPercent\",\n    \"liquidconsumptionstart\",\n    \"liquidconsumptionreset\",\n    \"liquidRangeSkipIndication\",\n    \"outsideTemperature\",\n    \"rangeliquid\",\n    \"remoteStartTemperature\",\n    \"serviceintervaldays\",\n    \"serviceintervaldistance\",\n    \"tanklevelpercent\",\n    \"tankReserveLamp\",\n    \"batteryState\",\n    \"tankLevelAdBlue\",\n    \"vehicleDataConnectionState\",\n    \"ignitionstate\",\n    \"oilLevel\",\n    \"departuretime\",\n    \"departureTimeWeekday\",\n]\n\nLOCATION_OPTIONS = [\"positionLat\", \"positionLong\", \"positionHeading\"]\n\nTIRE_OPTIONS = [\n    \"tirepressureRearLeft\",\n    \"tirepressureRearRight\",\n    \"tirepressureFrontRight\",\n    \"tirepressureFrontLeft\",\n    \"tirewarninglamp\",\n    \"tirewarningsrdk\",\n    \"tirewarningsprw\",\n    \"tireMarkerFrontRight\",\n    \"tireMarkerFrontLeft\",\n    \"tireMarkerRearLeft\",\n    \"tireMarkerRearRight\",\n    \"tireWarningRollup\",\n    \"lastTirepressureTimestamp\",\n    \"tireTemperatureRearLeft\",\n    \"tireTemperatureFrontRight\",\n    \"tireTemperatureRearRight\",\n    \"tireTemperatureFrontLeft\",\n]\n\nWINDOW_OPTIONS = [\n    \"windowstatusrearleft\",\n    \"windowstatusrearright\",\n    \"windowstatusfrontright\",\n    \"windowstatusfrontleft\",\n    \"windowStatusOverall\",\n    \"flipWindowStatus\",\n]\n\nDOOR_OPTIONS = [\n    \"decklidstatus\",\n    \"doorStatusOverall\",\n    \"doorLockStatusOverall\",\n    \"doorlockstatusgas\",\n    \"doorlockstatusvehicle\",\n    \"doorlockstatusfrontleft\",\n    \"doorlockstatusfrontright\",\n    \"doorlockstatusrearright\",\n    \"doorlockstatusrearleft\",\n    \"doorlockstatusdecklid\",\n    \"doorstatusrearleft\",\n    \"doorstatusfrontright\",\n    \"doorstatusrearright\",\n    \"doorstatusfrontleft\",\n    \"rooftopstatus\",\n    \"sunroofstatus\",\n    \"engineHoodStatus\",\n    \"chargeFlapDCStatus\",\n    \"chargeFlapACStatus\",\n]\n\nELECTRIC_OPTIONS = [\n    \"rangeelectric\",\n    \"chargeflap\",\n    \"chargeinletcoupler\",\n    \"chargeinletlock\",\n    \"chargeCouplerACStatus\",\n    \"chargeCouplerDCStatus\",\n    \"chargeCouplerACLockStatus\",\n    \"chargeCouplerDCLockStatus\",\n    \"chargePrograms\",\n    \"chargingactive\",\n    \"chargingBreakClockTimer\",\n    \"chargingstatus\",\n    \"chargingPower\",\n    \"chargingPowerEcoLimit\",\n    \"chargingPowerRestriction\",\n    \"departureTimeMode\",\n    \"distanceElectricalReset\",\n    \"distanceElectricalStart\",\n    \"distanceZEReset\",\n    \"distanceZEStart\",\n    \"ecoElectricBatteryTemperature\",\n    \"electricconsumptionstart\",\n    \"electricconsumptionreset\",\n    \"electricRatioStart\",\n    \"electricRatioReset\",\n    \"electricRatioOverall\",\n    \"endofchargetime\",\n    \"endofChargeTimeWeekday\",\n    \"selectedChargeProgram\",\n    \"maxrange\",\n    \"maxSocLowerLimit\",\n    \"maxSoc\",\n    \"max_soc\",\n    \"soc\",\n]\n\nBINARY_SENSOR_OPTIONS = [\n    \"warningwashwater\",\n    \"warningenginelight\",\n    \"warningbrakefluid\",\n    \"warningcoolantlevellow\",\n    \"parkbrakestatus\",\n    #'readingLampFrontRight',\n    #'readingLampFrontLeft',\n    \"warningBrakeLiningWear\",\n    \"warninglowbattery\",\n    \"starterBatteryState\",\n    \"liquidRangeCritical\",\n    \"tankCapOpenLamp\",\n    \"remoteStartActive\",\n    \"engineState\",\n]\n\nAUX_HEAT_OPTIONS = [\n    \"auxheatActive\",\n    \"auxheatwarnings\",\n    \"auxheatruntime\",\n    \"auxheatstatus\",\n    \"auxheatwarningsPush\",\n    \"auxheattimeselection\",\n    \"auxheattime1\",\n    \"auxheattime2\",\n    \"auxheattime3\",\n]\n\nWIPER_OPTIONS = [\"wiperLifetimeExceeded\", \"wiperHealthPercent\"]\n\nPRE_COND_OPTIONS = [\n    \"precondStatus\",\n    \"precondOperatingMode\",\n    \"precondState\",\n    \"precondActive\",\n    \"precondError\",\n    \"precondNow\",\n    \"precondNowError\",\n    \"precondDuration\",\n    \"precondatdeparture\",\n    \"precondAtDepartureDisable\",\n    \"precondSeatFrontLeft\",\n    \"precondSeatFrontRight\",\n    \"precondSeatRearLeft\",\n    \"precondSeatRearRight\",\n    \"temperature_points_frontLeft\",\n    \"temperature_points_frontRight\",\n    \"temperature_points_rearLeft\",\n    \"temperature_points_rearRight\",\n]\n\nRemoteStart_OPTIONS = [\"remoteEngine\", \"remoteStartEndtime\", \"remoteStartTemperature\"]\n\nCarAlarm_OPTIONS = [\n    \"carAlarm\",\n    \"carAlarmLastTime\",\n    \"carAlarmReason\",\n    \"collisionAlarmTimestamp\",\n    \"interiorSensor\",\n    \"lastParkEvent\",\n    \"lastTheftWarning\",\n    \"lastTheftWarningReason\",\n    \"parkEventLevel\",\n    \"parkEventType\",\n    \"theftAlarmActive\",\n    \"theftSystemArmed\",\n    \"towProtectionSensorStatus\",\n    \"towSensor\",\n    \"interiorProtectionSensorStatus\",\n    \"exteriorProtectionSensorStatus\",\n]\n\nGeofenceEvents_OPTIONS = [\"last_event_zone\", \"last_event_timestamp\", \"last_event_type\"]\n\n\nclass Car:\n    \"\"\"Car class, stores the car values at runtime.\"\"\"\n\n    def __init__(self, vin: str):\n        \"\"\"Initialize the Car instance.\"\"\"\n        self.finorvin = vin\n        self.vehicle_information: dict = {}\n        self.capabilities: dict[str, Any] = {}\n\n        self.licenseplate = \"\"\n        self._is_owner = False\n        self.messages_received = collections.Counter(f=0, p=0)\n        self._last_message_received = 0\n        self._last_command_type = \"\"\n        self._last_command_state = \"\"\n        self._last_command_error_code = \"\"\n        self._last_command_error_message = \"\"\n        self.last_command_time_stamp = 0\n\n        self.binarysensors = None\n        self.tires = None\n        self.wipers = None\n        self.odometer = None\n        self.doors = None\n        self.location = None\n        self.windows = None\n        self.rcp_options = None\n        self.auxheat = None\n        self.precond = None\n        self.electric = None\n        self.caralarm = None\n        self.last_full_message = None\n        self.geofence_events = GeofenceEvents()\n        self.features = {}\n        self.masterdata: dict[str, Any] = {}\n        self.app_configuration: dict[str, Any] = {}\n        self.entry_setup_complete = False\n        self._update_listeners = set()\n        self.sensors: set[str] = set()\n        self.baumuster_description: str = \"\"\n        self.features: dict[str, bool]\n        self.geofence_events: GeofenceEvents\n        self.geo_fencing_retry_counter: int = 0\n        self.has_geofencing: bool = True\n        self._data_collection_mode: str = \"push\"\n        self._data_collection_mode_ts: float = 0\n\n    @property\n    def is_owner(self):\n        \"\"\"Get/set if the account is owner of the car.\"\"\"\n        return CarAttribute(self._is_owner, \"VALID\", None)\n\n    @is_owner.setter\n    def is_owner(self, value: bool):\n        self._is_owner = value\n\n    @property\n    def full_updatemessages_received(self):\n        \"\"\"Get number of received full updates messages.\"\"\"\n        return CarAttribute(self.messages_received[\"f\"], \"VALID\", None)\n\n    @property\n    def partital_updatemessages_received(self):\n        \"\"\"Get number of received partial updates messages.\"\"\"\n        return CarAttribute(self.messages_received[\"p\"], \"VALID\", None)\n\n    @property\n    def last_message_received(self):\n        \"\"\"Get/Set last message received.\"\"\"\n        if self._last_message_received > 0:\n            return CarAttribute(datetime.fromtimestamp(int(round(self._last_message_received / 1000))), \"VALID\", None)\n\n        return CarAttribute(None, \"NOT_RECEIVED\", None)\n\n    @last_message_received.setter\n    def last_message_received(self, value):\n        self._last_message_received = value\n\n    @property\n    def data_collection_mode(self):\n        \"\"\"Get/Set last message received.\"\"\"\n        return CarAttribute(self._data_collection_mode, \"VALID\", self._data_collection_mode_ts)\n\n    @data_collection_mode.setter\n    def data_collection_mode(self, value):\n        self._data_collection_mode = value\n        self._data_collection_mode_ts = datetime.now().timestamp()\n\n    @property\n    def last_command_type(self):\n        \"\"\"Get/Set last command type.\"\"\"\n        return CarAttribute(self._last_command_type, \"VALID\", self.last_command_time_stamp)\n\n    @last_command_type.setter\n    def last_command_type(self, value):\n        self._last_command_type = value\n\n    @property\n    def last_command_state(self):\n        \"\"\"Get/Set last command state.\"\"\"\n        return CarAttribute(self._last_command_state, \"VALID\", self.last_command_time_stamp)\n\n    @last_command_state.setter\n    def last_command_state(self, value):\n        self._last_command_state = value\n\n    @property\n    def last_command_error_code(self):\n        \"\"\"Get/Set last command error code.\"\"\"\n        return CarAttribute(self._last_command_error_code, \"VALID\", self.last_command_time_stamp)\n\n    @last_command_error_code.setter\n    def last_command_error_code(self, value):\n        self._last_command_error_code = value\n\n    @property\n    def last_command_error_message(self):\n        \"\"\"Get/Set last command error message.\"\"\"\n        return CarAttribute(self._last_command_error_message, \"VALID\", self.last_command_time_stamp)\n\n    @last_command_error_message.setter\n    def last_command_error_message(self, value):\n        self._last_command_error_message = value\n\n    def add_update_listener(self, listener):\n        \"\"\"Add a listener for update notifications.\"\"\"\n        self._update_listeners.add(listener)\n\n    def remove_update_callback(self, listener):\n        \"\"\"Remove a listener for update notifications.\"\"\"\n        self._update_listeners.discard(listener)\n\n    def add_sensor(self, unique_id: str):\n        \"\"\"Add a sensor to the car.\"\"\"\n        if unique_id not in self.sensors:\n            self.sensors.add(unique_id)\n\n    def remove_sensor(self, unique_id: str):\n        \"\"\"Remove a sensor from the car.\"\"\"\n        if unique_id in self.sensors:\n            self.sensors.remove(unique_id)\n\n    def publish_updates(self):\n        \"\"\"Schedule call all registered callbacks.\"\"\"\n        for callback in self._update_listeners:\n            callback()\n\n    def check_capabilities(self, required_capabilities: list[str]) -> bool:\n        \"\"\"Check if the car has the required capabilities.\"\"\"\n        return any(self.features.get(capability) is True for capability in required_capabilities)\n\n\n@dataclass(init=False)\nclass Tires:\n    \"\"\"Stores the Tires values at runtime.\"\"\"\n\n    name: str = \"Tires\"\n\n\n@dataclass(init=False)\nclass Wipers:\n    \"\"\"Stores the Wiper values at runtime.\"\"\"\n\n    name: str = \"Wipers\"\n\n\n@dataclass(init=False)\nclass Odometer:\n    \"\"\"Stores the Odometer values at runtime.\"\"\"\n\n    name: str = \"Odometer\"\n\n\n@dataclass(init=False)\nclass RcpOptions:\n    \"\"\"Stores the RcpOptions values at runtime.\"\"\"\n\n    name: str = \"RCP_Options\"\n\n\n@dataclass(init=False)\nclass Windows:\n    \"\"\"Stores the Windows values at runtime.\"\"\"\n\n    name: str = \"Windows\"\n\n\n@dataclass(init=False)\nclass Doors:\n    \"\"\"Stores the Doors values at runtime.\"\"\"\n\n    name: str = \"Doors\"\n\n\n@dataclass(init=False)\nclass Electric:\n    \"\"\"Stores the Electric values at runtime.\"\"\"\n\n    name: str = \"Electric\"\n\n\n@dataclass(init=False)\nclass Auxheat:\n    \"\"\"Stores the Auxheat values at runtime.\"\"\"\n\n    name: str = \"Auxheat\"\n\n\n@dataclass(init=False)\nclass Precond:\n    \"\"\"Stores the Precondining values at runtime.\"\"\"\n\n    name: str = \"Precond\"\n\n\n@dataclass(init=False)\nclass BinarySensors:\n    \"\"\"Stores the BinarySensors values at runtime.\"\"\"\n\n    name: str = \"BinarySensors\"\n\n\n@dataclass(init=False)\nclass RemoteStart:\n    \"\"\"Stores the RemoteStart values at runtime.\"\"\"\n\n    name: str = \"RemoteStart\"\n\n\n@dataclass(init=False)\nclass CarAlarm:\n    \"\"\"Stores the CarAlarm values at runtime.\"\"\"\n\n    name: str = \"CarAlarm\"\n\n\n@dataclass(init=False)\nclass Location:\n    \"\"\"Stores the Location values at runtime.\"\"\"\n\n    name: str = \"Location\"\n\n\n@dataclass(init=False)\nclass GeofenceEvents:\n    \"\"\"Stores the geofence violation values at runtime.\"\"\"\n\n    last_event_type: CarAttribute | None = None\n    last_event_timestamp: CarAttribute | None = None\n    last_event_zone: CarAttribute | None = None\n    name: str = \"GeofenceEvents\"\n\n    def __post_init__(self):\n        \"\"\"Initialize mutable attributes.\"\"\"\n        self.events = []\n\n\n@dataclass(init=False)\nclass CarAttribute:\n    \"\"\"Stores the CarAttribute values at runtime.\"\"\"\n\n    def __init__(self, value, retrievalstatus, timestamp, display_value=None, unit=None, sensor_created=False):\n        \"\"\"Initialize the instance.\"\"\"\n        self.value = value\n        self.retrievalstatus = retrievalstatus\n        self.timestamp = timestamp\n        self.display_value = display_value\n        self.unit = unit\n        self.sensor_created = sensor_created\n"
  },
  {
    "path": "custom_components/mbapi2020/client.py",
    "content": "\"\"\"The MercedesME 2020 client.\"\"\"\n\nfrom __future__ import annotations\n\nimport asyncio\nimport datetime as dt\nfrom datetime import datetime, timezone\nimport json\nimport logging\nfrom pathlib import Path\nimport threading\nimport time\nimport traceback\nimport uuid\n\nfrom aiohttp import ClientSession\nfrom google.protobuf.json_format import MessageToJson\n\nfrom custom_components.mbapi2020.proto import client_pb2\nimport custom_components.mbapi2020.proto.vehicle_commands_pb2 as pb2_commands\nfrom homeassistant.config_entries import ConfigEntry\nfrom homeassistant.const import STATE_UNKNOWN\nfrom homeassistant.core import HomeAssistant\nfrom homeassistant.exceptions import ServiceValidationError\nfrom homeassistant.helpers import system_info\n\nfrom .car import (\n    AUX_HEAT_OPTIONS,\n    BINARY_SENSOR_OPTIONS,\n    DOOR_OPTIONS,\n    ELECTRIC_OPTIONS,\n    LOCATION_OPTIONS,\n    ODOMETER_OPTIONS,\n    PRE_COND_OPTIONS,\n    TIRE_OPTIONS,\n    WINDOW_OPTIONS,\n    WIPER_OPTIONS,\n    Auxheat,\n    BinarySensors,\n    Car,\n    CarAlarm,\n    CarAlarm_OPTIONS,\n    CarAttribute,\n    Doors,\n    Electric,\n    GeofenceEvents,\n    Location,\n    Odometer,\n    Precond,\n    Tires,\n    Windows,\n    Wipers,\n)\nfrom .const import (\n    CONF_DEBUG_FILE_SAVE,\n    CONF_EXCLUDED_CARS,\n    CONF_FT_DISABLE_CAPABILITY_CHECK,\n    CONF_PIN,\n    DEFAULT_CACHE_PATH,\n    DEFAULT_DOWNLOAD_PATH,\n    DEFAULT_SOCKET_MIN_RETRY,\n)\nfrom .helper import LogHelper as loghelper\nfrom .oauth import Oauth\nfrom .webapi import WebApi\nfrom .websocket import Websocket\n\nLOGGER = logging.getLogger(__name__)\n\nDEBUG_SIMULATE_PARTIAL_UPDATES_ONLY = False\nGEOFENCING_MAX_RETRIES = 1\n\n\nclass Client:\n    \"\"\"define the client.\"\"\"\n\n    def __init__(\n        self,\n        hass: HomeAssistant,\n        session: ClientSession,\n        config_entry: ConfigEntry,\n        region: str = \"\",\n    ) -> None:\n        \"\"\"Initialize the client instance.\"\"\"\n\n        self.long_running_operation_active: bool = False\n        self.ignition_states: dict[str, bool] = {}\n        self.account_blocked: bool = False\n\n        self._ws_reconnect_delay = DEFAULT_SOCKET_MIN_RETRY\n        self._hass = hass\n        self._region = region\n        self._on_dataload_complete = None\n        self._dataload_complete_fired = False\n        self._coordinator_ref = None\n        self._disable_rlock = False\n        self.__lock = None\n        self._debug_save_path = self._hass.config.path(DEFAULT_CACHE_PATH)\n        self.config_entry = config_entry\n        self.session_id = str(uuid.uuid4()).upper()\n\n        self._first_vepupdates_processed: bool = False\n        self._vepupdates_timeout_seconds: int = 25\n        self._vepupdates_time_first_message: datetime | None = None\n\n        self.oauth: Oauth = Oauth(\n            hass=self._hass,\n            session=session,\n            region=self._region,\n            config_entry=config_entry,\n        )\n        self.oauth.session_id = self.session_id\n        self.webapi: WebApi = WebApi(self._hass, session=session, oauth=self.oauth, region=self._region)\n        self.webapi.session_id = self.session_id\n        self.websocket: Websocket = Websocket(\n            hass=self._hass,\n            oauth=self.oauth,\n            region=self._region,\n            session_id=self.session_id,\n            ignition_states=self.ignition_states,\n        )\n\n        self.cars: dict[str, Car] = {}\n\n    @property\n    def pin(self) -> str:\n        \"\"\"Return the security pin of an account.\"\"\"\n        if self.config_entry:\n            if self.config_entry.options:\n                return self.config_entry.options.get(CONF_PIN, None)\n        return \"\"\n\n    @property\n    def excluded_cars(self):\n        \"\"\"Return the list of exluded/ignored VIN/FIN.\"\"\"\n        if self.config_entry:\n            if self.config_entry.options:\n                return self.config_entry.options.get(CONF_EXCLUDED_CARS, [])\n        return []\n\n    def on_data(self, data):\n        \"\"\"Define a handler to fire when the data is received.\"\"\"\n\n        msg_type = data.WhichOneof(\"msg\")\n\n        if self.websocket and self.websocket.ws_connect_retry_counter > 0:\n            self.websocket.ws_connect_retry_counter = 0\n            self.websocket.ws_connect_retry_counter_reseted = True\n\n        if msg_type == \"vepUpdate\":  # VEPUpdate\n            LOGGER.debug(\"vepUpdate\")\n            return None\n\n        if msg_type == \"vepUpdates\":  # VEPUpdatesByVIN\n            self._process_vep_updates(data)\n\n            sequence_number = data.vepUpdates.sequence_number\n            LOGGER.debug(\"vepUpdates Sequence: %s\", sequence_number)\n            ack_command = client_pb2.ClientMessage()\n            ack_command.acknowledge_vep_updates_by_vin.sequence_number = sequence_number\n            return ack_command\n\n        if msg_type == \"debugMessage\":  # DebugMessage\n            self._write_debug_output(data, \"deb\")\n            if data.debugMessage:\n                LOGGER.debug(\"debugMessage - Data: %s\", data.debugMessage.message)\n\n            return None\n\n        if msg_type == \"service_status_updates\":\n            self._write_debug_output(data, \"ssu\")\n            sequence_number = data.service_status_updates.sequence_number\n            LOGGER.debug(\"service_status_update Sequence: %s\", sequence_number)\n            ack_command = client_pb2.ClientMessage()\n            ack_command.acknowledge_service_status_update.sequence_number = sequence_number\n            return ack_command\n\n        if msg_type == \"user_data_update\":\n            self._write_debug_output(data, \"udu\")\n            sequence_number = data.user_data_update.sequence_number\n            LOGGER.debug(\"user_data_update Sequence: %s\", sequence_number)\n            ack_command = client_pb2.ClientMessage()\n            ack_command.acknowledge_user_data_update.sequence_number = sequence_number\n            return ack_command\n\n        if msg_type == \"user_vehicle_auth_changed_update\":\n            LOGGER.debug(\n                \"user_vehicle_auth_changed_update - Data: %s\",\n                MessageToJson(data, preserving_proto_field_name=True),\n            )\n            return None\n\n        if msg_type == \"user_picture_update\":\n            self._write_debug_output(data, \"upu\")\n            sequence_number = data.user_picture_update.sequence_number\n            LOGGER.debug(\"user_picture_update Sequence: %s\", sequence_number)\n            ack_command = client_pb2.ClientMessage()\n            ack_command.acknowledge_user_picture_update.sequence_number = sequence_number\n            return ack_command\n\n        if msg_type == \"user_pin_update\":\n            self._write_debug_output(data, \"pin\")\n            sequence_number = data.user_pin_update.sequence_number\n            LOGGER.debug(\"user_pin_update Sequence: %s\", sequence_number)\n            ack_command = client_pb2.ClientMessage()\n            ack_command.acknowledge_user_pin_update.sequence_number = sequence_number\n            return ack_command\n\n        if msg_type == \"vehicle_updated\":\n            self._write_debug_output(data, \"vup\")\n            sequence_number = data.vehicle_updated.sequence_number\n            LOGGER.debug(\"vehicle_updated Sequence: %s\", sequence_number)\n            ack_command = client_pb2.ClientMessage()\n            ack_command.acknowledge_vehicle_updated.sequence_number = sequence_number\n            return ack_command\n\n        if msg_type == \"preferred_dealer_change\":\n            self._write_debug_output(data, \"pdc\")\n            sequence_number = data.preferred_dealer_change.sequence_number\n            LOGGER.debug(\"preferred_dealer_change Sequence: %s\", sequence_number)\n            ack_command = client_pb2.ClientMessage()\n            ack_command.acknowledge_preferred_dealer_change.sequence_number = sequence_number\n            return ack_command\n\n        if msg_type == \"apptwin_command_status_updates_by_vin\":\n            LOGGER.debug(\n                \"apptwin_command_status_updates_by_vin - Data: %s\",\n                MessageToJson(data, preserving_proto_field_name=True),\n            )\n\n            self._process_apptwin_command_status_updates_by_vin(data)\n\n            sequence_number = data.apptwin_command_status_updates_by_vin.sequence_number\n            LOGGER.debug(\"apptwin_command_status_updates_by_vin: %s\", sequence_number)\n            ack_command = client_pb2.ClientMessage()\n            ack_command.acknowledge_apptwin_command_status_update_by_vin.sequence_number = sequence_number\n            return ack_command\n\n        if msg_type == \"apptwin_pending_command_request\":\n            self._process_assigned_vehicles(data)\n            return \"aa0100\"\n\n        if msg_type == \"assigned_vehicles\":\n            self._write_debug_output(data, \"asv\")\n            self._process_assigned_vehicles(data)\n            return \"ba0100\"\n\n        if msg_type == \"data_change_event\":\n            self._write_debug_output(data, \"dce\")\n            sequence_number = data.data_change_event.sequence_number\n            LOGGER.debug(\"data_change_event: %s\", sequence_number)\n            ack_command = client_pb2.ClientMessage()\n            ack_command.acknowledge_data_change_event.sequence_number = sequence_number\n            return ack_command\n\n        if msg_type == \"vehicle_status_updates\":\n            self._write_debug_output(data, \"vsu\")\n            LOGGER.info(\n                \"vehicle_status_updates - Data: %s\",\n                MessageToJson(data, preserving_proto_field_name=True),\n            )\n            sequence_number = data.vehicle_status_updates.sequence_number\n            LOGGER.debug(\"vehicle_status_updates Sequence: %s\", sequence_number)\n            ack_command = client_pb2.ClientMessage()\n            ack_command.acknowledge_vehicle_status_updates.sequence_number = sequence_number\n            return ack_command\n\n        self._write_debug_output(data, \"unk\")\n        LOGGER.debug(\"Message Type not implemented: %s\", msg_type)\n\n        return None\n\n    async def attempt_connect(self, callback_dataload_complete, coordinator_ref=None):\n        \"\"\"Attempt to connect to the socket.\"\"\"\n        LOGGER.debug(\"attempt_connect\")\n\n        self._on_dataload_complete = callback_dataload_complete\n        self._coordinator_ref = coordinator_ref\n        await self.websocket.async_connect(self.on_data)\n\n    def _build_car(self, received_car_data, update_mode, is_rest_data=False):\n        if received_car_data.get(\"vin\") in self.excluded_cars:\n            LOGGER.debug(\"CAR excluded: %s\", loghelper.Mask_VIN(received_car_data.get(\"vin\")))\n            return\n\n        if received_car_data.get(\"vin\") not in self.cars:\n            LOGGER.info(\n                \"Flow Problem - VepUpdate for unknown car: %s\",\n                loghelper.Mask_VIN(received_car_data.get(\"vin\")),\n            )\n\n            current_car = Car(received_car_data.get(\"vin\"))\n            current_car.licenseplate = received_car_data.get(\"vin\")\n            self.cars[received_car_data.get(\"vin\")] = current_car\n\n        car: Car = self.cars.get(received_car_data.get(\"vin\"), Car(received_car_data.get(\"vin\")))\n\n        car.messages_received.update(\"p\" if update_mode else \"f\")\n        car.last_message_received = int(round(time.time() * 1000))\n\n        if not update_mode:\n            car.last_full_message = received_car_data\n\n        # Set data collection mode based on data source\n        if is_rest_data:\n            car.data_collection_mode = \"pull\"\n        else:\n            car.data_collection_mode = \"push\"\n\n        # For REST data, create synthetic windowStatusOverall if missing\n        if is_rest_data and received_car_data.get(\"attributes\"):\n            if \"windowStatusOverall\" not in received_car_data[\"attributes\"]:\n                self._create_synthetic_window_status_overall(received_car_data, car.finorvin)\n\n        car.odometer = self._get_car_values(\n            received_car_data,\n            car.finorvin,\n            Odometer() if not car.odometer else car.odometer,\n            ODOMETER_OPTIONS,\n            update_mode,\n        )\n\n        car.tires = self._get_car_values(\n            received_car_data,\n            car.finorvin,\n            Tires() if not car.tires else car.tires,\n            TIRE_OPTIONS,\n            update_mode,\n        )\n\n        car.wipers = self._get_car_values(\n            received_car_data,\n            car.finorvin,\n            Wipers() if not car.wipers else car.wipers,\n            WIPER_OPTIONS,\n            update_mode,\n        )\n\n        car.doors = self._get_car_values(\n            received_car_data,\n            car.finorvin,\n            Doors() if not car.doors else car.doors,\n            DOOR_OPTIONS,\n            update_mode,\n        )\n\n        car.location = self._get_car_values(\n            received_car_data,\n            car.finorvin,\n            Location() if not car.location else car.location,\n            LOCATION_OPTIONS,\n            update_mode,\n        )\n\n        car.binarysensors = self._get_car_values(\n            received_car_data,\n            car.finorvin,\n            BinarySensors() if not car.binarysensors else car.binarysensors,\n            BINARY_SENSOR_OPTIONS,\n            update_mode,\n        )\n\n        car.windows = self._get_car_values(\n            received_car_data,\n            car.finorvin,\n            Windows() if not car.windows else car.windows,\n            WINDOW_OPTIONS,\n            update_mode,\n        )\n\n        car.electric = self._get_car_values(\n            received_car_data,\n            car.finorvin,\n            Electric() if not car.electric else car.electric,\n            ELECTRIC_OPTIONS,\n            update_mode,\n        )\n\n        car.auxheat = self._get_car_values(\n            received_car_data,\n            car.finorvin,\n            Auxheat() if not car.auxheat else car.auxheat,\n            AUX_HEAT_OPTIONS,\n            update_mode,\n        )\n\n        car.precond = self._get_car_values(\n            received_car_data,\n            car.finorvin,\n            Precond() if not car.precond else car.precond,\n            PRE_COND_OPTIONS,\n            update_mode,\n        )\n\n        car.caralarm = self._get_car_values(\n            received_car_data,\n            car.finorvin,\n            CarAlarm() if not car.caralarm else car.caralarm,\n            CarAlarm_OPTIONS,\n            update_mode,\n        )\n\n        if not update_mode:\n            car.entry_setup_complete = True\n\n        self.cars[car.finorvin] = car\n\n    def _get_car_values(self, car_detail, vin, class_instance, options, update):\n        # Define handlers for specific options and the generic case\n        option_handlers = {\n            \"max_soc\": self._get_car_values_handle_max_soc,\n            \"chargeflap\": self._get_car_values_handle_chargeflap,\n            \"chargeinletcoupler\": self._get_car_values_handle_chargeinletcoupler,\n            \"chargeinletlock\": self._get_car_values_handle_chargeinletlock,\n            \"chargePrograms\": self._get_car_values_handle_chargePrograms,\n            \"chargingBreakClockTimer\": self._get_car_values_handle_charging_break_clock_timer,\n            \"chargingPowerRestriction\": self._get_car_values_handle_charging_power_restriction,\n            \"endofchargetime\": self._get_car_values_handle_endofchargetime,\n            \"ignitionstate\": self._get_car_values_handle_ignitionstate,\n            \"precondStatus\": self._get_car_values_handle_precond_status,\n            \"temperature_points_frontLeft\": self._get_car_values_handle_temperature_points,\n            \"temperature_points_frontRight\": self._get_car_values_handle_temperature_points,\n            \"temperature_points_rearLeft\": self._get_car_values_handle_temperature_points,\n            \"temperature_points_rearRight\": self._get_car_values_handle_temperature_points,\n        }\n\n        if car_detail is None or not car_detail.get(\"attributes\"):\n            LOGGER.debug(\n                \"get_car_values %s has incomplete update data – attributes not found\",\n                loghelper.Mask_VIN(vin),\n            )\n            return class_instance\n\n        for option in options:\n            # Select the specific handler or the generic handler\n            handler = option_handlers.get(option, self._get_car_values_handle_generic)\n\n            curr_status = handler(car_detail, class_instance, option, update, vin)\n            if curr_status is None:\n                continue\n\n            # Set the value only if the timestamp is newer\n            # curr_timestamp = float(curr_status.timestamp or 0)\n            # car_value_timestamp = float(self._get_car_value(class_instance, option, \"ts\", 0))\n            # if curr_timestamp > car_value_timestamp:\n            #     setattr(class_instance, option, curr_status)\n            # elif curr_timestamp < car_value_timestamp:\n            #     LOGGER.warning(\n            #         \"get_car_values %s received older attribute data for %s. Ignoring value.\",\n            #         loghelper.Mask_VIN(vin),\n            #         option,\n            #     )\n            setattr(class_instance, option, curr_status)\n        return class_instance\n\n    def _get_car_values_handle_generic(self, car_detail, class_instance, option, update, vin: str):\n        curr = car_detail.get(\"attributes\", {}).get(option)\n        if curr:\n            # Simplify value extraction by checking for existing keys\n            value = next(\n                (curr[key] for key in (\"value\", \"int_value\", \"double_value\", \"bool_value\") if key in curr),\n                0,\n            )\n            status = curr.get(\"status\", \"VALID\")\n            time_stamp = curr.get(\"timestamp\", 0)\n            curr_display_value = curr.get(\"display_value\")\n\n            unit_keys = [\n                \"distance_unit\",\n                \"ratio_unit\",\n                \"clock_hour_unit\",\n                \"gas_consumption_unit\",\n                \"pressure_unit\",\n                \"electricity_consumption_unit\",\n                \"combustion_consumption_unit\",\n                \"speed_unit\",\n            ]\n            unit = next((curr[key] for key in unit_keys if key in curr), None)\n\n            return CarAttribute(\n                value=value,\n                retrievalstatus=status,\n                timestamp=time_stamp,\n                display_value=curr_display_value,\n                unit=unit,\n            )\n\n        if not update:\n            # Set status for non-existing values when no update occurs\n            return CarAttribute(0, 4, 0)\n\n        return None\n\n    def _get_car_values_handle_max_soc(\n        self, car_detail, class_instance, option, update, vin: str, use_last_full_message: bool = False\n    ):\n        # Handle the case when the selected charge program changed but chargePrograms is not available in the update message.\n        if not use_last_full_message:\n            attributes = car_detail.get(\"attributes\", {})\n            charge_programs = attributes.get(\"chargePrograms\")\n            if not charge_programs:\n                if not attributes.get(\"selectedChargeProgram\"):\n                    return None\n\n                return self._get_car_values_handle_max_soc(\n                    car_detail, class_instance, option, update, vin, use_last_full_message=True\n                )\n        else:\n            current_car = self.cars.get(vin)\n            if not current_car or not current_car.last_full_message:\n                LOGGER.debug(\n                    \"get_car_values_handle_max_soc - No last_full_message found for car %s\",\n                    loghelper.Mask_VIN(vin),\n                )\n                return None\n            car_detail = current_car.last_full_message or car_detail\n            attributes = car_detail.get(\"attributes\", {})\n            charge_programs = attributes.get(\"chargePrograms\")\n            if not charge_programs:\n                return None\n\n        time_stamp = charge_programs.get(\"timestamp\", 0)\n        charge_programs_value = charge_programs.get(\"charge_programs_value\", {})\n        charge_program_parameters = charge_programs_value.get(\"charge_program_parameters\", [])\n\n        selected_program_index = int(self._get_car_value(class_instance, \"selectedChargeProgram\", \"value\", 0))\n\n        # Ensure the selected index is within bounds\n        if 0 <= selected_program_index < len(charge_program_parameters):\n            program_parameters = charge_program_parameters[selected_program_index]\n            max_soc = program_parameters.get(\"max_soc\")\n            if max_soc is not None:\n                return CarAttribute(\n                    value=max_soc,\n                    retrievalstatus=\"VALID\",\n                    timestamp=time_stamp,\n                    display_value=max_soc,\n                    unit=\"PERCENT\",\n                )\n\n        return None\n\n    def _get_car_values_handle_chargeflap(self, car_detail, class_instance, option, update, vin: str):\n        attributes = car_detail.get(\"attributes\", {})\n        curr = attributes.get(\"chargeFlaps\")\n        if not curr:\n            return None\n\n        charge_flaps_value = curr.get(\"charge_flaps\", {})\n        values = charge_flaps_value.get(\"entries\", [])\n        if not values:\n            return None\n\n        status = curr.get(\"status\", \"VALID\")\n        time_stamp = curr.get(\"timestamp\", 0)\n        value = values[0].get(\"position_state\", None)\n\n        if value is None:\n            return None\n\n        if value == \"CHARGE_FLAPS_POSITION_STATE_OPEN\":\n            value = \"open\"\n        elif value == \"CHARGE_FLAPS_POSITION_STATE_CLOSED\":\n            value = \"closed\"\n        elif value == \"CHARGE_FLAPS_POSITION_STATE_FLAP_PRESSED\":\n            value = \"pressed\"\n        elif value == \"CHARGE_FLAPS_POSITION_STATE_UNKNOWN\":\n            value = STATE_UNKNOWN\n        else:\n            value = STATE_UNKNOWN\n            LOGGER.debug(\n                \"Unknown chargeFlaps position_state value: %s. Please report this value via an github issue.\", value\n            )\n\n        return CarAttribute(\n            value=value,\n            retrievalstatus=status,\n            timestamp=time_stamp,\n            display_value=None,\n            unit=None,\n        )\n\n    def _get_car_values_handle_chargeinletcoupler(self, car_detail, class_instance, option, update, vin: str):\n        attributes = car_detail.get(\"attributes\", {})\n        curr = attributes.get(\"chargeInlets\")\n        if not curr:\n            return None\n\n        values = curr.get(\"charge_inlets\", {}).get(\"entries\", [])\n        if not values:\n            return None\n\n        status = curr.get(\"status\", \"VALID\")\n        time_stamp = curr.get(\"timestamp\", 0)\n        value = values[0].get(\"coupler_state\", None)\n\n        if value is None:\n            return None\n\n        if value == \"CHARGE_INLETS_COUPLER_STATE_PLUGGED\":\n            value = \"plugged\"\n        elif value == \"CHARGE_INLETS_COUPLER_STATE_VEHICLE_PLUGGED\":\n            value = \"vehicle plugged\"\n        elif value == \"CHARGE_INLETS_COUPLER_STATE_VEHICLE_NOT_PLUGGED\":\n            value = \"vehicle not plugged\"\n        elif value == \"CHARGE_INLETS_COUPLER_STATE_DEFECT\":\n            value = \"defect\"\n        elif value == \"CHARGE_INLETS_COUPLER_STATE_UNKNOWN\":\n            value = STATE_UNKNOWN\n        else:\n            value = STATE_UNKNOWN\n            LOGGER.debug(\n                \"Unknown chargeInlets coupler_state value: %s. Please report this value via an github issue.\", value\n            )\n\n        return CarAttribute(\n            value=value,\n            retrievalstatus=status,\n            timestamp=time_stamp,\n            display_value=None,\n            unit=None,\n        )\n\n    def _get_car_values_handle_chargeinletlock(self, car_detail, class_instance, option, update, vin: str):\n        attributes = car_detail.get(\"attributes\", {})\n        curr = attributes.get(\"chargeInlets\")\n        if not curr:\n            return None\n\n        values = curr.get(\"charge_inlets\", {}).get(\"entries\", [])\n        if not values:\n            return None\n\n        status = curr.get(\"status\", \"VALID\")\n        time_stamp = curr.get(\"timestamp\", 0)\n        value = values[0].get(\"lock_state\", None)\n\n        if value is None:\n            return None\n\n        if value == \"CHARGE_INLETS_LOCK_STATE_UNLOCKED\":\n            value = \"unlocked\"\n        elif value == \"CHARGE_INLETS_LOCK_STATE_LOCKED\":\n            value = \"locked\"\n        elif value == \"CHARGE_INLETS_LOCK_STATE_LOCK_STATE_NOT_CLEAR\":\n            value = \"state not clear\"\n        elif value == \"CHARGE_INLETS_LOCK_STATE_NOT_AVAILABLE\":\n            value = \"state not available\"\n        elif value == \"CHARGE_INLETS_LOCK_STATE_UNKNOWN\":\n            value = STATE_UNKNOWN\n        else:\n            value = STATE_UNKNOWN\n            LOGGER.debug(\n                \"Unknown chargeInlets lock_state value: %s. Please report this value via an github issue.\", value\n            )\n\n        return CarAttribute(\n            value=value,\n            retrievalstatus=status,\n            timestamp=time_stamp,\n            display_value=None,\n            unit=None,\n        )\n\n    def _get_car_values_handle_chargePrograms(self, car_detail, class_instance, option, update, vin: str):\n        attributes = car_detail.get(\"attributes\", {})\n        curr = attributes.get(option)\n        if not curr:\n            return None\n\n        charge_programs_value = curr.get(\"charge_programs_value\", {})\n        value = charge_programs_value.get(\"charge_program_parameters\", [])\n        if not value:\n            return None\n\n        status = curr.get(\"status\", \"VALID\")\n        time_stamp = curr.get(\"timestamp\", 0)\n\n        return CarAttribute(\n            value=value,\n            retrievalstatus=status,\n            timestamp=time_stamp,\n            display_value=None,\n            unit=None,\n        )\n\n    def _get_car_values_handle_charging_power_restriction(self, car_detail, class_instance, option, update, vin: str):\n        attributes = car_detail.get(\"attributes\", {})\n        curr = attributes.get(\"chargingPowerRestriction\")\n        if not curr:\n            return None\n\n        charge_flaps_value = curr.get(\"charging_power_restrictions\", {})\n        values = charge_flaps_value.get(\"charging_power_restriction\", [])\n        if not values:\n            return None\n\n        status = curr.get(\"status\", \"VALID\")\n        time_stamp = curr.get(\"timestamp\", 0)\n\n        if len(values) == 0:\n            return None\n\n        value = \", \".join(item.replace(\"CHARGING_POWER_RESTRICTION_\", \"\") for item in values)\n\n        return CarAttribute(\n            value=value,\n            retrievalstatus=status,\n            timestamp=time_stamp,\n            display_value=None,\n            unit=None,\n        )\n\n    def _get_car_values_handle_endofchargetime(self, car_detail, class_instance, option, update, vin: str):\n        # Beginning with CLA 2025 charge end time is part of chargingPredictionMaxSoc\n\n        attributes = car_detail.get(\"attributes\", {})\n\n        chargingPredictionMaxSoc = attributes.get(\"chargingPredictionMaxSoc\", {})\n        charging_prediction_soc = chargingPredictionMaxSoc.get(\"charging_prediction_soc\", {})\n        predicted_end_time = charging_prediction_soc.get(\"predicted_end_time\", None)\n        if predicted_end_time is not None:\n            status = chargingPredictionMaxSoc.get(\"status\", \"VALID\")\n            time_stamp = chargingPredictionMaxSoc.get(\"timestamp\", 0)\n\n            if isinstance(predicted_end_time, datetime):\n                value = predicted_end_time\n            elif isinstance(predicted_end_time, str):\n                try:\n                    value = datetime.strptime(predicted_end_time, \"%Y-%m-%dT%H:%M:%SZ\").replace(tzinfo=timezone.utc)\n                except Exception:\n                    value = None\n            else:\n                value = None\n            if value is not None:\n                return CarAttribute(\n                    value=value,\n                    retrievalstatus=status,\n                    timestamp=time_stamp,\n                    display_value=value,\n                    unit=None,\n                )\n\n        # if chargingPredictionMaxSoc is not available and update is false (not a full_message), we want to check if the car is >= CLA2025 and create the data structure with value unknown\n        # endofchargetime is not present for these cars\n        if not update and not predicted_end_time:\n            current_car = self.cars.get(vin)\n            if not attributes.get(\"endofchargetime\") and not (\n                current_car\n                and current_car.last_full_message\n                and current_car.last_full_message.get(\"attributes\", {}).get(\"endofchargetime\")\n            ):\n                return CarAttribute(\n                    value=STATE_UNKNOWN,\n                    retrievalstatus=\"VALID\",\n                    timestamp=datetime.now().timestamp(),\n                    display_value=STATE_UNKNOWN,\n                    unit=None,\n                )\n\n        # Older cars have two attributes endofchargetime and endofChargeTimeWeekday\n        # endofchargetime is in minutes after midnight\n        try:\n            endofchargetime = attributes.get(\"endofchargetime\", {})\n            if not endofchargetime:\n                return None\n            time_stamp = endofchargetime.get(\"timestamp\", 0)\n            end_time_value = endofchargetime.get(\"int_value\", None)\n            status = endofchargetime.get(\"status\", \"VALID\")\n            if end_time_value is None and status == 3:\n                return CarAttribute(\n                    value=STATE_UNKNOWN,\n                    retrievalstatus=status,\n                    timestamp=time_stamp,\n                    display_value=STATE_UNKNOWN,\n                    unit=None,\n                )\n\n            if end_time_value is None:\n                LOGGER.warning(\n                    \"get_car_values_handle_endofchargetime - endofChargeTime value is None for car %s\",\n                    loghelper.Mask_VIN(vin),\n                )\n                return None\n\n            # endofChargeTimeWeekday is sometimes not present in the update message, we need to get it from the last full message then\n            if \"endofChargeTimeWeekday\" not in attributes:\n                current_car = self.cars.get(vin)\n                if not current_car or not current_car.last_full_message:\n                    LOGGER.debug(\n                        \"get_car_values_handle_endofchargetime - No last_full_message found for car %s\",\n                        loghelper.Mask_VIN(vin),\n                    )\n                    return None\n                car_detail = current_car.last_full_message\n                attributes = car_detail.get(\"attributes\", {})\n\n            local_tz = dt.datetime.now().astimezone().tzinfo\n            end_weekday_attr = attributes.get(\"endofChargeTimeWeekday\", {})\n            end_weekday_value = end_weekday_attr.get(\"int_value\", None)\n            if end_weekday_value is None:\n                # Wenn kein Wochentag vorhanden ist (sehr alte elek. modelle), aus end_time_value ableiten:\n                # Ist die Uhrzeit bereits vergangen -> Wochentag von morgen, sonst von heute.\n                now = dt.datetime.now(local_tz)\n                hour = int(end_time_value) // 60\n                minute = int(end_time_value) % 60\n                target_dt_today = dt.datetime(now.year, now.month, now.day, hour, minute, tzinfo=local_tz)\n                if target_dt_today < now:\n                    end_weekday_value = (now + dt.timedelta(days=1)).weekday()\n                else:\n                    end_weekday_value = now.weekday()\n\n            # Calculate the next occurrence of the given weekday and time in local timezone\n            now = dt.datetime.now(local_tz)\n            # Python's weekday: Monday=0\n            target_weekday = float(end_weekday_value) % 7\n            # Calculate days until next target_weekday\n            days_ahead = (target_weekday - now.weekday()) % 7\n\n            target_date = now + dt.timedelta(days=days_ahead)\n            hour = int(end_time_value) // 60\n            minute = int(end_time_value) % 60\n            dt_with_time = dt.datetime(\n                target_date.year, target_date.month, target_date.day, hour, minute, tzinfo=local_tz\n            )\n\n            return CarAttribute(\n                value=dt_with_time,\n                retrievalstatus=status,\n                timestamp=time_stamp,\n                display_value=dt_with_time.isoformat(),\n                unit=None,\n            )\n        except Exception as e:\n            LOGGER.error(\n                \"Error processing endofchargetime for car %s: %s, %s\",\n                loghelper.Mask_VIN(vin),\n                e,\n                traceback.format_exc(),\n            )\n            return None\n\n    def _get_car_values_handle_charging_break_clock_timer(self, car_detail, class_instance, option, update, vin: str):\n        attributes = car_detail.get(\"attributes\", {})\n        curr = attributes.get(option)\n        if not curr:\n            return None\n\n        charging_timer_value = curr.get(\"chargingbreak_clocktimer_value\", {})\n        value = charging_timer_value.get(\"chargingbreak_clocktimer_entry\")\n        if value is None:\n            return None\n\n        status = curr.get(\"status\", \"VALID\")\n        time_stamp = curr.get(\"timestamp\", 0)\n        curr_display_value = curr.get(\"display_value\")\n\n        return CarAttribute(\n            value=value,\n            retrievalstatus=status,\n            timestamp=time_stamp,\n            display_value=curr_display_value,\n            unit=None,\n        )\n\n    def _get_car_values_handle_ignitionstate(self, car_detail, class_instance, option, update, vin: str):\n        value = self._get_car_values_handle_generic(car_detail, class_instance, option, update, vin)\n        if value:\n            vin = car_detail.get(\"vin\")\n            self.ignition_states[vin] = value.value == \"4\"\n            if vin in self.excluded_cars:\n                self.ignition_states[vin] = False\n\n        return value\n\n    def _get_car_values_handle_precond_status(self, car_detail, class_instance, option, update, vin: str):\n        attributes = car_detail.get(\"attributes\", {})\n\n        # Retrieve attributes with defaults to handle missing keys\n        precond_now_attr = attributes.get(\"precondNow\", {})\n        precond_active_attr = attributes.get(\"precondActive\", {})\n        precond_operating_mode_attr = attributes.get(\"precondOperatingMode\", {})\n\n        # Extract values and convert to boolean where necessary\n        precond_now_value = precond_now_attr.get(\"bool_value\", False)\n        precond_active_value = precond_active_attr.get(\"bool_value\", False)\n        precond_operating_mode_value = precond_operating_mode_attr.get(\"int_value\", 0)\n        precond_operating_mode_bool = int(precond_operating_mode_value) > 0\n\n        # Calculate precondStatus\n        value = precond_now_value or precond_active_value or precond_operating_mode_bool\n\n        # Determine if any of the attributes are present\n        if precond_now_attr or precond_active_attr or precond_operating_mode_attr:\n            status = \"VALID\"\n            time_stamp = max(\n                int(precond_now_attr.get(\"timestamp\", 0)),\n                int(precond_active_attr.get(\"timestamp\", 0)),\n                int(precond_operating_mode_attr.get(\"timestamp\", 0)),\n            )\n            return CarAttribute(\n                value=value,\n                retrievalstatus=status,\n                timestamp=time_stamp,\n                display_value=str(value),\n                unit=None,\n            )\n\n        if not update:\n            # Set status for non-existing values when no update occurs\n            return CarAttribute(False, 4, 0)\n\n        return None\n\n    def _get_car_values_handle_temperature_points(self, car_detail, class_instance, option: str, update, vin: str):\n        curr_zone = option.replace(\"temperature_points_\", \"\")\n        attributes = car_detail.get(\"attributes\", {})\n        temperaturePoints = attributes.get(\"temperaturePoints\")\n        if not temperaturePoints:\n            return None\n\n        time_stamp = temperaturePoints.get(\"timestamp\", 0)\n        temperature_points_value = temperaturePoints.get(\"temperature_points_value\", {})\n        temperature_points = temperature_points_value.get(\"temperature_points\", [])\n\n        for point in temperature_points:\n            if point.get(\"zone\", \"\") == curr_zone:\n                return CarAttribute(\n                    value=point.get(\"temperature\", 0),\n                    retrievalstatus=\"VALID\",\n                    timestamp=time_stamp,\n                    display_value=point.get(\"temperature_display_value\"),\n                    unit=temperaturePoints.get(\"temperature_unit\", None),\n                )\n\n        return None\n\n    def _create_synthetic_window_status_overall(self, car_data, vin):\n        \"\"\"Create a synthetic windowStatusOverall based on individual window statuses for REST data.\"\"\"\n        if not car_data.get(\"attributes\"):\n            return\n\n        # Debug: Log all available window-related attributes\n        # window_attrs_found = [key for key in car_data[\"attributes\"].keys() if \"window\" in key.lower()]\n        # if window_attrs_found:\n        #     LOGGER.debug(\"Available window attributes for %s: %s\", loghelper.Mask_VIN(vin), window_attrs_found)\n        # else:\n        #     LOGGER.debug(\"No window attributes found in REST data for %s\", loghelper.Mask_VIN(vin))\n\n        # Define main window status attributes to check\n        main_window_attrs = [\n            \"windowstatusfrontleft\",\n            \"windowstatusfrontright\",\n            \"windowstatusrearleft\",\n            \"windowstatusrearright\",\n        ]\n\n        # Check individual window statuses\n        window_statuses = []\n        latest_timestamp = 0\n\n        for attr_name in main_window_attrs:\n            if attr_name in car_data[\"attributes\"]:\n                attr_data = car_data[\"attributes\"][attr_name]\n                value = attr_data.get(\"int_value\", 0)\n                timestamp = attr_data.get(\"timestamp\", 0)\n\n                # Convert timestamp to int for comparison\n                try:\n                    timestamp = int(timestamp) if timestamp else 0\n                    latest_timestamp = max(latest_timestamp, timestamp)\n                except (ValueError, TypeError):\n                    pass\n\n                # Add to window statuses if value is available\n                if value is not None:\n                    window_statuses.append(value)\n\n        # Calculate overall status based on individual windows\n        # If we have valid window statuses, determine overall state\n        if window_statuses:\n            # Assume \"CLOSED\" = 0, \"OPEN\" = 1 or similar numeric values\n            # If all windows are closed (0), overall should be \"CLOSED\"\n            # If any window is open (>0), overall should be \"OPEN\"\n            try:\n                numeric_statuses = [int(status) for status in window_statuses if status is not None]\n                if numeric_statuses:\n                    overall_value = \"OPEN\" if any(status != 2 for status in numeric_statuses) else \"CLOSED\"\n                else:\n                    overall_value = \"CLOSED\"  # Default to closed if no valid data\n            except (ValueError, TypeError):\n                # If values are not numeric, try string comparison\n                overall_value = \"CLOSED\"\n        else:\n            # No individual window data available, default to CLOSED\n            overall_value = \"CLOSED\"\n\n        # Create the synthetic windowStatusOverall attribute\n        car_data[\"attributes\"][\"windowStatusOverall\"] = {\n            \"timestamp\": str(latest_timestamp) if latest_timestamp > 0 else \"0\",\n            \"bool_value\": overall_value == \"CLOSED\",\n            \"status\": \"VALID\",  # Use same status as other synthetic attributes\n            \"timestamp_in_ms\": str(latest_timestamp * 1000 + 223),\n        }\n\n        LOGGER.debug(\n            \"Created synthetic windowStatusOverall for %s: %s (based on %d individual windows)\",\n            loghelper.Mask_VIN(vin),\n            overall_value,\n            len(window_statuses),\n        )\n\n    def _get_car_value(self, class_instance, object_name, attrib_name, default_value):\n        return getattr(\n            getattr(class_instance, object_name, default_value),\n            attrib_name,\n            default_value,\n        )\n\n    def _process_rest_vep_update(self, data):\n        LOGGER.debug(\"Start _process_rest_vep_update\")\n\n        self._write_debug_output(data, \"rfu\")\n        # Don't understand the protobuf dict errors --> convert to json\n        vep_json = json.loads(MessageToJson(data, preserving_proto_field_name=True))\n\n        # Check if this is a nested vepUpdates structure or a direct VIN structure\n        if \"vepUpdates\" in vep_json and \"updates\" in vep_json[\"vepUpdates\"]:\n            # This is a multi-car update structure\n            cars = vep_json[\"vepUpdates\"][\"updates\"]\n            for vin in cars:\n                if vin in self.excluded_cars:\n                    continue\n                current_car = cars.get(vin)\n                if current_car:\n                    self._build_car(current_car, update_mode=False, is_rest_data=True)\n        else:\n            # This is a single car structure\n            vin = vep_json.get(\"vin\", None)\n            if not vin:\n                LOGGER.debug(\"No VIN found in VEPUpdate data: %s\", vep_json)\n                return\n            self._build_car(vep_json, update_mode=False, is_rest_data=True)\n\n        if not self._first_vepupdates_processed:\n            self._vepupdates_time_first_message = datetime.now()\n            self._first_vepupdates_processed = True\n            self._hass.loop.call_later(\n                30, lambda: self._hass.async_add_executor_job(self._safe_create_on_dataload_complete_task)\n            )\n\n        self._build_car(vep_json, update_mode=False)\n        if self._dataload_complete_fired:\n            current_car = self.cars.get(vin)\n            current_car.data_collection_mode = \"pull\"\n\n            if current_car:\n                current_car.publish_updates()\n\n        if not self._dataload_complete_fired:\n            fire_complete_event: bool = True\n            for car in self.cars.values():\n                if not car.entry_setup_complete:\n                    fire_complete_event = False\n                LOGGER.debug(\n                    \"_process_vep_updates - %s - complete: %s - %s\",\n                    loghelper.Mask_VIN(car.finorvin),\n                    car.entry_setup_complete,\n                    car.messages_received,\n                )\n            if fire_complete_event:\n                LOGGER.debug(\"_process_vep_updates - all completed - fire event: _on_dataload_complete\")\n                self._hass.async_create_task(self._on_dataload_complete())\n                self._dataload_complete_fired = True\n\n    def _process_vep_updates(self, data):\n        LOGGER.debug(\"Start _process_vep_updates\")\n\n        self._write_debug_output(data, \"vep\")\n\n        # Don't understand the protobuf dict errors --> convert to json\n        vep_json = json.loads(MessageToJson(data, preserving_proto_field_name=True))\n        cars = vep_json[\"vepUpdates\"][\"updates\"]\n\n        if not self._first_vepupdates_processed:\n            self._vepupdates_time_first_message = datetime.now()\n            self._first_vepupdates_processed = True\n            self._hass.loop.call_later(\n                30, lambda: self._hass.async_add_executor_job(self._safe_create_on_dataload_complete_task)\n            )\n\n        for vin in cars:\n            if vin in self.excluded_cars:\n                continue\n\n            current_car = cars.get(vin)\n\n            if DEBUG_SIMULATE_PARTIAL_UPDATES_ONLY and current_car.get(\"full_update\", False) is True:\n                current_car[\"full_update\"] = False\n                LOGGER.debug(\n                    \"DEBUG_SIMULATE_PARTIAL_UPDATES_ONLY mode. %s\",\n                    loghelper.Mask_VIN(vin),\n                )\n\n            if current_car.get(\"full_update\") is True:\n                LOGGER.debug(\"Full Update. %s\", loghelper.Mask_VIN(vin))\n                if not self._disable_rlock:\n                    with self.__lock:\n                        self._build_car(current_car, update_mode=False)\n                else:\n                    self._build_car(current_car, update_mode=False)\n\n            else:\n                LOGGER.debug(\"Partial Update. %s\", loghelper.Mask_VIN(vin))\n                if not self._disable_rlock:\n                    with self.__lock:\n                        self._build_car(current_car, update_mode=True)\n                else:\n                    self._build_car(current_car, update_mode=True)\n\n            if self._dataload_complete_fired:\n                current_car = self.cars.get(vin)\n                current_car.data_collection_mode = \"push\"\n\n                if current_car:\n                    current_car.publish_updates()\n\n                    # Check for newly available sensors after vep_update\n                    if self._coordinator_ref:\n                        self._hass.async_create_task(self._coordinator_ref.check_missing_sensors_for_vin(vin))\n\n        if not self._dataload_complete_fired:\n            fire_complete_event: bool = True\n            for car in self.cars.values():\n                if not car.entry_setup_complete:\n                    fire_complete_event = False\n                LOGGER.debug(\n                    \"_process_vep_updates - %s - complete: %s - %s\",\n                    loghelper.Mask_VIN(car.finorvin),\n                    car.entry_setup_complete,\n                    car.messages_received,\n                )\n            if fire_complete_event:\n                LOGGER.debug(\"_process_vep_updates - all completed - fire event: _on_dataload_complete\")\n                self._hass.async_create_task(self._on_dataload_complete())\n                self._dataload_complete_fired = True\n\n    def _process_assigned_vehicles(self, data):\n        if not self._dataload_complete_fired:\n            LOGGER.debug(\"Start _process_assigned_vehicles\")\n\n            # self._write_debug_output(data, \"asv\")\n\n            if not self._disable_rlock:\n                with self.__lock:\n                    for vin in data.assigned_vehicles.vins:\n                        if vin in self.excluded_cars:\n                            continue\n\n                        _car = self.cars.get(vin)\n\n                        if _car is None:\n                            current_car = Car(vin)\n                            current_car.licenseplate = vin\n                            self.cars[vin] = current_car\n            else:\n                for vin in data.assigned_vehicles.vins:\n                    if vin in self.excluded_cars:\n                        continue\n\n                    _car = self.cars.get(vin)\n\n                    if _car is None:\n                        current_car = Car(vin)\n                        current_car.licenseplate = vin\n                        self.cars[vin] = current_car\n\n            current_time = int(round(time.time() * 1000))\n            for key, value in self.cars.items():\n                LOGGER.debug(\n                    \"_process_assigned_vehicles - %s - %s - %s - %s\",\n                    loghelper.Mask_VIN(key),\n                    value.entry_setup_complete,\n                    value.messages_received,\n                    current_time - value.last_message_received.value.timestamp(),\n                )\n\n    def _process_apptwin_command_status_updates_by_vin(self, data):\n        LOGGER.debug(\"Start _process_assigned_vehicles\")\n\n        # Don't understand the protobuf dict errors --> convert to json\n        apptwin_json = json.loads(MessageToJson(data, preserving_proto_field_name=True))\n\n        self._write_debug_output(data, \"acr\")\n\n        if apptwin_json[\"apptwin_command_status_updates_by_vin\"]:\n            if apptwin_json[\"apptwin_command_status_updates_by_vin\"][\"updates_by_vin\"]:\n                car = list(apptwin_json[\"apptwin_command_status_updates_by_vin\"][\"updates_by_vin\"].keys())[0]\n                car = apptwin_json[\"apptwin_command_status_updates_by_vin\"][\"updates_by_vin\"][car]\n                vin = car.get(\"vin\", None)\n                if vin:\n                    if car[\"updates_by_pid\"]:\n                        command = list(car[\"updates_by_pid\"].keys())[0]\n                        command = car[\"updates_by_pid\"][command]\n                        if command:\n                            command_type = command.get(\"type\")\n                            command_state = command.get(\"state\")\n                            command_error_code = \"\"\n                            command_error_message = \"\"\n                            if command.get(\"errors\"):\n                                for err in command[\"errors\"]:\n                                    command_error_code = err.get(\"code\")\n                                    command_error_message = err.get(\"message\")\n                                    LOGGER.warning(\n                                        \"Car action: %s failed. error_code: %s, error_message: %s\",\n                                        command_type,\n                                        command_error_code,\n                                        command_error_message,\n                                    )\n\n                            current_car = self.cars.get(vin)\n\n                            if current_car:\n                                current_car.last_command_type = command_type\n                                current_car.last_command_state = command_state\n                                current_car.last_command_error_code = command_error_code\n                                current_car.last_command_error_message = command_error_message\n                                current_car.last_command_time_stamp = command.get(\"timestamp_in_ms\", 0)\n\n                                current_car.publish_updates()\n\n    async def charge_program_configure(self, vin: str, program: int, max_soc: None | int = None) -> None:\n        \"\"\"Send the selected charge program to the car.\"\"\"\n        if not self._is_car_feature_available(vin, \"CHARGE_PROGRAM_CONFIGURE\"):\n            raise ServiceValidationError(\n                \"Can't set the charge program. Feature CHARGE_PROGRAM_CONFIGURE not availabe for this car.\"\n            )\n\n        LOGGER.debug(\"Start charge_program_configure\")\n        message = client_pb2.ClientMessage()\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        charge_programm = pb2_commands.ChargeProgramConfigure()\n        charge_programm.charge_program = program\n        if max_soc is not None:\n            charge_programm.max_soc.value = max_soc\n        else:\n            try:\n                current_charge_programs = getattr(self.cars.get(vin).electric, \"chargePrograms\", None)\n                if current_charge_programs:\n                    charge_programm.max_soc.value = current_charge_programs.value[program].get(\"max_soc\")\n            except (KeyError, IndexError, TypeError, AttributeError) as err:\n                LOGGER.warning(\n                    \"charge_program_configure - Error: %s - %s\",\n                    err,\n                    getattr(self.cars.get(vin).electric, \"chargePrograms\", None),\n                )\n\n        message.commandRequest.charge_program_configure.CopyFrom(charge_programm)\n        LOGGER.debug(\n            \"charge_program_configure - vin: %s - program: %s - max_soc: %s\",\n            loghelper.Mask_VIN(vin),\n            charge_programm.charge_program,\n            charge_programm.max_soc.value,\n        )\n        await self.execute_car_command(message)\n        LOGGER.debug(\"End charge_program_configure for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def charging_break_clocktimer_configure(\n        self,\n        vin: str,\n        status_t1: str,\n        start_t1: datetime.timedelta,\n        stop_t1: datetime.timedelta,\n        status_t2: str,\n        start_t2: datetime.timedelta,\n        stop_t2: datetime.timedelta,\n        status_t3: str,\n        start_t3: datetime.timedelta,\n        stop_t3: datetime.timedelta,\n        status_t4: str,\n        start_t4: datetime.timedelta,\n        stop_t4: datetime.timedelta,\n    ) -> None:\n        \"\"\"Send the charging_break_clocktimer_configure command to the car.\"\"\"\n        if not self._is_car_feature_available(vin, \"chargingClockTimer\"):\n            LOGGER.warning(\n                \"Can't send charging_break_clocktimer_configure for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        config = pb2_commands.ChargingBreakClocktimerConfigure()\n        entry_set: bool = False\n\n        if status_t1 and start_t1 is not None and stop_t1 is not None and status_t1 in (\"active\", \"inactive\"):\n            t1 = config.chargingbreak_clocktimer_configure_entry.add()\n            t1.timerId = 1\n            if status_t1 == \"active\":\n                t1.action = pb2_commands.ChargingBreakClockTimerEntryStatus.ACTIVE\n            else:\n                t1.action = pb2_commands.ChargingBreakClockTimerEntryStatus.INACTIVE\n\n            t1.startTimeHour = start_t1.seconds // 3600\n            t1.startTimeMinute = (start_t1.seconds % 3600) // 60\n            t1.endTimeHour = stop_t1.seconds // 3600\n            t1.endTimeMinute = (stop_t1.seconds % 3600) // 60\n            entry_set = True\n\n        if status_t2 and start_t2 is not None and stop_t2 is not None and status_t2 in (\"active\", \"inactive\"):\n            t2 = config.chargingbreak_clocktimer_configure_entry.add()\n            t2.timerId = 2\n            if status_t2 == \"active\":\n                t2.action = pb2_commands.ChargingBreakClockTimerEntryStatus.ACTIVE\n            else:\n                t2.action = pb2_commands.ChargingBreakClockTimerEntryStatus.INACTIVE\n\n            t2.startTimeHour = start_t2.seconds // 3600\n            t2.startTimeMinute = (start_t2.seconds % 3600) // 60\n            t2.endTimeHour = stop_t2.seconds // 3600\n            t2.endTimeMinute = (stop_t2.seconds % 3600) // 60\n            entry_set = True\n\n        if status_t3 and start_t3 is not None and stop_t3 is not None and status_t3 in (\"active\", \"inactive\"):\n            t3 = config.chargingbreak_clocktimer_configure_entry.add()\n            t3.timerId = 3\n            if status_t3 == \"active\":\n                t3.action = pb2_commands.ChargingBreakClockTimerEntryStatus.ACTIVE\n            else:\n                t3.action = pb2_commands.ChargingBreakClockTimerEntryStatus.INACTIVE\n\n            t3.startTimeHour = start_t3.seconds // 3600\n            t3.startTimeMinute = (start_t3.seconds % 3600) // 60\n            t3.endTimeHour = stop_t3.seconds // 3600\n            t3.endTimeMinute = (stop_t3.seconds % 3600) // 60\n            entry_set = True\n\n        if status_t4 and start_t4 is not None and stop_t4 is not None and status_t4 in (\"active\", \"inactive\"):\n            t4 = config.chargingbreak_clocktimer_configure_entry.add()\n            t4.timerId = 4\n            if status_t4 == \"active\":\n                t4.action = pb2_commands.ChargingBreakClockTimerEntryStatus.ACTIVE\n            else:\n                t4.action = pb2_commands.ChargingBreakClockTimerEntryStatus.INACTIVE\n\n            t4.startTimeHour = start_t4.seconds // 3600\n            t4.startTimeMinute = (start_t4.seconds % 3600) // 60\n            t4.endTimeHour = stop_t4.seconds // 3600\n            t4.endTimeMinute = (stop_t4.seconds % 3600) // 60\n            entry_set = True\n\n        if entry_set:\n            message.commandRequest.chargingbreak_clocktimer_configure.CopyFrom(config)\n            await self.execute_car_command(message)\n            LOGGER.info(\n                \"End charging_break_clocktimer_configure for vin %s\",\n                loghelper.Mask_VIN(vin),\n            )\n        else:\n            LOGGER.info(\n                \"End charging_break_clocktimer_configure for vin %s - No actions\",\n                loghelper.Mask_VIN(vin),\n            )\n\n        return\n\n    async def doors_unlock(self, vin: str, pin: str = \"\"):\n        \"\"\"Send the doors unlock command to the car.\"\"\"\n        if not self._is_car_feature_available(vin, \"DOORS_UNLOCK\"):\n            LOGGER.warning(\n                \"Can't unlock car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        if pin and pin.strip():\n            LOGGER.debug(\"Start unlock with user provided pin\")\n            await self.doors_unlock_with_pin(vin, pin)\n            return\n\n        if not self.pin:\n            LOGGER.warning(\n                \"Can't unlock car %s. PIN not set. Please set the PIN -> Integration, Options \",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        await self.doors_unlock_with_pin(vin, self.pin)\n\n    async def doors_unlock_with_pin(self, vin: str, pin: str):\n        \"\"\"Send the doors unlock command to the car.\"\"\"\n        LOGGER.info(\"Start Doors_unlock_with_pin for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, \"DOORS_UNLOCK\"):\n            LOGGER.warning(\n                \"Can't unlock car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        if not pin:\n            LOGGER.warning(\"Can't unlock car %s. Pin is required.\", loghelper.Mask_VIN(vin))\n            return\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        message.commandRequest.doors_unlock.pin = pin\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End Doors_unlock for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def doors_lock(self, vin: str):\n        \"\"\"Send the doors lock command to the car.\"\"\"\n        LOGGER.info(\"Start Doors_lock for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, \"DOORS_LOCK\"):\n            LOGGER.warning(\n                \"Can't lock car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        message.commandRequest.doors_lock.doors.extend([])\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End Doors_lock for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def download_images(self, vin: str):\n        \"\"\"Download the car related images.\"\"\"\n        LOGGER.info(\"Start download_images for vin %s\", loghelper.Mask_VIN(vin))\n\n        download_path = self._hass.config.path(DEFAULT_DOWNLOAD_PATH)\n        target_file_name = Path(download_path, f\"{vin}.zip\")\n        zip_file = await self.webapi.download_images(vin)\n        if zip_file:\n            Path(download_path).mkdir(parents=True, exist_ok=True)\n\n            def save_images() -> None:\n                with Path(target_file_name).open(mode=\"wb\") as zf:\n                    zf.write(zip_file)\n\n            try:\n                await self._hass.async_add_executor_job(save_images)\n            except OSError as err:\n                LOGGER.error(\"Can't write %s: %s\", target_file_name, err)\n\n        LOGGER.info(\"End download_images for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def auxheat_configure(self, vin: str, time_selection: int, time_1: int, time_2: int, time_3: int):\n        \"\"\"Send the auxheat configure command to the car.\"\"\"\n        LOGGER.info(\"Start auxheat_configure for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, feature_list=[\"AUXHEAT_CONFIGURE\", \"auxHeat\"]):\n            LOGGER.warning(\n                \"Can't start auxheat_configure for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        auxheat_configure = pb2_commands.AuxheatConfigure()\n        auxheat_configure.time_selection = time_selection\n        auxheat_configure.time_1 = time_1\n        auxheat_configure.time_2 = time_2\n        auxheat_configure.time_3 = time_3\n        message.commandRequest.auxheat_configure.CopyFrom(auxheat_configure)\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End auxheat_configure for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def auxheat_start(self, vin: str):\n        \"\"\"Send the auxheat start command to the car.\"\"\"\n        LOGGER.info(\"Start auxheat start for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, feature_list=[\"AUXHEAT_START\", \"auxHeat\"]):\n            LOGGER.warning(\n                \"Can't start auxheat for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        auxheat_start = pb2_commands.AuxheatStart()\n        message.commandRequest.auxheat_start.CopyFrom(auxheat_start)\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End auxheat start for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def auxheat_stop(self, vin: str):\n        \"\"\"Send the auxheat stop command to the car.\"\"\"\n        LOGGER.info(\"Start auxheat_stop for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, feature_list=[\"AUXHEAT_STOP\", \"auxHeat\"]):\n            LOGGER.warning(\n                \"Can't stop auxheat for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        auxheat_stop = pb2_commands.AuxheatStop()\n        message.commandRequest.auxheat_stop.CopyFrom(auxheat_stop)\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End auxheat_stop for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def battery_max_soc_configure(self, vin: str, max_soc: int, charge_program: int = 0):\n        \"\"\"Send the maxsoc configure command to the car.\"\"\"\n        LOGGER.info(\n            \"Start battery_max_soc_configure to %s for vin %s and program %s\",\n            max_soc,\n            loghelper.Mask_VIN(vin),\n            charge_program,\n        )\n\n        if not self._is_car_feature_available(vin, \"BATTERY_MAX_SOC_CONFIGURE\") and not self._is_car_feature_available(\n            vin, \"CHARGING_CONFIGURE\"\n        ):\n            LOGGER.warning(\n                \"Can't configure battery_max_soc for car %s. Features BATTERY_MAX_SOC_CONFIGURE or CHARGING_CONFIGURE not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n\n        if self._is_car_feature_available(vin, \"CHARGING_CONFIGURE\"):\n            LOGGER.debug(\n                \"CHARGING_CONFIGURE=true for car %s. Will use ChargingConfigure.\",\n                loghelper.Mask_VIN(vin),\n            )\n            charging_config = pb2_commands.ChargingConfigure()\n            charging_config.max_soc.value = max_soc\n            # charging_config.charge_program = charge_program\n            message.commandRequest.charging_configure.CopyFrom(charging_config)\n        else:\n            max_soc = max(max_soc, 50)\n            charge_program_config = pb2_commands.ChargeProgramConfigure()\n            charge_program_config.max_soc.value = max_soc\n            charge_program_config.charge_program = charge_program\n            message.commandRequest.charge_program_configure.CopyFrom(charge_program_config)\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End battery_max_soc_configure for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def engine_start(self, vin: str, pin: str = \"\"):\n        \"\"\"Send the engine start command to the car.\"\"\"\n        LOGGER.info(\"Start engine start for vin %s\", loghelper.Mask_VIN(vin))\n\n        if pin and pin.strip():\n            _pin = pin\n        else:\n            _pin = self.pin\n\n        if not _pin:\n            LOGGER.warning(\n                \"Can't start the car %s. PIN not given. Please set the PIN -> Integration, Options or use the optional parameter of the service.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        if not self._is_car_feature_available(vin, \"ENGINE_START\"):\n            LOGGER.warning(\n                \"Can't start engine for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        message.commandRequest.engine_start.pin = _pin\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End engine start for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def engine_stop(self, vin: str):\n        \"\"\"Send the engine stop command to the car.\"\"\"\n        LOGGER.info(\"Start engine_stop for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, \"ENGINE_STOP\"):\n            LOGGER.warning(\n                \"Can't stop engine for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        engine_stop = pb2_commands.EngineStop()\n        message.commandRequest.engine_stop.CopyFrom(engine_stop)\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End engine_stop for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def hv_battery_start_conditioning(self, vin: str):\n        \"\"\"Send the hv battery conditioning start command to the car.\"\"\"\n        LOGGER.info(\"Start hv_battery_start_conditioning for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, \"HVBATTERY_START_CONDITIONING\"):\n            LOGGER.warning(\n                \"Can't start hv battery conditioning for car %s. Feature not available for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        hv_battery_conditioning_start = pb2_commands.HvBatteryStartConditioning()\n        message.commandRequest.hv_battery_start_conditioning.CopyFrom(hv_battery_conditioning_start)\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End hv_battery_start_conditioning for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def hv_battery_stop_conditioning(self, vin: str):\n        \"\"\"Send the hv battery conditioning stop command to the car.\"\"\"\n        LOGGER.info(\"Start hv_battery_stop_conditioning for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, \"HVBATTERY_STOP_CONDITIONING\"):\n            LOGGER.warning(\n                \"Can't stop hv battery conditioning for car %s. Feature not available for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        hv_battery_conditioning_stop = pb2_commands.HvBatteryStopConditioning()\n        message.commandRequest.hv_battery_stop_conditioning.CopyFrom(hv_battery_conditioning_stop)\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End hv_battery_stop_conditioning for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def send_route_to_car(\n        self,\n        vin: str,\n        title: str,\n        latitude: float,\n        longitude: float,\n        city: str,\n        postcode: str,\n        street: str,\n    ):\n        \"\"\"Send a route target to the car.\"\"\"\n        LOGGER.info(\"Start send_route_to_car for vin %s\", loghelper.Mask_VIN(vin))\n\n        await self.webapi.send_route_to_car(vin, title, latitude, longitude, city, postcode, street)\n\n        LOGGER.info(\"End send_route_to_car for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def sigpos_start(self, vin: str):\n        \"\"\"Send a sigpos command to the car.\"\"\"\n        LOGGER.info(\"Start sigpos_start for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, \"SIGPOS_START\"):\n            LOGGER.warning(\n                \"Can't start signaling for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        message.commandRequest.sigpos_start.light_type = 1\n        message.commandRequest.sigpos_start.sigpos_type = 0\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End sigpos_start for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def sunroof_open(self, vin: str, pin: str = \"\"):\n        \"\"\"Send a sunroof open command to the car.\"\"\"\n        LOGGER.info(\"Start sunroof_open for vin %s\", loghelper.Mask_VIN(vin))\n\n        if pin and pin.strip():\n            _pin = pin\n        else:\n            _pin = self.pin\n\n        if not _pin:\n            LOGGER.warning(\n                \"Can't open the sunroof - car %s. PIN not given. Please set the PIN -> Integration, Options or use the optional parameter of the service.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        if not self._is_car_feature_available(vin, \"SUNROOF_OPEN\"):\n            LOGGER.warning(\n                \"Can't open the sunroof for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        message.commandRequest.sunroof_open.pin = _pin\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End sunroof_open for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def sunroof_tilt(self, vin: str, pin: str = \"\"):\n        \"\"\"Send a sunroof tilt command to the car.\"\"\"\n        LOGGER.info(\"Start sunroof_tilt for vin %s\", loghelper.Mask_VIN(vin))\n\n        if pin and pin.strip():\n            _pin = pin\n        else:\n            _pin = self.pin\n\n        if not _pin:\n            LOGGER.warning(\n                \"Can't tilt the sunroof - car %s. PIN not given. Please set the PIN -> Integration, Options or use the optional parameter of the service.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        if not self._is_car_feature_available(vin, \"SUNROOF_LIFT\"):\n            LOGGER.warning(\n                \"Can't tilt the sunroof for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        message.commandRequest.sunroof_lift.pin = _pin\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End sunroof_tilt for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def sunroof_close(self, vin: str):\n        \"\"\"Send a sunroof close command to the car.\"\"\"\n        LOGGER.info(\"Start sunroof_close for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, \"SUNROOF_CLOSE\"):\n            LOGGER.warning(\n                \"Can't close the sunroof for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        sunroof_close = pb2_commands.SunroofClose()\n        message.commandRequest.sunroof_close.CopyFrom(sunroof_close)\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End sunroof_close for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def preconditioning_configure_seats(\n        self,\n        vin: str,\n        front_left: bool,\n        front_right: bool,\n        rear_left: bool,\n        rear_right: bool,\n    ):\n        \"\"\"Send a preconditioning seat configuration command to the car.\"\"\"\n        LOGGER.info(\"Start preconditioning_configure_seats for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, \"ZEV_PRECONDITION_CONFIGURE_SEATS\"):\n            LOGGER.warning(\n                \"Can't configure seats for PreCond for car %s. Feature %s not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n                \"ZEV_PRECONDITION_CONFIGURE_SEATS\",\n            )\n            return\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        message.commandRequest.zev_precondition_configure_seats.front_left = front_left\n        message.commandRequest.zev_precondition_configure_seats.front_right = front_right\n        message.commandRequest.zev_precondition_configure_seats.rear_left = rear_left\n        message.commandRequest.zev_precondition_configure_seats.rear_right = rear_right\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End preconditioning_configure_seats for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def preheat_start(self, vin: str):\n        \"\"\"Send a preconditioning start command to the car.\"\"\"\n        LOGGER.info(\"Start preheat_start for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, \"ZEV_PRECONDITIONING_START\"):\n            LOGGER.warning(\n                \"Can't start PreCond for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        message.commandRequest.zev_preconditioning_start.departure_time = 0\n        message.commandRequest.zev_preconditioning_start.type = pb2_commands.ZEVPreconditioningType.now\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End preheat_start for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def preheat_start_immediate(self, vin: str):\n        \"\"\"Send a preconditioning immediatestart command to the car.\"\"\"\n        LOGGER.info(\"Start preheat_start_immediate for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, \"ZEV_PRECONDITIONING_START\"):\n            LOGGER.warning(\n                \"Can't start PreCond for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        message.commandRequest.zev_preconditioning_start.departure_time = 0\n        message.commandRequest.zev_preconditioning_start.type = pb2_commands.ZEVPreconditioningType.immediate\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End preheat_start_immediate for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def preheat_start_universal(self, vin: str) -> None:\n        \"\"\"Turn on preheat universally for any car model.\"\"\"\n        if self._is_car_feature_available(vin, \"precondNow\"):\n            await self.preheat_start(vin)\n        else:\n            await self.preheat_start_immediate(vin)\n\n    async def preheat_start_departure_time(self, vin: str, departure_time: int):\n        \"\"\"Send a preconditioning start by time command to the car.\"\"\"\n        LOGGER.info(\"Start preheat_start_departure_time for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, \"ZEV_PRECONDITIONING_START\"):\n            LOGGER.warning(\n                \"Can't start PreCond for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        message.commandRequest.zev_preconditioning_start.departure_time = departure_time\n        message.commandRequest.zev_preconditioning_start.type = pb2_commands.ZEVPreconditioningType.departure\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End preheat_start_departure_time for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def preheat_stop(self, vin: str):\n        \"\"\"Send a preconditioning stop command to the car.\"\"\"\n        LOGGER.info(\"Start preheat_stop for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, \"ZEV_PRECONDITIONING_STOP\"):\n            LOGGER.warning(\n                \"Can't stop PreCond for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        message.commandRequest.zev_preconditioning_stop.type = pb2_commands.ZEVPreconditioningType.now\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End preheat_stop for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def preheat_stop_departure_time(self, vin: str):\n        \"\"\"Disable scheduled departure preconditioning.\"\"\"\n        LOGGER.info(\"Start preheat_stop_departure_time for vin %s\", loghelper.Mask_VIN(vin))\n        await self.preconditioning_configure(vin, departure_time_mode=0)\n        LOGGER.info(\"End preheat_stop_departure_time for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def preconditioning_configure(self, vin: str, departure_time_mode: int = 0, departure_time: int = 0):\n        \"\"\"Configure preconditioning departure time mode.\n\n        departure_time_mode: 0=DISABLED, 1=SINGLE_DEPARTURE, 2=WEEKLY_DEPARTURE\n            Note: WEEKLY_DEPARTURE (mode 2) is not supported on all car models\n            (e.g., EQB supports only DISABLED and SINGLE_DEPARTURE)\n        departure_time: Minutes after midnight (0-1439), only used when mode > 0\n        \"\"\"\n        LOGGER.info(\n            \"Start preconditioning_configure for vin %s with mode %s\", loghelper.Mask_VIN(vin), departure_time_mode\n        )\n\n        if not self._is_car_feature_available(vin, \"ZEV_PRECONDITION_CONFIGURE\"):\n            LOGGER.warning(\n                \"Can't configure PreCond for car %s. Feature not available for this car\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        message.commandRequest.zev_precondition_configure.departure_time_mode = departure_time_mode\n        if departure_time_mode > 0:\n            message.commandRequest.zev_precondition_configure.departure_time = departure_time\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End preconditioning_configure for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def temperature_configure(\n        self,\n        vin: str,\n        front_left: int | None = None,\n        front_right: int | None = None,\n        rear_left: int | None = None,\n        rear_right: int | None = None,\n    ):\n        \"\"\"Send a temperature_configure  command to the car.\"\"\"\n        LOGGER.info(\"Start temperature_configure for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, \"TEMPERATURE_CONFIGURE\"):\n            LOGGER.warning(\n                \"Can't configure the temperature zones for car %s. Feature %s not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n                \"TEMPERATURE_CONFIGURE\",\n            )\n            return\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n\n        config = pb2_commands.TemperatureConfigure()\n        entry_set: bool = False\n\n        car = self.cars.get(vin)\n\n        if front_left or front_right or rear_left or rear_right:\n            zone_front_left = config.temperature_points.add()\n            zone_front_left.zone = 1\n            if front_left:\n                zone_front_left.temperature_in_celsius = front_left\n            elif car.precond.temperature_points_frontLeft:\n                zone_front_left.temperature_in_celsius = car.precond.temperature_points_frontLeft.value\n            entry_set = True\n\n        if front_right or rear_left or rear_right:\n            zone_front_right = config.temperature_points.add()\n            zone_front_right.zone = 2\n            if front_right:\n                zone_front_right.temperature_in_celsius = front_right\n            elif car.precond.temperature_points_frontRight:\n                zone_front_right.temperature_in_celsius = car.precond.temperature_points_frontRight.value\n            entry_set = True\n\n        if rear_left or rear_right:\n            zone_rear_left = config.temperature_points.add()\n            zone_rear_left.zone = 4\n            if rear_left:\n                zone_rear_left.temperature_in_celsius = rear_left\n            elif car.precond.temperature_points_rearLeft:\n                zone_rear_left.temperature_in_celsius = car.precond.temperature_points_rearLeft.value\n            entry_set = True\n\n        if rear_right or rear_left:\n            zone_rear_right = config.temperature_points.add()\n            zone_rear_right.zone = 5\n            if rear_right:\n                zone_rear_right.temperature_in_celsius = rear_right\n            elif car.precond.temperature_points_rearRight:\n                zone_rear_right.temperature_in_celsius = car.precond.temperature_points_rearRight.value\n            entry_set = True\n\n        if entry_set:\n            message.commandRequest.temperature_configure.CopyFrom(config)\n            self._hass.async_add_executor_job(\n                self.write_debug_json_output,\n                MessageToJson(message, preserving_proto_field_name=True),\n                \"out_temperature_\",\n                False,\n            )\n            await self.execute_car_command(message)\n            LOGGER.info(\"End temperature_configure for vin %s\", loghelper.Mask_VIN(vin))\n        else:\n            LOGGER.info(\n                \"End temperature_configure for vin %s - No actions\",\n                loghelper.Mask_VIN(vin),\n            )\n\n    async def windows_open(self, vin: str, pin: str = \"\"):\n        \"\"\"Send a window open command to the car.\"\"\"\n        LOGGER.info(\"Start windows_open for vin %s\", loghelper.Mask_VIN(vin))\n\n        _pin: str = None\n\n        if not self._is_car_feature_available(vin, \"WINDOWS_OPEN\"):\n            LOGGER.warning(\n                \"Can't open the windows for car %s. Feature not marked as available for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        if pin and pin.strip():\n            _pin = pin\n        else:\n            _pin = self.pin\n\n        if not _pin:\n            LOGGER.warning(\n                \"Can't open the windows - car %s. PIN not given. Please set the PIN -> Integration, Options or use the optional parameter of the service.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        message.commandRequest.windows_open.pin = _pin\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End windows_open for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def windows_close(self, vin: str):\n        \"\"\"Send a window close command to the car.\"\"\"\n        LOGGER.info(\"Start windows_close for vin %s\", loghelper.Mask_VIN(vin))\n\n        if not self._is_car_feature_available(vin, \"WINDOWS_CLOSE\"):\n            LOGGER.warning(\n                \"Can't close the windows for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        windows_close = pb2_commands.WindowsClose()\n        message.commandRequest.windows_close.CopyFrom(windows_close)\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End windows_close for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def windows_move(\n        self, vin: str, front_left: int, front_right: int, rear_left: int, rear_right: int, pin: str = \"\"\n    ):\n        \"\"\"Send the windows move command to the car.\"\"\"\n        LOGGER.info(\n            \"Start windows_move for vin %s, fl-%s, fr-%s, rl-%s, rr-%s\",\n            loghelper.Mask_VIN(vin),\n            front_left,\n            front_right,\n            rear_left,\n            rear_right,\n        )\n\n        if pin and pin.strip():\n            _pin = pin\n        else:\n            _pin = self.pin\n\n        if not _pin:\n            LOGGER.warning(\n                \"Can't move the windows - car %s. PIN not given. Please set the PIN -> Integration, Options or use the optional parameter of the service.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        if not self._is_car_feature_available(vin, \"variableOpenableWindow\"):\n            LOGGER.warning(\n                \"Can't move windows for car %s. Feature not availabe for this car.\",\n                loghelper.Mask_VIN(vin),\n            )\n            return\n\n        message = client_pb2.ClientMessage()\n\n        message.commandRequest.vin = vin\n        message.commandRequest.request_id = str(uuid.uuid4())\n        message.commandRequest.windows_move.pin = _pin\n        if front_left is not None:\n            if front_left == 0:\n                message.commandRequest.windows_move.front_left.SetInParent()\n            else:\n                message.commandRequest.windows_move.front_left.value = front_left\n        if front_right is not None:\n            if front_right == 0:\n                message.commandRequest.windows_move.front_right.SetInParent()\n            else:\n                message.commandRequest.windows_move.front_right.value = front_right\n        if rear_left is not None:\n            if rear_left == 0:\n                message.commandRequest.windows_move.rear_left.SetInParent()\n            else:\n                message.commandRequest.windows_move.rear_left.value = rear_left\n        if rear_right is not None:\n            if rear_right == 0:\n                message.commandRequest.windows_move.rear_right.SetInParent()\n            else:\n                message.commandRequest.windows_move.rear_right.value = rear_right\n\n        await self.execute_car_command(message)\n        LOGGER.info(\"End windows_move for vin %s\", loghelper.Mask_VIN(vin))\n\n    async def execute_car_command(self, message):\n        \"\"\"Execute a car command.\"\"\"\n        LOGGER.debug(\"execute_car_command - ws-connection: %s\", self.websocket.connection_state)\n        await self.websocket.call(message.SerializeToString(), car_command=True)\n\n    def _is_car_feature_available(self, vin: str, feature: str = \"\", feature_list=None) -> bool:\n        if self.config_entry.options.get(CONF_FT_DISABLE_CAPABILITY_CHECK, False):\n            return True\n\n        current_car = self.cars.get(vin)\n\n        if current_car:\n            if feature_list:\n                return current_car.check_capabilities(feature_list)\n\n            if feature:\n                return current_car.features.get(feature, False)\n\n        return False\n\n    def _write_debug_output(self, data, datatype):\n        if self.config_entry.options.get(CONF_DEBUG_FILE_SAVE, False):\n            self._hass.async_add_executor_job(self.__write_debug_output, data, datatype)\n\n    def __write_debug_output(self, data, datatype):\n        if self.config_entry.options.get(CONF_DEBUG_FILE_SAVE, False):\n            # LOGGER.debug(\"Start _write_debug_output\")\n\n            path = self._debug_save_path\n            Path(path).mkdir(parents=True, exist_ok=True)\n\n            with Path(f\"{path}/{datatype}{int(round(time.time() * 1000))}\").open(\"wb\") as current_file:\n                current_file.write(data.SerializeToString())\n\n            self.write_debug_json_output(MessageToJson(data, preserving_proto_field_name=True), datatype)\n\n    def write_debug_json_output(self, data, datatype, use_dumps: bool = False):\n        \"\"\"Write text to files based on datatype.\"\"\"\n        # LOGGER.debug(self.config_entry.options)\n        if self.config_entry.options.get(CONF_DEBUG_FILE_SAVE, False):\n            path = self._debug_save_path\n            Path(path).mkdir(parents=True, exist_ok=True)\n\n            with Path(f\"{path}/{datatype}{int(round(time.time() * 1000))}.json\").open(\n                \"w\", encoding=\"utf-8\"\n            ) as current_file:\n                if use_dumps:\n                    current_file.write(f\"{json.dumps(data, indent=4)}\")\n                else:\n                    current_file.write(f\"{data}\")\n\n    async def set_rlock_mode(self):\n        \"\"\"Set thread locking mode on init.\"\"\"\n        # In rare cases the ha-core system_info component runs in error when detecting the supervisor\n        # See https://github.com/ReneNulschDE/mbapi2020/issues/126\n        info = None\n        try:\n            info = await system_info.async_get_system_info(self._hass)\n        except AttributeError:\n            LOGGER.debug(\"WSL detection not possible. Error in HA-Core get_system_info. Force rlock mode.\")\n\n        if info and \"WSL\" not in str(info.get(\"os_version\")):\n            self._disable_rlock = False\n            self.__lock = threading.RLock()\n            LOGGER.debug(\"WSL not detected - running in rlock mode\")\n        else:\n            self._disable_rlock = True\n            self.__lock = None\n            LOGGER.debug(\"WSL detected - rlock mode disabled\")\n\n        return info\n\n    async def update_poll_states(self, vin: str):\n        \"\"\"Update the values for poll states, currently geofencing only.\"\"\"\n\n        if vin in self.cars:\n            car = self.cars[vin]\n\n            if self.websocket and self.websocket.account_blocked:\n                LOGGER.debug(\"start get_car_p2b_data_via_rest: %s\", loghelper.Mask_VIN(vin))\n                p2b_data = await self.webapi.get_car_p2b_data_via_rest(vin)\n                self._process_rest_vep_update(p2b_data)\n\n            if not car.has_geofencing:\n                return\n\n            if car.geofence_events is None:\n                car.geofence_events = GeofenceEvents()\n\n            LOGGER.debug(\"start get_car_geofencing_violations: %s\", loghelper.Mask_VIN(vin))\n            geofencing_violotions = await self.webapi.get_car_geofencing_violations(car.finorvin)\n            if geofencing_violotions and len(geofencing_violotions) > 0:\n                car.geofence_events.last_event_type = CarAttribute(\n                    geofencing_violotions[-1].get(\"type\"),\n                    \"VALID\",\n                    geofencing_violotions[-1].get(\"time\"),\n                )\n                car.geofence_events.last_event_timestamp = CarAttribute(\n                    geofencing_violotions[-1].get(\"time\"),\n                    \"VALID\",\n                    geofencing_violotions[-1].get(\"time\"),\n                )\n                car.geofence_events.last_event_zone = CarAttribute(\n                    geofencing_violotions[-1].get(\"snapshot\").get(\"name\"),\n                    \"VALID\",\n                    geofencing_violotions[-1].get(\"time\"),\n                )\n                car.has_geofencing = True\n                car.geo_fencing_retry_counter = 0\n            else:\n                if car.geo_fencing_retry_counter >= GEOFENCING_MAX_RETRIES:\n                    car.has_geofencing = False\n                car.geo_fencing_retry_counter = car.geo_fencing_retry_counter + 1\n\n    def _safe_create_on_dataload_complete_task(self):\n        \"\"\"Create task in a thread-safe way.\"\"\"\n        # Zurück zum Event Loop\n        asyncio.run_coroutine_threadsafe(self._on_dataload_complete(), self._hass.loop)\n"
  },
  {
    "path": "custom_components/mbapi2020/config_flow.py",
    "content": "\"\"\"Config flow for mbapi2020 integration.\"\"\"\n\nfrom __future__ import annotations\n\nfrom copy import deepcopy\nimport uuid\n\nfrom awesomeversion import AwesomeVersion\nimport voluptuous as vol\n\nfrom homeassistant import config_entries\nfrom homeassistant.const import CONF_PASSWORD, CONF_USERNAME, __version__ as HAVERSION\nfrom homeassistant.core import callback\nfrom homeassistant.helpers.aiohttp_client import async_get_clientsession\nfrom homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue\nfrom homeassistant.helpers.storage import STORAGE_DIR\n\nfrom .client import Client\nfrom .const import (\n    CONF_ALLOWED_REGIONS,\n    CONF_DEBUG_FILE_SAVE,\n    CONF_DELETE_AUTH_FILE,\n    CONF_ENABLE_CHINA_GCJ_02,\n    CONF_EXCLUDED_CARS,\n    CONF_FT_DISABLE_CAPABILITY_CHECK,\n    CONF_OVERWRITE_PRECONDNOW,\n    CONF_PIN,\n    CONF_REGION,\n    DOMAIN,\n    LOGGER,\n    REGION_CHINA,\n    TOKEN_FILE_PREFIX,\n    VERIFY_SSL,\n)\nfrom .errors import MbapiError, MBAuth2FAError, MBAuthError, MBLegalTermsError\n\nAUTH_METHOD_TOKEN = \"token\"\nAUTH_METHOD_USERPASS = \"userpass\"\n\nREGION_SCHEMA = vol.Schema(\n    {\n        vol.Required(CONF_REGION): vol.In(CONF_ALLOWED_REGIONS),\n    }\n)\n\nUSER_SCHEMA = vol.Schema(\n    {\n        vol.Required(CONF_USERNAME): str,\n        vol.Required(CONF_PASSWORD): str,\n    }\n)\n\nUSER_SCHEMA_CHINA = vol.Schema(\n    {\n        vol.Required(CONF_USERNAME): str,\n    }\n)\n\nUSER_STEP_PIN = vol.Schema({vol.Required(CONF_PASSWORD): str})\n\n\n# Version threshold for config_entry setting in options flow\n# See: https://github.com/home-assistant/core/pull/129562\nHA_OPTIONS_FLOW_VERSION_THRESHOLD = \"2024.11.99\"\n\n\nclass ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):\n    \"\"\"Handle a config flow for mbapi2020.\"\"\"\n\n    VERSION = 1\n\n    def __init__(self):\n        \"\"\"Initialize the ConfigFlow state.\"\"\"\n        self._reauth_entry = None\n        self._data = None\n        self._reauth_mode = False\n        self._auth_method = AUTH_METHOD_TOKEN\n        self._region = None\n\n    async def async_step_user(self, user_input=None):\n        \"\"\"Region selection step.\"\"\"\n\n        if user_input is not None:\n            self._region = user_input[CONF_REGION]\n            return await self.async_step_credentials()\n\n        return self.async_show_form(step_id=\"user\", data_schema=REGION_SCHEMA)\n\n    async def async_step_credentials(self, user_input=None):\n        \"\"\"Credentials step - username/password or username only for China.\"\"\"\n\n        is_china = self._region == REGION_CHINA\n        schema = USER_SCHEMA_CHINA if is_china else USER_SCHEMA\n\n        if user_input is not None:\n            user_input[CONF_REGION] = self._region\n            await self.async_set_unique_id(f\"{user_input[CONF_USERNAME]}-{user_input[CONF_REGION]}\")\n\n            if not self._reauth_mode:\n                self._abort_if_unique_id_configured()\n\n            session = async_get_clientsession(self.hass, VERIFY_SSL)\n            client = Client(self.hass, session, None, region=user_input[CONF_REGION])\n            user_input[CONF_USERNAME] = user_input[CONF_USERNAME].strip()\n\n            if is_china:\n                nonce = str(uuid.uuid4())\n                user_input[\"nonce\"] = nonce\n                user_input[\"device_guid\"] = client.oauth._device_guid  # noqa: SLF001\n                errors = {}\n\n                try:\n                    await client.oauth.request_pin(user_input[CONF_USERNAME], nonce)\n                except (MBAuthError, MbapiError):\n                    errors = {\"base\": \"pinrequest_failed\"}\n                    return self.async_show_form(step_id=\"credentials\", data_schema=schema, errors=errors)\n\n                if not errors:\n                    self._data = user_input\n                    return await self.async_step_pin()\n\n                LOGGER.error(\"Request PIN error: %s\", errors)\n\n                self._data = {\n                    CONF_USERNAME: user_input[CONF_USERNAME],\n                    CONF_REGION: user_input[CONF_REGION],\n                    \"nonce\": nonce,\n                    \"device_guid\": user_input[\"device_guid\"],\n                }\n            else:\n                try:\n                    token_info = await client.oauth.async_login_new(\n                        user_input[CONF_USERNAME], user_input[CONF_PASSWORD]\n                    )\n                except (MBAuthError, MbapiError) as error:\n                    LOGGER.error(\"Login error: %s\", error)\n                    return self.async_show_form(\n                        step_id=\"credentials\", data_schema=schema, errors={\"base\": \"invalid_auth\"}\n                    )\n                except MBAuth2FAError as error:\n                    LOGGER.error(\"Login error - 2FA accounts are not supported: %s\", error)\n                    return self.async_show_form(\n                        step_id=\"credentials\", data_schema=schema, errors={\"base\": \"2fa_required\"}\n                    )\n                except MBLegalTermsError as error:\n                    LOGGER.error(\"Login error - Legal terms not accepted: %s\", error)\n                    return self.async_show_form(\n                        step_id=\"credentials\", data_schema=schema, errors={\"base\": \"legal_terms\"}\n                    )\n                self._data = {\n                    CONF_USERNAME: user_input[CONF_USERNAME],\n                    CONF_REGION: user_input[CONF_REGION],\n                    CONF_PASSWORD: user_input[CONF_PASSWORD],\n                    \"token\": token_info,\n                    \"device_guid\": client.oauth._device_guid,  # noqa: SLF001\n                }\n\n            if self._reauth_mode:\n                self.hass.config_entries.async_update_entry(self._reauth_entry, data=self._data)\n                self.hass.config_entries.async_schedule_reload(self._reauth_entry.entry_id)\n                return self.async_abort(reason=\"reauth_successful\")\n\n            return self.async_create_entry(\n                title=f\"{self._data[CONF_USERNAME]} (Region: {self._data[CONF_REGION]})\",\n                data=self._data,\n            )\n\n        return self.async_show_form(step_id=\"credentials\", data_schema=schema)\n\n    async def async_step_pin(self, user_input=None):\n        \"\"\"Handle the step where the user inputs his/her station.\"\"\"\n\n        errors = {}\n\n        if user_input is not None:\n            pin = user_input[CONF_PASSWORD]\n            nonce = self._data[\"nonce\"]\n            new_config_entry: config_entries.ConfigEntry = await self.async_set_unique_id(\n                f\"{self._data[CONF_USERNAME]}-{self._data[CONF_REGION]}\"\n            )\n            session = async_get_clientsession(self.hass, VERIFY_SSL)\n\n            client = Client(self.hass, session, new_config_entry, self._data[CONF_REGION])\n            try:\n                result = await client.oauth.request_access_token_with_pin(self._data[CONF_USERNAME], pin, nonce)\n            except MbapiError as error:\n                LOGGER.error(\"Request token error: %s\", error)\n                errors = {\"base\": \"token_with_pin_request_failed\"}\n\n            if not errors:\n                LOGGER.debug(\"Token received\")\n                self._data[\"token\"] = result\n\n                if self._reauth_mode:\n                    self.hass.config_entries.async_update_entry(self._reauth_entry, data=self._data)\n                    self.hass.async_create_task(self.hass.config_entries.async_reload(self._reauth_entry.entry_id))\n                    return self.async_abort(reason=\"reauth_successful\")\n\n                return self.async_create_entry(\n                    title=f\"{self._data[CONF_USERNAME]} (Region: {self._data[CONF_REGION]})\",\n                    data=self._data,\n                )\n\n        return self.async_show_form(step_id=\"pin\", data_schema=USER_STEP_PIN, errors=errors)\n\n    async def async_step_reauth(self, user_input=None):\n        \"\"\"Get new tokens for a config entry that can't authenticate.\"\"\"\n\n        self._reauth_mode = True\n        self._reauth_entry = self.hass.config_entries.async_get_entry(self.context[\"entry_id\"])\n        self._region = self._reauth_entry.data.get(CONF_REGION)\n\n        return await self.async_step_credentials()\n\n    # async def async_step_reconfigure(self, user_input=None):\n    #     \"\"\"Get new tokens for a config entry that can't authenticate.\"\"\"\n    #     self._reauth_mode = True\n    #     self._reauth_entry = self.hass.config_entries.async_get_entry(self.context[\"entry_id\"])\n    #     return self.async_show_form(step_id=\"user\", data_schema=SCHEMA_STEP_AUTH_SELECT)\n\n    @staticmethod\n    @callback\n    def async_get_options_flow(config_entry):\n        \"\"\"Get options flow.\"\"\"\n        return OptionsFlowHandler(config_entry)\n\n\nclass OptionsFlowHandler(config_entries.OptionsFlow):\n    \"\"\"Options flow handler.\"\"\"\n\n    def __init__(self, config_entry: config_entries.ConfigEntry) -> None:\n        \"\"\"Initialize MBAI2020 options flow.\"\"\"\n        self.options = dict(config_entry.options)\n        # See: https://github.com/home-assistant/core/pull/129562\n        if AwesomeVersion(HAVERSION) < HA_OPTIONS_FLOW_VERSION_THRESHOLD:\n            self.config_entry = config_entry\n\n    async def async_step_init(self, user_input=None):\n        \"\"\"Manage the options.\"\"\"\n\n        if user_input is not None:\n            LOGGER.debug(\n                \"user_input: %s\",\n                {k: (\"xxxx\" if v else v) if k == CONF_PIN else v for k, v in user_input.items()},\n            )\n            if user_input[CONF_DELETE_AUTH_FILE] is True:\n                auth_file = self.hass.config.path(STORAGE_DIR, f\"{TOKEN_FILE_PREFIX}-{self.config_entry.entry_id}\")\n                LOGGER.warning(\"DELETE Auth Information requested %s\", auth_file)\n                new_config_entry_data = deepcopy(dict(self.config_entry.data))\n                new_config_entry_data[\"token\"] = None\n                changed = self.hass.config_entries.async_update_entry(self.config_entry, data=new_config_entry_data)\n\n                LOGGER.debug(\"%s Creating restart_required issue\", DOMAIN)\n                async_create_issue(\n                    hass=self.hass,\n                    domain=DOMAIN,\n                    issue_id=\"restart_required_auth_deleted\",\n                    is_fixable=True,\n                    issue_domain=DOMAIN,\n                    severity=IssueSeverity.WARNING,\n                    translation_key=\"restart_required\",\n                    translation_placeholders={\n                        \"name\": DOMAIN,\n                    },\n                )\n\n            self.options.update(user_input)\n            changed = self.hass.config_entries.async_update_entry(\n                self.config_entry,\n                options=user_input,\n            )\n            if changed:\n                await self.hass.config_entries.async_reload(self.config_entry.entry_id)\n            return self.async_create_entry(title=DOMAIN, data=self.options)\n\n        excluded_cars = self.options.get(CONF_EXCLUDED_CARS, \"\")\n        pin = self.options.get(CONF_PIN, \"\")\n        cap_check_disabled = self.options.get(CONF_FT_DISABLE_CAPABILITY_CHECK, False)\n        save_debug_files = self.options.get(CONF_DEBUG_FILE_SAVE, False)\n        enable_china_gcj_02 = self.options.get(CONF_ENABLE_CHINA_GCJ_02, False)\n        overwrite_cap_precondnow = self.options.get(CONF_OVERWRITE_PRECONDNOW, False)\n\n        return self.async_show_form(\n            step_id=\"init\",\n            data_schema=vol.Schema(\n                {\n                    vol.Optional(CONF_EXCLUDED_CARS, default=\"\", description={\"suggested_value\": excluded_cars}): str,\n                    vol.Optional(CONF_PIN, default=\"\", description={\"suggested_value\": pin}): str,\n                    vol.Optional(CONF_FT_DISABLE_CAPABILITY_CHECK, default=cap_check_disabled): bool,\n                    vol.Optional(CONF_DEBUG_FILE_SAVE, default=save_debug_files): bool,\n                    vol.Optional(CONF_DELETE_AUTH_FILE, default=False): bool,\n                    vol.Optional(CONF_ENABLE_CHINA_GCJ_02, default=enable_china_gcj_02): bool,\n                    vol.Optional(CONF_OVERWRITE_PRECONDNOW, default=overwrite_cap_precondnow): bool,\n                }\n            ),\n        )\n"
  },
  {
    "path": "custom_components/mbapi2020/const.py",
    "content": "\"\"\"Constants for the MercedesME 2020 integration.\"\"\"\n\nfrom __future__ import annotations\n\nfrom datetime import timedelta\nfrom enum import Enum, StrEnum\nimport logging\n\nimport voluptuous as vol\n\nfrom homeassistant.components.binary_sensor import BinarySensorDeviceClass\nfrom homeassistant.components.sensor import SensorDeviceClass, SensorStateClass\nfrom homeassistant.const import (\n    PERCENTAGE,\n    EntityCategory,\n    Platform,\n    UnitOfEnergy,\n    UnitOfLength,\n    UnitOfMass,\n    UnitOfPower,\n    UnitOfPressure,\n    UnitOfSpeed,\n    UnitOfTemperature,\n    UnitOfVolume,\n)\nfrom homeassistant.helpers import config_validation as cv\n\nMERCEDESME_COMPONENTS = [\n    Platform.SENSOR,\n    Platform.LOCK,\n    Platform.BINARY_SENSOR,\n    Platform.BUTTON,\n    Platform.DEVICE_TRACKER,\n    Platform.SWITCH,\n]\n\nREGION_EUROPE = \"Europe\"\nREGION_NORAM = \"North America\"\nREGION_APAC = \"Asia-Pacific\"\nREGION_CHINA = \"China\"\n\nCONF_ALLOWED_REGIONS = [REGION_EUROPE, REGION_NORAM, REGION_APAC, REGION_CHINA]\nCONF_LOCALE = \"locale\"\nCONF_COUNTRY_CODE = \"country_code\"\nCONF_EXCLUDED_CARS = \"excluded_cars\"\nCONF_PIN = \"pin\"\nCONF_REGION = \"region\"\nCONF_VIN = \"vin\"\nCONF_TIME = \"time\"\nCONF_DEBUG_FILE_SAVE = \"save_files\"\nCONF_FT_DISABLE_CAPABILITY_CHECK = \"cap_check_disabled\"\nCONF_DELETE_AUTH_FILE = \"delete_auth_file\"\nCONF_ENABLE_CHINA_GCJ_02 = \"enable_china_gcj_02\"\nCONF_AUTH_METHOD = \"auth_method\"\nCONF_ACCESS_TOKEN = \"access_token\"\nCONF_REFRESH_TOKEN = \"refresh_token\"\nCONF_OVERWRITE_PRECONDNOW = \"overwrite_cap_precondnow\"\n\nDOMAIN = \"mbapi2020\"\nLOGGER = logging.getLogger(__package__)\n\nUPDATE_INTERVAL = timedelta(seconds=180)\n\n# Duration to wait for state confirmation of interactive entitiess in seconds\nSTATE_CONFIRMATION_DURATION = 60\n\nDEFAULT_CACHE_PATH = \"custom_components/mbapi2020/messages\"\nDEFAULT_DOWNLOAD_PATH = \"custom_components/mbapi2020/resources\"\nDEFAULT_LOCALE = \"en-GB\"\nDEFAULT_COUNTRY_CODE = \"EN\"\n\nTOKEN_FILE_PREFIX = \".mercedesme-token-cache\"\n\nJSON_EXPORT_IGNORED_KEYS = (\n    \"pin\",\n    \"access_token\",\n    \"refresh_token\",\n    \"username\",\n    \"unique_id\",\n    \"nonce\",\n    \"_update_listeners\",\n    \"finorvin\",\n    \"licenseplate\",\n    \"fin\",\n    \"licensePlate\",\n    \"vin\",\n    \"dealers\",\n    \"positionLong\",\n    \"positionHeading\",\n    \"id_token\",\n    \"password\",\n    \"title\",\n)\n\n\nRIS_APPLICATION_VERSION_NA = \"3.65.1\"\nRIS_APPLICATION_VERSION_CN = \"1.65.0\"\nRIS_APPLICATION_VERSION_PA = \"1.65.0\"\nRIS_APPLICATION_VERSION = \"1.65.1 (3174)\"\nRIS_SDK_VERSION = \"4.4.2\"\nRIS_SDK_VERSION_CN = \"2.132.2\"\nRIS_OS_VERSION = \"26.3\"\nRIS_OS_NAME = \"ios\"\nX_APPLICATIONNAME = \"mycar-store-ece\"\nX_APPLICATIONNAME_ECE = \"mycar-store-ece\"\nX_APPLICATIONNAME_CN = \"mycar-store-cn\"\nX_APPLICATIONNAME_US = \"mycar-store-us\"\nX_APPLICATIONNAME_AP = \"mycar-store-ap\"\n\nUSE_PROXY = False\nVERIFY_SSL = True\nSYSTEM_PROXY: str | None = None if not USE_PROXY else \"http://192.168.178.68:9090\"\n\nLOGIN_APP_ID_EU = \"62778dc4-1de3-44f4-af95-115f06a3a008\"\nLOGIN_APP_ID_CN = \"3f36efb1-f84b-4402-b5a2-68a118fec33e\"\nLOGIN_BASE_URI = \"https://id.mercedes-benz.com\"\nLOGIN_BASE_URI_CN = \"https://ciam-1.mercedes-benz.com.cn\"\nPSAG_BASE_URI = \"https://psag.query.api.dvb.corpinter.net\"\nPSAG_BASE_URI_CN = \"https://psag.query.api.dvb.corpinter.net.cn\"\nRCP_BASE_URI = \"https://rcp-rs.query.api.dvb.corpinter.net\"\nRCP_BASE_URI_CN = \"https://rcp-rs.query.api.dvb.corpinter.net.cn\"\nREST_API_BASE = \"https://bff.emea-prod.mobilesdk.mercedes-benz.com\"\nREST_API_BASE_CN = \"https://bff.cn-prod.mobilesdk.mercedes-benz.com\"\nREST_API_BASE_NA = \"https://bff.amap-prod.mobilesdk.mercedes-benz.com\"\nREST_API_BASE_PA = \"https://bff.amap-prod.mobilesdk.mercedes-benz.com\"\n\nWEBSOCKET_API_BASE = \"wss://websocket.emea-prod.mobilesdk.mercedes-benz.com/v2/ws\"\nWEBSOCKET_API_BASE_NA = \"wss://websocket.amap-prod.mobilesdk.mercedes-benz.com/v2/ws\"\nWEBSOCKET_API_BASE_PA = \"wss://websocket.amap-prod.mobilesdk.mercedes-benz.com/v2/ws\"\nWEBSOCKET_API_BASE_CN = \"wss://websocket.cn-prod.mobilesdk.mercedes-benz.com/v2/ws\"\nWEBSOCKET_USER_AGENT = \"Mercedes-Benz/3044 CFNetwork/3860.400.22 Darwin/25.3.0\"\nWEBSOCKET_USER_AGENT_CN = \"MyStarCN/1.63.0 (com.daimler.ris.mercedesme.cn.ios; build:1758; iOS 16.3.1) Alamofire/5.4.0\"\nWEBSOCKET_USER_AGENT_PA = (\n    f\"mycar-store-ap {RIS_APPLICATION_VERSION}, {RIS_OS_NAME} {RIS_OS_VERSION}, SDK {RIS_SDK_VERSION}\"\n)\nWEBSOCKET_USER_AGENT_US = (\n    f\"mycar-store-us v{RIS_APPLICATION_VERSION_NA}, {RIS_OS_NAME} {RIS_OS_VERSION}, SDK {RIS_SDK_VERSION}\"\n)\nWIDGET_API_BASE = \"https://widget.emea-prod.mobilesdk.mercedes-benz.com\"\nWIDGET_API_BASE_NA = \"https://widget.amap-prod.mobilesdk.mercedes-benz.com\"\nWIDGET_API_BASE_PA = \"https://widget.amap-prod.mobilesdk.mercedes-benz.com\"\nWIDGET_API_BASE_CN = \"https://widget.cn-prod.mobilesdk.mercedes-benz.com\"\nDEFAULT_SOCKET_MIN_RETRY = 15\n\nSERVICE_AUXHEAT_CONFIGURE = \"auxheat_configure\"\nSERVICE_AUXHEAT_START = \"auxheat_start\"\nSERVICE_AUXHEAT_STOP = \"auxheat_stop\"\nSERVICE_BATTERY_MAX_SOC_CONFIGURE = \"battery_max_soc_configure\"\nSERVICE_CHARGE_PROGRAM_CONFIGURE = \"charge_program_configure\"\nSERVICE_CHARGING_BREAK_CLOCKTIMER_CONFIGURE = \"charging_break_clocktimer_configure\"\nSERVICE_DOORS_LOCK_URL = \"doors_lock\"\nSERVICE_DOORS_UNLOCK_URL = \"doors_unlock\"\nSERVICE_ENGINE_START = \"engine_start\"\nSERVICE_ENGINE_STOP = \"engine_stop\"\nSERVICE_SEND_ROUTE = \"send_route\"\nSERVICE_SIGPOS_START = \"sigpos_start\"\nSERVICE_SUNROOF_OPEN = \"sunroof_open\"\nSERVICE_SUNROOF_TILT = \"sunroof_tilt\"\nSERVICE_SUNROOF_CLOSE = \"sunroof_close\"\nSERVICE_PREHEAT_START = \"preheat_start\"\nSERVICE_PREHEAT_START_DEPARTURE_TIME = \"preheat_start_departure_time\"\nSERVICE_PREHEAT_STOP_DEPARTURE_TIME = \"preheat_stop_departure_time\"\nSERVICE_PREHEAT_STOP = \"preheat_stop\"\nSERVICE_PRECONDITIONING_CONFIGURE = \"preconditioning_configure\"\nSERVICE_WINDOWS_OPEN = \"windows_open\"\nSERVICE_WINDOWS_CLOSE = \"windows_close\"\nSERVICE_WINDOWS_MOVE = \"windows_move\"\nSERVICE_DOWNLOAD_IMAGES = \"download_images\"\nSERVICE_PRECONDITIONING_CONFIGURE_SEATS = \"preconditioning_configure_seats\"\nSERVICE_TEMPERATURE_CONFIGURE = \"temperature_configure\"\nSERVICE_HV_BATTERY_START_CONDITIONING = \"hv_battery_start_conditioning\"\nSERVICE_HV_BATTERY_STOP_CONDITIONING = \"hv_battery_stop_conditioning\"\n\nSERVICE_AUXHEAT_CONFIGURE_SCHEMA = vol.Schema(\n    {\n        vol.Required(CONF_VIN): cv.string,\n        vol.Required(\"time_selection\"): vol.All(vol.Coerce(int), vol.Range(min=0, max=3)),\n        vol.Required(\"time_1\"): vol.All(vol.Coerce(int), vol.Range(min=0, max=1439)),\n        vol.Required(\"time_2\"): vol.All(vol.Coerce(int), vol.Range(min=0, max=1439)),\n        vol.Required(\"time_3\"): vol.All(vol.Coerce(int), vol.Range(min=0, max=1439)),\n    }\n)\nSERVICE_CHARGING_BREAK_CLOCKTIMER_CONFIGURE_SCHEMA = vol.Schema(\n    {\n        vol.Required(CONF_VIN): cv.string,\n        vol.Optional(\"status_timer_1\"): cv.string,\n        vol.Optional(\"starttime_timer_1\"): cv.time_period,\n        vol.Optional(\"stoptime_timer_1\"): cv.time_period,\n        vol.Optional(\"status_timer_2\"): cv.string,\n        vol.Optional(\"starttime_timer_2\"): cv.time_period,\n        vol.Optional(\"stoptime_timer_2\"): cv.time_period,\n        vol.Optional(\"status_timer_3\"): cv.string,\n        vol.Optional(\"starttime_timer_3\"): cv.time_period,\n        vol.Optional(\"stoptime_timer_3\"): cv.time_period,\n        vol.Optional(\"status_timer_4\"): cv.string,\n        vol.Optional(\"starttime_timer_4\"): cv.time_period,\n        vol.Optional(\"stoptime_timer_4\"): cv.time_period,\n    }\n)\nSERVICE_PREHEAT_START_SCHEMA = vol.Schema(\n    {\n        vol.Required(CONF_VIN): cv.string,\n        vol.Required(\"type\", default=0): vol.All(vol.Coerce(int), vol.Range(min=0, max=1)),\n    }\n)\nSERVICE_SEND_ROUTE_SCHEMA = vol.Schema(\n    {\n        vol.Required(CONF_VIN): cv.string,\n        vol.Required(\"title\"): cv.string,\n        vol.Required(\"latitude\"): cv.latitude,\n        vol.Required(\"longitude\"): cv.longitude,\n        vol.Required(\"city\"): cv.string,\n        vol.Required(\"postcode\"): cv.string,\n        vol.Required(\"street\"): cv.string,\n    }\n)\nSERVICE_BATTERY_MAX_SOC_CONFIGURE_SCHEMA = vol.Schema(\n    {\n        vol.Required(CONF_VIN): cv.string,\n        vol.Required(\"max_soc\", default=100): vol.All(vol.Coerce(int), vol.In([30, 40, 50, 60, 70, 80, 90, 100])),\n        vol.Optional(\"charge_program\", default=0): vol.All(vol.Coerce(int), vol.In([0, 2, 3])),\n    }\n)\nSERVICE_VIN_SCHEMA = vol.Schema({vol.Required(CONF_VIN): cv.string})\nSERVICE_VIN_PIN_SCHEMA = vol.Schema(\n    {\n        vol.Required(CONF_VIN): cv.string,\n        vol.Optional(CONF_PIN): cv.string,\n    }\n)\nSERVICE_VIN_TIME_SCHEMA = vol.Schema(\n    {\n        vol.Required(CONF_VIN): cv.string,\n        vol.Required(CONF_TIME): vol.All(vol.Coerce(int), vol.Range(min=0, max=1439)),\n    }\n)\nSERVICE_VIN_CHARGE_PROGRAM_SCHEMA = vol.Schema(\n    {\n        vol.Required(CONF_VIN): cv.string,\n        vol.Required(\"charge_program\", default=0): vol.All(vol.Coerce(int), vol.In([0, 2, 3])),\n        vol.Optional(\"max_soc\", default=None): vol.Any(\n            None,\n            vol.All(vol.Coerce(int), vol.In([50, 60, 70, 80, 90, 100])),\n        ),\n    }\n)\nSERVICE_WINDOWS_MOVE_SCHEMA = vol.Schema(\n    {\n        vol.Required(CONF_VIN): cv.string,\n        vol.Optional(CONF_PIN): cv.string,\n        vol.Optional(\"front_left\", default=None): vol.Any(\n            None,\n            vol.All(vol.Coerce(int), vol.In([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])),\n        ),\n        vol.Optional(\"front_right\", default=None): vol.Any(\n            None,\n            vol.All(vol.Coerce(int), vol.In([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])),\n        ),\n        vol.Optional(\"rear_left\", default=None): vol.Any(\n            None,\n            vol.All(vol.Coerce(int), vol.In([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])),\n        ),\n        vol.Optional(\"rear_right\", default=None): vol.Any(\n            None,\n            vol.All(vol.Coerce(int), vol.In([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])),\n        ),\n    }\n)\nSERVICE_TEMPERATURE_CONFIGURE_SCHEMA = vol.Schema(\n    {\n        vol.Required(CONF_VIN): cv.string,\n        vol.Optional(\"front_left\", default=None): vol.Any(\n            None,\n            vol.All(\n                vol.Coerce(float),\n                vol.In(\n                    [\n                        0,\n                        16,\n                        16.5,\n                        17,\n                        17.5,\n                        18,\n                        18.5,\n                        19,\n                        19.5,\n                        20,\n                        20.5,\n                        21,\n                        21.5,\n                        22,\n                        22.5,\n                        23,\n                        23.5,\n                        24,\n                        24.5,\n                        25,\n                        25.5,\n                        26,\n                        26.5,\n                        27,\n                        27.5,\n                        28,\n                        30,\n                    ]\n                ),\n            ),\n        ),\n        vol.Optional(\"front_right\", default=None): vol.Any(\n            None,\n            vol.All(\n                vol.Coerce(float),\n                vol.In(\n                    [\n                        0,\n                        16,\n                        16.5,\n                        17,\n                        17.5,\n                        18,\n                        18.5,\n                        19,\n                        19.5,\n                        20,\n                        20.5,\n                        21,\n                        21.5,\n                        22,\n                        22.5,\n                        23,\n                        23.5,\n                        24,\n                        24.5,\n                        25,\n                        25.5,\n                        26,\n                        26.5,\n                        27,\n                        27.5,\n                        28,\n                        30,\n                    ]\n                ),\n            ),\n        ),\n        vol.Optional(\"rear_left\", default=None): vol.Any(\n            None,\n            vol.All(\n                vol.Coerce(float),\n                vol.In(\n                    [\n                        0,\n                        16,\n                        16.5,\n                        17,\n                        17.5,\n                        18,\n                        18.5,\n                        19,\n                        19.5,\n                        20,\n                        20.5,\n                        21,\n                        21.5,\n                        22,\n                        22.5,\n                        23,\n                        23.5,\n                        24,\n                        24.5,\n                        25,\n                        25.5,\n                        26,\n                        26.5,\n                        27,\n                        27.5,\n                        28,\n                        30,\n                    ]\n                ),\n            ),\n        ),\n        vol.Optional(\"rear_right\", default=None): vol.Any(\n            None,\n            vol.All(\n                vol.Coerce(float),\n                vol.In(\n                    [\n                        0,\n                        16,\n                        16.5,\n                        17,\n                        17.5,\n                        18,\n                        18.5,\n                        19,\n                        19.5,\n                        20,\n                        20.5,\n                        21,\n                        21.5,\n                        22,\n                        22.5,\n                        23,\n                        23.5,\n                        24,\n                        24.5,\n                        25,\n                        25.5,\n                        26,\n                        26.5,\n                        27,\n                        27.5,\n                        28,\n                        30,\n                    ]\n                ),\n            ),\n        ),\n    }\n)\nSERVICE_PRECONDITIONING_CONFIGURE_SEATS_SCHEMA = vol.Schema(\n    {\n        vol.Required(CONF_VIN): cv.string,\n        vol.Required(\"front_left\"): cv.boolean,\n        vol.Required(\"front_right\"): cv.boolean,\n        vol.Required(\"rear_left\"): cv.boolean,\n        vol.Required(\"rear_right\"): cv.boolean,\n    }\n)\nSERVICE_PRECONDITIONING_CONFIGURE_SCHEMA = vol.Schema(\n    {\n        vol.Required(CONF_VIN): cv.string,\n        vol.Required(\"departure_time_mode\", default=0): vol.All(vol.Coerce(int), vol.In([0, 1, 2])),\n        vol.Optional(\"departure_time\", default=0): vol.All(vol.Coerce(int), vol.Range(min=0, max=1439)),\n    }\n)\n\nATTR_MB_MANUFACTURER = \"Mercedes Benz\"\n\n\nBinarySensors = {\n    \"chargingactive\": [\n        \"Charging active\",\n        None,  # Deprecated: DO NOT USE\n        \"electric\",\n        \"chargingactive\",\n        \"value\",\n        None,\n        None,\n        None,\n        BinarySensorDeviceClass.BATTERY_CHARGING,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"liquidRangeCritical\": [\n        \"Liquid Range Critical\",\n        None,  # Deprecated: DO NOT USE\n        \"binarysensors\",\n        \"liquidRangeCritical\",\n        \"value\",\n        None,\n        None,\n        \"mdi:gas-station\",\n        BinarySensorDeviceClass.PROBLEM,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"warningbrakefluid\": [\n        \"Low Brake Fluid Warning\",\n        None,  # Deprecated: DO NOT USE\n        \"binarysensors\",\n        \"warningbrakefluid\",\n        \"value\",\n        None,\n        None,\n        \"mdi:car-brake-alert\",\n        BinarySensorDeviceClass.PROBLEM,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"warningwashwater\": [\n        \"Low Wash Water Warning\",\n        None,  # Deprecated: DO NOT USE\n        \"binarysensors\",\n        \"warningwashwater\",\n        \"value\",\n        None,\n        None,\n        \"mdi:wiper-wash\",\n        BinarySensorDeviceClass.PROBLEM,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"warningcoolantlevellow\": [\n        \"Low Coolant Level Warning\",\n        None,  # Deprecated: DO NOT USE\n        \"binarysensors\",\n        \"warningcoolantlevellow\",\n        \"value\",\n        None,\n        None,\n        \"mdi:oil-level\",\n        BinarySensorDeviceClass.PROBLEM,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"warningenginelight\": [\n        \"Engine Light Warning\",\n        None,  # Deprecated: DO NOT USE\n        \"binarysensors\",\n        \"warningenginelight\",\n        \"value\",\n        None,\n        {\n            \"warningbrakefluid\",\n            \"warningwashwater\",\n            \"warningcoolantlevellow\",\n            \"warninglowbattery\",\n        },\n        \"mdi:engine\",\n        BinarySensorDeviceClass.PROBLEM,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"parkbrakestatus\": [\n        \"Park Brake Status\",\n        None,  # Deprecated: DO NOT USE\n        \"binarysensors\",\n        \"parkbrakestatus\",\n        \"value\",\n        None,\n        {\"preWarningBrakeLiningWear\"},\n        \"mdi:car-brake-parking\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"windowStatusOverall\": [\n        \"Windows Closed\",\n        None,  # Deprecated: DO NOT USE\n        \"windows\",\n        \"windowStatusOverall\",\n        \"value\",\n        None,\n        {\n            \"windowstatusrearleft\",\n            \"windowstatusrearright\",\n            \"windowstatusfrontright\",\n            \"windowstatusfrontleft\",\n            \"windowstatusrearleftblind\",\n            \"windowstatusrearrightblind\",\n            \"windowstatusfrontrightblind\",\n            \"windowstatusfrontleftblind\",\n        },\n        \"mdi:car-door\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"tirewarninglamp\": [\n        \"Tire Warning\",\n        None,  # Deprecated: DO NOT USE\n        \"tires\",\n        \"tirewarninglamp\",\n        \"value\",\n        None,\n        {\n            \"tireMarkerFrontRight\",\n            \"tireMarkerFrontLeft\",\n            \"tireMarkerRearLeft\",\n            \"tireMarkerRearRight\",\n            \"tirewarningsrdk\",\n            \"tirewarningsprw\",\n            \"tireTemperatureRearLeft\",\n            \"tireTemperatureFrontRight\",\n            \"tireTemperatureRearRight\",\n            \"tireTemperatureFrontLeft\",\n        },\n        \"mdi:car-tire-alert\",\n        BinarySensorDeviceClass.PROBLEM,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"remoteStartActive\": [\n        \"Remote Start Active\",\n        None,  # Deprecated: DO NOT USE\n        \"binarysensors\",\n        \"remoteStartActive\",\n        \"value\",\n        None,\n        {\"remoteStartTemperature\"},\n        \"mdi:engine-outline\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"engineState\": [\n        \"Engine State\",\n        None,  # Deprecated: DO NOT USE\n        \"binarysensors\",\n        \"engineState\",\n        \"value\",\n        None,\n        None,\n        \"mdi:engine\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"chargeflapacstatus\": [\n        \"Charge Flap AC Status\",\n        None,  # Deprecated: DO NOT USE\n        \"doors\",\n        \"chargeFlapACStatus\",\n        \"value\",\n        None,\n        {},\n        None,\n        BinarySensorDeviceClass.DOOR,\n        True,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"preclimateStatus\": [\n        \"Preclimate Status\",\n        None,  # Deprecated: DO NOT USE\n        \"precond\",\n        \"precondStatus\",\n        \"value\",\n        None,\n        {\n            \"precondOperatingMode\",\n            \"precondState\",\n            \"precondActive\",\n            \"precondError\",\n            \"precondNow\",\n            \"precondNowError\",\n            \"precondDuration\",\n            \"precondatdeparture\",\n            \"precondAtDepartureDisable\",\n            \"precondSeatFrontLeft\",\n            \"precondSeatFrontRight\",\n            \"precondSeatRearLeft\",\n            \"precondSeatRearRight\",\n            \"temperature_points_frontLeft\",\n            \"temperature_points_frontRight\",\n            \"temperature_points_rearLeft\",\n            \"temperature_points_rearRight\",\n        },\n        \"mdi:car-seat-heater\",\n        BinarySensorDeviceClass.RUNNING,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"theftsystemarmed\": [\n        \"Theft system armed\",\n        None,  # Deprecated: DO NOT USE\n        \"caralarm\",\n        \"theftSystemArmed\",\n        \"value\",\n        None,\n        {\n            \"carAlarmLastTime\",\n            \"carAlarmReason\",\n            \"collisionAlarmTimestamp\",\n            \"interiorSensor\",\n            \"interiorProtectionStatus\",\n            \"interiorMonitoringLastEvent\",\n            \"interiorMonitoringStatus\",\n            \"exteriorMonitoringLastEvent\",\n            \"exteriorMonitoringStatus\",\n            \"lastParkEvent\",\n            \"lastTheftWarning\",\n            \"lastTheftWarningReason\",\n            \"parkEventLevel\",\n            \"parkEventType\",\n            \"theftAlarmActive\",\n            \"towProtectionSensorStatus\",\n            \"towSensor\",\n        },\n        \"mdi:alarm-light\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n}\n\nBUTTONS = {\n    \"btn_preheat_start_now\": [\n        \"Preclimate start\",\n        None,  # Deprecated: DO NOT USE\n        None,\n        \"preheat_start\",\n        None,\n        \"ZEV_PRECONDITIONING_START\",\n        None,\n        \"mdi:hvac\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"btn_preheat_stop_now\": [\n        \"Preclimate stop\",\n        None,  # Deprecated: DO NOT USE\n        None,\n        \"preheat_stop\",\n        None,\n        \"ZEV_PRECONDITIONING_STOP\",\n        None,\n        \"mdi:hvac\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"btn_sigpos_start_now\": [\n        \"Signal position\",\n        None,  # Deprecated: DO NOT USE\n        None,\n        \"sigpos_start\",\n        None,\n        \"SIGPOS_START\",\n        None,\n        \"mdi:flashlight\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n}\n\n\nDEVICE_TRACKER = {\n    \"tracker\": [\n        \"Device Tracker\",\n        None,  # Deprecated: DO NOT USE\n        \"location\",\n        \"positionLong\",\n        \"value\",\n        None,\n        {\"positionHeading\"},\n        None,\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ]\n}\n\nSENSORS = {\n    \"chargingpowerkw\": [\n        \"Charging Power\",\n        UnitOfPower.KILO_WATT,  # Deprecated: DO NOT USE\n        \"electric\",\n        \"chargingPower\",\n        \"value\",\n        None,\n        {},\n        None,  # \"mdi:ev-station\",\n        SensorDeviceClass.POWER,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        \"Zero\",\n        1,\n    ],\n    \"chargingpowerecolimit\": [\n        \"Charging Power Limit\",\n        UnitOfPower.KILO_WATT,  # Deprecated: DO NOT USE\n        \"electric\",\n        \"chargingPowerEcoLimit\",\n        \"value\",\n        None,\n        {\"chargingPowerRestriction\"},\n        \"mdi:ev-station\",\n        SensorDeviceClass.POWER,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        None,\n    ],\n    \"rcp_features\": [\n        \"RCP Features\",\n        None,  # Deprecated: DO NOT USE\n        \"rcp_options\",\n        \"rcp_supported\",\n        \"value\",\n        None,\n        {\"rcp_supported_settings\"},\n        \"mdi:car\",\n        None,\n        False,\n        EntityCategory.DIAGNOSTIC,\n        None,\n        None,\n        None,\n    ],\n    \"car\": [\n        \"Car\",\n        None,  # Deprecated: DO NOT USE\n        None,\n        \"full_updatemessages_received\",\n        \"value\",\n        None,\n        {\n            \"partital_updatemessages_received\",\n            \"last_message_received\",\n            \"last_command_type\",\n            \"last_command_state\",\n            \"last_command_error_code\",\n            \"last_command_error_message\",\n            \"is_owner\",\n            \"electric.chargingBreakClockTimer\",\n        },\n        \"mdi:car\",\n        None,\n        False,\n        EntityCategory.DIAGNOSTIC,\n        None,\n        None,\n        0,\n    ],\n    \"data_mode\": [\n        \"Data Mode\",\n        None,  # Deprecated: DO NOT USE\n        None,\n        \"data_collection_mode\",\n        \"value\",\n        None,\n        {},\n        \"mdi:connection\",\n        None,\n        False,\n        EntityCategory.DIAGNOSTIC,\n        None,\n        None,\n        0,\n    ],\n    \"departuretime\": [\n        \"Departure time\",\n        None,  # Deprecated: DO NOT USE\n        \"odometer\",\n        \"departuretime\",\n        \"display_value\",\n        None,\n        {\"departureTimeWeekday\"},\n        \"mdi:clock-out\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"lock\": [\n        \"Lock\",\n        None,  # Deprecated: DO NOT USE\n        \"doors\",\n        \"doorlockstatusvehicle\",\n        \"value\",\n        None,\n        {\n            \"decklidstatus\",\n            \"doorStatusOverall\",\n            \"doorLockStatusOverall\",\n            \"doorlockstatusgas\",\n            \"doorlockstatusvehicle\",\n            \"doorlockstatusfrontleft\",\n            \"doorlockstatusfrontright\",\n            \"doorlockstatusrearright\",\n            \"doorlockstatusrearleft\",\n            \"doorlockstatusdecklid\",\n            \"doorstatusrearleft\",\n            \"doorstatusfrontright\",\n            \"doorstatusrearright\",\n            \"doorstatusfrontleft\",\n            \"rooftopstatus\",\n            \"sunroofstatus\",\n            \"engineHoodStatus\",\n            \"tankCapOpenLamp\",\n        },\n        \"mdi:car-key\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"rangeElectricKm\": [\n        \"Range Electric\",\n        None,  # Deprecated: DO NOT USE\n        \"electric\",\n        \"rangeelectric\",\n        \"display_value\",\n        None,\n        {\n            \"chargingactive\",\n            \"chargingstatus\",\n            \"distanceElectricalReset\",\n            \"distanceElectricalStart\",\n            \"distanceZEReset\",\n            \"distanceZEStart\",\n            \"ecoElectricBatteryTemperature\",\n            \"endofchargetime\",\n            \"endofChargeTimeWeekday\",\n            \"precond.precondActive\",  # DEPRECATED\n            \"precond.precondNow\",  # DEPRECATED\n            \"precond.precondDuration\",  # DEPRECATED\n            \"maxrange\",\n            \"selectedChargeProgram\",\n            \"electricRatioStart\",\n            \"electricRatioOverall\",\n            \"electricRatioReset\",\n        },\n        \"mdi:ev-station\",\n        SensorDeviceClass.DISTANCE,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"chargingstatus\": [\n        \"Charging Status\",\n        None,  # Deprecated: DO NOT USE\n        \"electric\",\n        \"chargingstatus\",\n        \"value\",\n        None,\n        {},\n        \"mdi:car-electric\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        0,\n    ],\n    \"electricconsumptionstart\": [\n        \"Electric consumption start\",\n        None,  # Deprecated: DO NOT USE,\n        \"electric\",\n        \"electricconsumptionstart\",\n        \"display_value\",\n        None,\n        {},\n        \"mdi:ev-station\",\n        None,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        \"Zero\",\n        1,\n    ],\n    \"electricconsumptionreset\": [\n        \"Electric consumption reset\",\n        None,  # Deprecated: DO NOT USE\n        \"electric\",\n        \"electricconsumptionreset\",\n        \"display_value\",\n        None,\n        {},\n        \"mdi:ev-station\",\n        None,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        1,\n    ],\n    \"soc\": [\n        \"State of Charge\",\n        None,  # Deprecated: DO NOT USE\n        \"electric\",\n        \"soc\",\n        \"value\",\n        None,\n        {\"maxSocLowerLimit\", \"maxSoc\", \"selectedChargeProgram\"},\n        None,\n        SensorDeviceClass.BATTERY,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"max_soc\": [\n        \"Max State of Charge\",\n        None,  # Deprecated: DO NOT USE\n        \"electric\",\n        \"max_soc\",\n        \"value\",\n        None,\n        {\"selectedChargeProgram\"},\n        None,\n        None,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"auxheatstatus\": [\n        \"Auxheat Status\",\n        None,  # Deprecated: DO NOT USE\n        \"auxheat\",\n        \"auxheatstatus\",\n        \"value\",\n        None,\n        {\n            \"auxheatActive\",\n            \"auxheatwarnings\",\n            \"auxheatruntime\",\n            \"auxheatwarningsPush\",\n            \"auxheattimeselection\",\n            \"auxheattime1\",\n            \"auxheattime2\",\n            \"auxheattime3\",\n            \"temperature_points_frontLeft\",\n            \"temperature_points_frontRight\",\n        },\n        \"mdi:radiator\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"tanklevelpercent\": [\n        \"Fuel Level\",\n        None,  # Deprecated: DO NOT USE\n        \"odometer\",\n        \"tanklevelpercent\",\n        \"value\",\n        None,\n        {\"tankLevelAdBlue\", \"gasTankLevelPercent\"},\n        \"mdi:gas-station\",\n        SensorDeviceClass.POWER_FACTOR,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"tankleveladblue\": [\n        \"AdBlue Level\",\n        None,  # Deprecated: DO NOT USE\n        \"odometer\",\n        \"tankLevelAdBlue\",\n        \"value\",\n        None,\n        {},\n        \"mdi:gas-station\",\n        SensorDeviceClass.POWER_FACTOR,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"odometer\": [\n        \"Odometer\",\n        None,  # Deprecated: DO NOT USE,\n        \"odometer\",\n        \"odo\",\n        \"display_value\",\n        None,\n        {\n            \"gasconsumptionstart\",\n            \"gasconsumptionreset\",\n            \"gasTankRange\",\n            \"gasTankLevel\",\n            \"liquidRangeSkipIndication\",\n            \"outsideTemperature\",\n            \"serviceintervaldays\",\n            \"serviceintervaldistance\",\n            \"tankReserveLamp\",\n            \"tankLevelAdBlue\",\n            \"vehicleDataConnectionState\",\n            \"remoteStartTemperature\",\n        },\n        \"mdi:car-cruise-control\",\n        SensorDeviceClass.DISTANCE,\n        False,\n        None,\n        SensorStateClass.TOTAL_INCREASING,\n        None,\n        0,\n    ],\n    \"averageSpeedStart\": [\n        \"Average speed start\",\n        None,  # Deprecated: DO NOT USE\n        \"odometer\",\n        \"averageSpeedStart\",\n        \"display_value\",\n        None,\n        {},\n        None,  # \"mdi:car-cruise-control\",\n        SensorDeviceClass.SPEED,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"averageSpeedReset\": [\n        \"Average speed reset\",\n        None,  # Deprecated: DO NOT USE,\n        \"odometer\",\n        \"averageSpeedReset\",\n        \"display_value\",\n        None,\n        {},\n        None,  # \"mdi:car-cruise-control\",\n        SensorDeviceClass.SPEED,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"distanceReset\": [\n        \"Distance reset\",\n        None,  # Deprecated: DO NOT USE,\n        \"odometer\",\n        \"distanceReset\",\n        \"display_value\",\n        None,\n        {\"drivenTimeReset\"},\n        \"mdi:map-marker-distance\",\n        SensorDeviceClass.DISTANCE,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"distanceStart\": [\n        \"Distance start\",\n        None,  # Deprecated: DO NOT USE,\n        \"odometer\",\n        \"distanceStart\",\n        \"display_value\",\n        None,\n        {\"drivenTimeStart\"},\n        \"mdi:map-marker-distance\",\n        SensorDeviceClass.DISTANCE,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"distanceZEReset\": [\n        \"Distance zero-emission reset\",\n        None,  # Deprecated: DO NOT USE,\n        \"electric\",\n        \"distanceZEReset\",\n        \"display_value\",\n        None,\n        {\"drivenTimeZEReset\"},\n        \"mdi:map-marker-distance\",\n        SensorDeviceClass.DISTANCE,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"distanceZEStart\": [\n        \"Distance zero-emission start\",\n        None,  # Deprecated: DO NOT USE,\n        \"electric\",\n        \"distanceZEStart\",\n        \"display_value\",\n        None,\n        {\"drivenTimeZEStart\"},\n        \"mdi:map-marker-distance\",\n        SensorDeviceClass.DISTANCE,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"ecoscoretotal\": [\n        \"Eco score total\",\n        None,  # Deprecated: DO NOT USE\n        \"odometer\",\n        \"ecoscoretotal\",\n        \"display_value\",\n        None,\n        {},\n        \"mdi:leaf\",\n        None,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        None,\n    ],\n    \"ecoscorefreewhl\": [\n        \"Eco score free wheel\",\n        None,  # Deprecated: DO NOT USE\n        \"odometer\",\n        \"ecoscorefreewhl\",\n        \"display_value\",\n        None,\n        {},\n        \"mdi:leaf\",\n        SensorDeviceClass.POWER_FACTOR,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"ecoscorebonusrange\": [\n        \"Eco score bonus range\",\n        None,  # Deprecated: DO NOT USE,\n        \"odometer\",\n        \"ecoscorebonusrange\",\n        \"display_value\",\n        None,\n        {},\n        \"mdi:leaf\",\n        SensorDeviceClass.DISTANCE,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"ecoscoreconst\": [\n        \"Eco score constant\",\n        None,  # Deprecated: DO NOT USE\n        \"odometer\",\n        \"ecoscoreconst\",\n        \"display_value\",\n        None,\n        {},\n        \"mdi:leaf\",\n        SensorDeviceClass.POWER_FACTOR,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"ecoscoreaccel\": [\n        \"Eco score acceleration\",\n        None,  # Deprecated: DO NOT USE\n        \"odometer\",\n        \"ecoscoreaccel\",\n        \"display_value\",\n        None,\n        {},\n        \"mdi:leaf\",\n        SensorDeviceClass.POWER_FACTOR,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"liquidconsumptionstart\": [\n        \"Liquid consumption start\",\n        None,  # Deprecated: DO NOT USE\n        \"odometer\",\n        \"liquidconsumptionstart\",\n        \"display_value\",\n        None,\n        {},\n        \"mdi:fuel\",\n        None,  # No device class present in HA 2024.2\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        1,\n    ],\n    \"liquidconsumptionreset\": [\n        \"Liquid consumption reset\",\n        None,  # Deprecated: DO NOT USE\n        \"odometer\",\n        \"liquidconsumptionreset\",\n        \"display_value\",\n        None,\n        {},\n        \"mdi:fuel\",\n        None,  # No device class present in HA 2024.2\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        1,\n    ],\n    \"rangeliquid\": [\n        \"Range liquid\",\n        None,  # Deprecated: DO NOT USE,\n        \"odometer\",\n        \"rangeliquid\",\n        \"display_value\",\n        None,\n        {},\n        \"mdi:gas-station\",\n        SensorDeviceClass.DISTANCE,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"starterBatteryState\": [\n        \"Starter Battery State\",\n        None,  # Deprecated: DO NOT USE\n        \"binarysensors\",\n        \"starterBatteryState\",\n        \"value\",\n        None,\n        {},\n        \"mdi:car-battery\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"ignitionstate\": [\n        \"Ignition State\",\n        None,  # Deprecated: DO NOT USE\n        \"odometer\",\n        \"ignitionstate\",\n        \"value\",\n        None,\n        {},\n        \"mdi:key-wireless\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"oilLevel\": [\n        \"Oil Level\",\n        None,  # Deprecated: DO NOT USE\n        \"odometer\",\n        \"oilLevel\",\n        \"value\",\n        None,\n        {},\n        \"mdi:oil-level\",\n        SensorDeviceClass.POWER_FACTOR,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        0,\n    ],\n    \"tirepressureRearLeft\": [\n        \"Tire pressure rear left\",\n        None,  # Deprecated: DO NOT USE\n        \"tires\",\n        \"tirepressureRearLeft\",\n        \"display_value\",\n        None,\n        {},\n        None,\n        SensorDeviceClass.ATMOSPHERIC_PRESSURE,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        1,\n    ],\n    \"tirepressureRearRight\": [\n        \"Tire pressure rear right\",\n        None,  # Deprecated: DO NOT USE\n        \"tires\",\n        \"tirepressureRearRight\",\n        \"display_value\",\n        None,\n        {},\n        None,\n        SensorDeviceClass.ATMOSPHERIC_PRESSURE,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        1,\n    ],\n    \"tirepressureFrontRight\": [\n        \"Tire pressure front right\",\n        None,  # Deprecated: DO NOT USE\n        \"tires\",\n        \"tirepressureFrontRight\",\n        \"display_value\",\n        None,\n        {},\n        None,\n        SensorDeviceClass.ATMOSPHERIC_PRESSURE,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        1,\n    ],\n    \"tirepressureFrontLeft\": [\n        \"Tire pressure front left\",\n        None,  # Deprecated: DO NOT USE\n        \"tires\",\n        \"tirepressureFrontLeft\",\n        \"display_value\",\n        None,\n        {},\n        None,\n        SensorDeviceClass.ATMOSPHERIC_PRESSURE,\n        False,\n        None,\n        SensorStateClass.MEASUREMENT,\n        None,\n        1,\n    ],\n    \"tirewarningsrdk\": [\n        \"Tires RDK state\",\n        None,  # Deprecated: DO NOT USE\n        \"tires\",\n        \"tirewarningsrdk\",\n        \"value\",\n        None,\n        {},\n        \"mdi:car-tire-alert\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"lastParkEvent\": [\n        \"Last park event\",\n        None,  # Deprecated: DO NOT USE\n        \"caralarm\",\n        \"lastParkEvent\",\n        \"value\",\n        None,\n        {\n            \"parkEventType\",\n            \"parkEventLevel\",\n        },\n        None,\n        SensorDeviceClass.DATE,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"interiorProtectionSensorStatus\": [\n        \"Interior Protection\",\n        None,  # Deprecated: DO NOT USE\n        \"caralarm\",\n        \"interiorProtectionSensorStatus\",\n        \"value\",\n        None,\n        {},\n        None,\n        SensorDeviceClass.DATE,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"sunroofstatus\": [\n        \"Sunroof Status\",\n        None,  # Deprecated: DO NOT USE\n        \"doors\",\n        \"sunroofstatus\",\n        \"value\",\n        None,\n        {},\n        None,\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"chargeflapstate\": [\n        \"Charge Flap\",\n        None,  # Deprecated: DO NOT USE\n        \"electric\",\n        \"chargeflap\",\n        \"value\",\n        None,\n        {},\n        \"mdi:ev-plug-type2\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"chargeinletcoupler\": [\n        \"Charge Inlet Coupler\",\n        None,  # Deprecated: DO NOT USE\n        \"electric\",\n        \"chargeinletcoupler\",\n        \"value\",\n        None,\n        {},\n        \"mdi:ev-plug-type2\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"chargeinletlock\": [\n        \"Charge Inlet Lock\",\n        None,  # Deprecated: DO NOT USE\n        \"electric\",\n        \"chargeinletlock\",\n        \"value\",\n        None,\n        {},\n        \"mdi:ev-plug-type2\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"chargeflapdcstatus\": [\n        \"Charge Flap DC Status\",\n        None,  # Deprecated: DO NOT USE\n        \"doors\",\n        \"chargeFlapDCStatus\",\n        \"value\",\n        None,\n        {},\n        None,\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"departuretimemode\": [\n        \"Departure Time Mode\",\n        None,  # Deprecated: DO NOT USE\n        \"electric\",\n        \"departureTimeMode\",\n        \"value\",\n        None,\n        {},\n        \"mdi:ev-station\",\n        None,\n        False,\n        EntityCategory.DIAGNOSTIC,\n        None,\n        None,\n        None,\n    ],\n    \"endofchargetime\": [\n        \"End of charge\",\n        None,  # Deprecated: DO NOT USE\n        \"electric\",\n        \"endofchargetime\",\n        \"display_value\",\n        None,\n        {},\n        \"mdi:ev-station\",\n        SensorDeviceClass.TIMESTAMP,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n    \"wiperHealthPercent\": [\n        \"Wiper Health\",\n        None,  # Deprecated: DO NOT USE\n        \"wipers\",\n        \"wiperHealthPercent\",\n        \"value\",\n        None,\n        {\n            \"wiperLifetimeExceeded\",\n        },\n        \"mdi:wiper\",\n        SensorDeviceClass.POWER_FACTOR,\n        False,\n        None,\n        None,\n        None,\n        0,\n    ],\n    \"selectedchargeprogram\": [\n        \"Selected Charge Program\",\n        None,  # Deprecated: DO NOT USE\n        \"electric\",\n        \"selectedChargeProgram\",\n        \"value\",\n        None,\n        {},\n        None,\n        None,\n        False,\n        None,\n        None,\n        None,\n        0,\n    ],\n}\n\nLOCKS = {\n    \"lock\": [\n        \"Lock\",\n        None,  # Deprecated: DO NOT USE\n        \"doors\",\n        \"doorlockstatusvehicle\",\n        \"value\",\n        \"DOORS_LOCK\",\n        {},\n        None,\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n}\n\nSENSORS_POLL = {\n    \"geofencing_violation\": [\n        \"Geofencing Violation\",\n        None,  # Deprecated: DO NOT USE\n        \"geofence_events\",\n        \"last_event_type\",\n        \"value\",\n        None,\n        {\"last_event_zone\"},\n        \"mdi:map-marker-radius\",\n        None,\n        False,\n        None,\n        None,\n        None,\n        None,\n    ],\n}\n\nUNITS = {\n    \"BAR\": UnitOfPressure.BAR,\n    \"CELSIUS\": UnitOfTemperature.CELSIUS,\n    \"FAHRENHEIT\": UnitOfTemperature.FAHRENHEIT,\n    \"KG_PER_100KM\": UnitOfMass.KILOGRAMS + \"/100\" + UnitOfLength.KILOMETERS,\n    \"KILOMETERS\": UnitOfLength.KILOMETERS,\n    \"KM_PER_HOUR\": UnitOfSpeed.KILOMETERS_PER_HOUR,\n    \"KM_PER_KWH\": UnitOfLength.KILOMETERS + \"/\" + UnitOfEnergy.KILO_WATT_HOUR,\n    \"KM_PER_LITER\": UnitOfLength.KILOMETERS + \"/\" + UnitOfVolume.LITERS,\n    \"KPA\": UnitOfPressure.KPA,\n    \"KW\": UnitOfPower.KILO_WATT,\n    \"KWH_PER_100KM\": UnitOfEnergy.KILO_WATT_HOUR + \"/100\" + UnitOfLength.KILOMETERS,\n    \"KWH_PER_100MI\": UnitOfEnergy.KILO_WATT_HOUR + \"/100\" + UnitOfLength.MILES,\n    \"LITER_PER_100KM\": UnitOfVolume.LITERS + \"/100\" + UnitOfLength.KILOMETERS,\n    \"M_PER_HOUR\": UnitOfSpeed.MILES_PER_HOUR,\n    \"M_PER_KWH\": \"mpkWh\",\n    \"MILES\": UnitOfLength.MILES,\n    \"MPG_UK\": \"mpg\",\n    \"MPG_US\": \"mpg\",\n    \"MPGE\": \"mpge\",\n    \"PERCENT\": PERCENTAGE,\n    \"PSI\": UnitOfPressure.PSI,\n    \"T24H\": \"\",\n    \"T12H\": \"\",\n    \"%\": PERCENTAGE,\n}\n\n\nclass SensorConfigFields(Enum):\n    \"\"\"Representation of a Sensor.\"\"\"\n\n    # \"internal_name\":[ 0 Display_Name\n    #                   1 unit_of_measurement,\n    #                   2 object in car.py\n    #                   3 attribute in car.py\n    #                   4 value field\n    #                   5 unused --> None (for capabilities check in the future)\n    #                   6 [list of extended attributes]\n    #                   7 icon\n    #                   8 device_class\n    #                   9 invert boolean value - Default: False\n    #                   10 entity_category - Default: None\n    #                   11 state_class - Default: None\n    #                   12 default_value_mode - Default: None\n    #                   13 suggested_display_precision - Default: None\n    # ]\n    DISPLAY_NAME = 0\n    UNIT_OF_MEASUREMENT = 1\n    OBJECT_NAME = 2\n    ATTRIBUTE_NAME = 3\n    VALUE_FIELD_NAME = 4\n    CAPABILITIES_LIST = 5\n    EXTENDED_ATTRIBUTE_LIST = 6\n    ICON = 7\n    DEVICE_CLASS = 8\n    FLIP_RESULT = 9\n    ENTITY_CATEGORY = 10\n    STATE_CLASS = 11\n    DEFAULT_VALUE_MODE = 12\n    SUGGESTED_DISPLAY_PRECISION = 13\n\n\nclass DefaultValueModeType(StrEnum):\n    \"\"\"Source type for device trackers.\"\"\"\n\n    NONE = \"None\"\n    ZERO = \"Zero\"\n"
  },
  {
    "path": "custom_components/mbapi2020/coordinator.py",
    "content": "\"\"\"DataUpdateCoordinator class for the MBAPI2020 Integration.\"\"\"\n\nfrom __future__ import annotations\n\nimport logging\nfrom typing import Any\n\nfrom awesomeversion import AwesomeVersion\n\nfrom homeassistant.config_entries import ConfigEntry\nfrom homeassistant.const import __version__ as HAVERSION\nfrom homeassistant.core import HomeAssistant, callback\nfrom homeassistant.helpers.aiohttp_client import async_get_clientsession\nfrom homeassistant.helpers.entity_platform import async_get_platforms\nfrom homeassistant.helpers.update_coordinator import DataUpdateCoordinator\n\nfrom .car import Car\nfrom .client import Client\nfrom .const import CONF_REGION, DOMAIN, MERCEDESME_COMPONENTS, UPDATE_INTERVAL, VERIFY_SSL\nfrom .errors import MbapiError\nfrom .helper import LogHelper as loghelper\n\nLOGGER = logging.getLogger(__name__)\n\n# Version threshold for config_entry setting in options flow\n# See: https://github.com/home-assistant/core/pull/127980\nHA_DATACOORDINATOR_CONTEXTVAR_VERSION_THRESHOLD = \"2025.07.99\"\n\n\nclass MBAPI2020DataUpdateCoordinator(DataUpdateCoordinator[dict[str, Any]]):\n    \"\"\"DataUpdateCoordinator class for the MBAPI2020 Integration.\"\"\"\n\n    def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry) -> None:\n        \"\"\"Initialize.\"\"\"\n\n        self.hass: HomeAssistant = hass\n        self.config_entry: ConfigEntry = config_entry\n        self.initialized: bool = False\n        self.entry_setup_complete: bool = False\n        session = async_get_clientsession(hass, VERIFY_SSL)\n\n        # Find the right way to migrate old configs\n        region = config_entry.data.get(CONF_REGION, None)\n        if region is None:\n            region = \"Europe\"\n\n        self.client = Client(hass, session, config_entry, region)\n\n        if AwesomeVersion(HAVERSION) < HA_DATACOORDINATOR_CONTEXTVAR_VERSION_THRESHOLD:\n            super().__init__(hass, LOGGER, name=DOMAIN, update_interval=UPDATE_INTERVAL)\n        else:\n            super().__init__(hass, LOGGER, name=DOMAIN, config_entry=config_entry, update_interval=UPDATE_INTERVAL)\n\n    async def _async_update_data(self) -> dict[str, Car]:\n        \"\"\"Update data via library.\"\"\"\n\n        if self.entry_setup_complete:\n            try:\n                for vin in self.client.cars:\n                    await self.client.update_poll_states(vin)\n            except Exception as err:\n                raise MbapiError from err\n\n        return {}  # self.client.cars\n\n    @callback\n    async def on_dataload_complete(self):\n        \"\"\"Create sensors after the web_socket initial data is complete.\"\"\"\n        if not self.entry_setup_complete:\n            LOGGER.info(\"Car Load complete - start sensor creation\")\n            await self.hass.config_entries.async_forward_entry_setups(self.config_entry, MERCEDESME_COMPONENTS)\n\n        self.entry_setup_complete = True\n        self.client._dataload_complete_fired = True\n\n    async def ws_connect(self):\n        \"\"\"Register handlers and connect to the websocket.\"\"\"\n        await self.client.attempt_connect(self.on_dataload_complete, self)\n\n    @callback\n    async def check_missing_sensors_for_vin(self, vin: str):\n        \"\"\"Check for newly available sensors after vep_updates.\"\"\"\n        if not self.entry_setup_complete:\n            return\n\n        from .binary_sensor import create_missing_binary_sensors_for_car  # noqa: PLC0415\n        from .sensor import create_missing_sensors_for_car  # noqa: PLC0415\n\n        car = self.client.cars.get(vin)\n        if not car:\n            return\n\n        platforms = async_get_platforms(self.hass, \"mbapi2020\")\n        sensor_platform = None\n        binary_sensor_platform = None\n        for platform in platforms:\n            if platform.domain == \"sensor\":\n                sensor_platform = platform\n            elif platform.domain == \"binary_sensor\":\n                binary_sensor_platform = platform\n\n        total_count = 0\n\n        if sensor_platform and hasattr(sensor_platform, \"async_add_entities\"):\n            count = await create_missing_sensors_for_car(car, self, sensor_platform.async_add_entities)\n            total_count += count\n\n        if binary_sensor_platform and hasattr(binary_sensor_platform, \"async_add_entities\"):\n            count = await create_missing_binary_sensors_for_car(car, self, binary_sensor_platform.async_add_entities)\n            total_count += count\n\n        if total_count > 0:\n            LOGGER.info(\"Added %d missing sensors/binary_sensors for %s\", total_count, loghelper.Mask_VIN(vin))\n"
  },
  {
    "path": "custom_components/mbapi2020/device_tracker.py",
    "content": "\"\"\"Device Tracker support for Mercedes cars with Mercedes ME.\n\nFor more details about this component, please refer to the documentation at\nhttps://github.com/ReneNulschDE/mbapi2020/\n\"\"\"\n\nfrom __future__ import annotations\n\nimport logging\n\nfrom homeassistant.components.device_tracker import SourceType, TrackerEntity\nfrom homeassistant.config_entries import ConfigEntry\nfrom homeassistant.core import HomeAssistant\nfrom homeassistant.helpers.entity_platform import AddEntitiesCallback\nfrom homeassistant.helpers.restore_state import RestoreEntity\n\nfrom . import MercedesMeEntity\nfrom .const import DEVICE_TRACKER, DOMAIN\nfrom .coordinator import MBAPI2020DataUpdateCoordinator\nfrom .helper import CoordinatesHelper as ch\n\nLOGGER = logging.getLogger(__name__)\n\n\nasync def async_setup_entry(\n    hass: HomeAssistant,\n    config_entry: ConfigEntry,\n    async_add_entities: AddEntitiesCallback,\n) -> None:\n    \"\"\"Set up the MB device tracker by config_entry.\"\"\"\n\n    coordinator: MBAPI2020DataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id]\n\n    if not coordinator.client.cars:\n        LOGGER.info(\"No Cars found.\")\n        return\n\n    sensor_list = []\n\n    for car in coordinator.client.cars.values():\n        for key, value in sorted(DEVICE_TRACKER.items()):\n            device = MercedesMEDeviceTracker(\n                internal_name=key,\n                config=value,\n                vin=car.finorvin,\n                coordinator=coordinator,\n            )\n            if device.device_retrieval_status() in [\"VALID\", \"NOT_RECEIVED\"]:\n                sensor_list.append(device)\n\n    async_add_entities(sensor_list, True)\n\n\nclass MercedesMEDeviceTracker(MercedesMeEntity, TrackerEntity, RestoreEntity):\n    \"\"\"Representation of a Sensor.\"\"\"\n\n    @property\n    def latitude(self) -> float | None:\n        \"\"\"Return latitude value of the device.\"\"\"\n        lat = self._get_car_value(\"location\", \"positionLat\", \"value\", 0)\n        lng = self._get_car_value(\"location\", \"positionLong\", \"value\", 0)\n\n        if self._use_chinese_location_data:\n            lng, lat = ch.gcj02_to_wgs84(gcj_lon=lng, gcj_lat=lat)\n\n        return lat or None\n\n    @property\n    def longitude(self) -> float | None:\n        \"\"\"Return longitude value of the device.\"\"\"\n        lat = self._get_car_value(\"location\", \"positionLat\", \"value\", 0)\n        lng = self._get_car_value(\"location\", \"positionLong\", \"value\", 0)\n\n        if self._use_chinese_location_data:\n            lng, lat = ch.gcj02_to_wgs84(gcj_lon=lng, gcj_lat=lat)\n\n        return lng or None\n\n    @property\n    def source_type(self):\n        \"\"\"Return the source type, eg gps or router, of the device.\"\"\"\n        return SourceType.GPS\n\n    @property\n    def device_class(self):\n        \"\"\"Return the device class of the device tracker.\"\"\"\n        return None\n"
  },
  {
    "path": "custom_components/mbapi2020/diagnostics.py",
    "content": "\"\"\"Diagnostics support for MBAPI2020.\"\"\"\n\nfrom __future__ import annotations\n\nimport json\nfrom typing import Any\n\nfrom homeassistant.components.diagnostics import async_redact_data\nfrom homeassistant.config_entries import ConfigEntry\nfrom homeassistant.core import HomeAssistant\n\nfrom .const import DOMAIN, JSON_EXPORT_IGNORED_KEYS\nfrom .helper import LogHelper as loghelper, MBJSONEncoder\n\n\nasync def async_get_config_entry_diagnostics(\n    hass: HomeAssistant,\n    config_entry: ConfigEntry,\n) -> dict[str, Any]:\n    \"\"\"Return diagnostics for a config entry.\"\"\"\n    domain = hass.data[DOMAIN][config_entry.entry_id]\n\n    data = {\"entry\": config_entry.as_dict(), \"cars\": []}\n\n    for car in domain.client.cars.values():\n        data[\"cars\"].append({loghelper.Mask_VIN(car.finorvin): json.loads(json.dumps(car, cls=MBJSONEncoder))})\n\n    return async_redact_data(data, JSON_EXPORT_IGNORED_KEYS)\n"
  },
  {
    "path": "custom_components/mbapi2020/errors.py",
    "content": "\"\"\"Define package errors.\"\"\"\n\nfrom __future__ import annotations\n\nfrom homeassistant.exceptions import ConfigEntryAuthFailed, HomeAssistantError\n\n\nclass MbapiError(HomeAssistantError):\n    \"\"\"Define a base error.\"\"\"\n\n\nclass WebsocketError(MbapiError):\n    \"\"\"Define an error related to generic websocket errors.\"\"\"\n\n\nclass RequestError(MbapiError):\n    \"\"\"Define an error related to generic websocket errors.\"\"\"\n\n\nclass MBAuthError(ConfigEntryAuthFailed):\n    \"\"\"Define an error related to authentication.\"\"\"\n\n\nclass MBAuth2FAError(ConfigEntryAuthFailed):\n    \"\"\"Define an error related to two-factor authentication (2FA).\"\"\"\n\n\nclass MBLegalTermsError(ConfigEntryAuthFailed):\n    \"\"\"Define an error related to acceptance of legal terms.\"\"\"\n"
  },
  {
    "path": "custom_components/mbapi2020/helper.py",
    "content": "\"\"\"Helper functions for MBAPI2020 integration.\"\"\"\n\nfrom __future__ import annotations\n\nimport asyncio\nimport base64\nfrom collections.abc import Awaitable, Callable\nimport datetime\nfrom enum import Enum\nimport inspect\nimport json\nimport logging\nimport math\n\nfrom .const import (\n    JSON_EXPORT_IGNORED_KEYS,\n    LOGIN_APP_ID_CN,\n    LOGIN_APP_ID_EU,\n    LOGIN_BASE_URI,\n    LOGIN_BASE_URI_CN,\n    PSAG_BASE_URI,\n    PSAG_BASE_URI_CN,\n    RCP_BASE_URI,\n    RCP_BASE_URI_CN,\n    REGION_APAC,\n    REGION_CHINA,\n    REGION_EUROPE,\n    REGION_NORAM,\n    REST_API_BASE,\n    REST_API_BASE_CN,\n    REST_API_BASE_NA,\n    REST_API_BASE_PA,\n    WEBSOCKET_API_BASE,\n    WEBSOCKET_API_BASE_CN,\n    WEBSOCKET_API_BASE_NA,\n)\n\nLOGGER = logging.getLogger(__name__)\n\n\nclass LogHelper:\n    \"\"\"Helper functions for MBAPI2020 logging.\"\"\"\n\n    @staticmethod\n    def Mask_VIN(vin: str) -> str:\n        if len(vin) > 12:\n            return vin[:5] + \"X\" * (12 - 5 + 1) + vin[13:]\n        return \"X\" * len(vin)\n\n    @staticmethod\n    def Mask_email(email: str) -> str:\n        if len(email) > 7:\n            return email[:2] + \"X\" * (6 - 2 + 1) + email[7:]\n        return \"x\" * len(email)\n\n\nclass UrlHelper:\n    \"\"\"Helper functions for MBAPI2020 url handling.\"\"\"\n\n    @staticmethod\n    def Rest_url(region: str) -> str:\n        match region:\n            case current if current == REGION_APAC:\n                return REST_API_BASE_PA\n            case current if current == REGION_CHINA:\n                return REST_API_BASE_CN\n            case current if current == REGION_NORAM:\n                return REST_API_BASE_NA\n            case current if current == REGION_EUROPE:\n                return REST_API_BASE\n\n    @staticmethod\n    def Websocket_url(region: str) -> str:\n        match region:\n            case current if current == REGION_APAC:\n                return WEBSOCKET_API_BASE_NA\n            case current if current == REGION_CHINA:\n                return WEBSOCKET_API_BASE_CN\n            case current if current == REGION_NORAM:\n                return WEBSOCKET_API_BASE_NA\n            case current if current == REGION_EUROPE:\n                return WEBSOCKET_API_BASE\n\n    @staticmethod\n    def Widget_url(region: str) -> str:\n        env: str = \"emea\"\n\n        match region:\n            case current if current in (REGION_APAC, REGION_NORAM):\n                env = \"amap\"\n            case current if current == REGION_CHINA:\n                env = \"cn\"\n            case current if current == REGION_EUROPE:\n                env = \"emea\"\n\n        return f\"https://widget.{env}-prod.mobilesdk.mercedes-benz.com\"\n\n    @staticmethod\n    def Device_code_confirm_url(region: str, device_code: str) -> str:\n        \"\"\"Return a formatted url to confirm a device code auth.\"\"\"\n        base64_code = base64.b64encode(device_code).decode(\"ascii\")\n        env = \"emea\"\n        match region:\n            case current if current == REGION_APAC:\n                env = \"amap\"\n            case current if current == REGION_CHINA:\n                env = \"cn\"\n            case current if current == REGION_NORAM:\n                env = \"amap\"\n\n        return (\n            f\"https://link.{env}-prod.mobilesdk.mercedes-benz.com/device-login?userCode={base64_code}&deviceType=watch\"\n        )\n\n    @staticmethod\n    def RCP_url(region: str) -> str:\n        match region:\n            case current if current == REGION_CHINA:\n                return RCP_BASE_URI_CN\n            case _:\n                return RCP_BASE_URI\n\n    @staticmethod\n    def PSAG_url(region: str) -> str:\n        match region:\n            case current if current == REGION_CHINA:\n                return PSAG_BASE_URI_CN\n            case _:\n                return PSAG_BASE_URI\n\n    @staticmethod\n    def Login_Base_Url(region: str) -> str:\n        match region:\n            case current if current == REGION_CHINA:\n                return LOGIN_BASE_URI_CN\n            case _:\n                return LOGIN_BASE_URI\n\n    @staticmethod\n    def Login_App_Id(region: str) -> str:\n        match region:\n            case current if current == REGION_CHINA:\n                return LOGIN_APP_ID_CN\n            case _:\n                return LOGIN_APP_ID_EU\n\n\nclass CoordinatesHelper:\n    @staticmethod\n    def _transform_lat(lon, lat):\n        \"\"\"Transform latitude for GCJ-02 offset calculation.\n\n        :param lon: Longitude offset\n        :param lat: Latitude offset\n        :return: Transformed latitude\n        \"\"\"\n        ret = -100.0 + 2.0 * lon + 3.0 * lat + 0.2 * lat * lat + 0.1 * lon * lat + 0.2 * math.sqrt(abs(lon))\n        ret += (20.0 * math.sin(6.0 * lon * math.pi) + 20.0 * math.sin(2.0 * lon * math.pi)) * 2.0 / 3.0\n        ret += (20.0 * math.sin(lat * math.pi) + 40.0 * math.sin(lat / 3.0 * math.pi)) * 2.0 / 3.0\n        ret += (160.0 * math.sin(lat / 12.0 * math.pi) + 320 * math.sin(lat * math.pi / 30.0)) * 2.0 / 3.0\n        return ret\n\n    @staticmethod\n    def _transform_lon(lon, lat):\n        \"\"\"Transform longitude for GCJ-02 offset calculation.\n\n        :param lon: Longitude offset\n        :param lat: Latitude offset\n        :return: Transformed longitude\n        \"\"\"\n        ret = 300.0 + lon + 2.0 * lat + 0.1 * lon * lon + 0.1 * lon * lat + 0.1 * math.sqrt(abs(lon))\n        ret += (20.0 * math.sin(6.0 * lon * math.pi) + 20.0 * math.sin(2.0 * lon * math.pi)) * 2.0 / 3.0\n        ret += (20.0 * math.sin(lon * math.pi) + 40.0 * math.sin(lon / 3.0 * math.pi)) * 2.0 / 3.0\n        ret += (150.0 * math.sin(lon / 12.0 * math.pi) + 300.0 * math.sin(lon / 30.0 * math.pi)) * 2.0 / 3.0\n        return ret\n\n    @staticmethod\n    def wgs84_to_gcj02(lon, lat):\n        \"\"\"Convert WGS-84 coordinates to GCJ-02 coordinates.\n\n        :param lon: WGS-84 longitude\n        :param lat: WGS-84 latitude\n        :return: GCJ-02 longitude and latitude\n        \"\"\"\n        a = 6378245.0  # Major axis\n        ee = 0.00669342162296594323  # Flattening\n\n        dlat = CoordinatesHelper._transform_lat(lon - 105.0, lat - 35.0)\n        dlon = CoordinatesHelper._transform_lon(lon - 105.0, lat - 35.0)\n        radlat = lat / 180.0 * math.pi\n        magic = math.sin(radlat)\n        magic = 1 - ee * magic * magic\n        sqrtmagic = math.sqrt(magic)\n        dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * math.pi)\n        dlon = (dlon * 180.0) / (a / sqrtmagic * math.cos(radlat) * math.pi)\n        mglat = lat + dlat\n        mglon = lon + dlon\n        return mglon, mglat\n\n    @staticmethod\n    def gcj02_to_wgs84(gcj_lon, gcj_lat):\n        \"\"\"Convert GCJ-02 coordinates to WGS-84 coordinates.\n\n        :param gcj_lon: GCJ-02 longitude\n        :param gcj_lat: GCJ-02 latitude\n        :return: WGS-84 longitude and latitude\n        \"\"\"\n        EARTH_RADIUS = 6378245.0\n        EE = 0.00669342162296594323\n\n        dlat = CoordinatesHelper._transform_lat(gcj_lon - 105.0, gcj_lat - 35.0)\n        dlon = CoordinatesHelper._transform_lon(gcj_lon - 105.0, gcj_lat - 35.0)\n        rad_lat = gcj_lat / 180.0 * math.pi\n        magic = math.sin(rad_lat)\n        magic = 1 - EE * magic * magic\n        sqrt_magic = math.sqrt(magic)\n        dlat = (dlat * 180.0) / ((EARTH_RADIUS * (1 - EE)) / (magic * sqrt_magic) * math.pi)\n        dlon = (dlon * 180.0) / (EARTH_RADIUS / sqrt_magic * math.cos(rad_lat) * math.pi)\n        wgs_lat = gcj_lat - dlat\n        wgs_lon = gcj_lon - dlon\n        return wgs_lon, wgs_lat\n\n\ndef get_class_property_names(obj: object):\n    \"\"\"Return the names of all properties of a class.\"\"\"\n    return [p[0] for p in inspect.getmembers(type(obj), inspect.isdatadescriptor) if not p[0].startswith(\"_\")]\n\n\nclass MBJSONEncoder(json.JSONEncoder):\n    \"\"\"JSON Encoder that handles data classes, properties and additional data types.\"\"\"\n\n    def default(self, o) -> str | dict:  # noqa: D102\n        if isinstance(o, (datetime.datetime, datetime.date, datetime.time)):\n            return o.isoformat()\n        if not isinstance(o, Enum) and hasattr(o, \"__dict__\") and isinstance(o.__dict__, dict):\n            retval: dict = o.__dict__\n            retval.update({p: getattr(o, p) for p in get_class_property_names(o)})\n            return {k: v for k, v in retval.items() if k not in JSON_EXPORT_IGNORED_KEYS}\n        return str(o)\n\n\nclass Watchdog:\n    \"\"\"Define a watchdog to run actions at intervals.\"\"\"\n\n    def __init__(self, action: Callable[..., Awaitable], timeout_seconds: int, topic: str, log_events: bool = False):\n        \"\"\"Initialize.\"\"\"\n        self._action: Callable[..., Awaitable] = action\n        self._loop = asyncio.get_running_loop()\n        self._timer_task: asyncio.TimerHandle | None = None\n        self._expire_task: asyncio.Task | None = None\n        self._topic: str = topic\n        self._log_events: bool = log_events\n        self.timeout: int = timeout_seconds\n\n    def cancel(self, *, graceful: bool = True):\n        \"\"\"Cancel the watchdog.\n\n        graceful=True: stoppe nur den Timer; lasse einen laufenden expire-Task fertiglaufen.\n        graceful=False: cancelt auch einen laufenden expire-Task (vorsichtig verwenden).\n        \"\"\"\n\n        if self._timer_task:\n            self._timer_task.cancel()\n            self._timer_task = None\n\n        if self._expire_task and not self._expire_task.done():\n            if graceful:\n                # Falls wir UNS SELBST sind: auf keinen Fall sofort canceln\n                if asyncio.current_task() is self._expire_task:\n                    # optional: gar nichts tun; der Task beendet sich gleich selbst\n                    pass\n                else:\n                    # Laufenden expire-Task laufen lassen (kein Cancel)\n                    pass\n            else:\n                # Hartes Cancel nur, wenn explizit gewünscht\n                self._expire_task.cancel()\n                self._expire_task = None\n\n    async def on_expire(self):\n        \"\"\"Log and act when the watchdog expires.\"\"\"\n        try:\n            if self._log_events:\n                LOGGER.debug(\"%s Watchdog expired – calling %s\", self._topic, self._action.__name__)\n            await self._action()\n        except asyncio.CancelledError:  # noqa: TRY203\n            # Don't log here - will be logged in _on_expire_task_done callback\n            raise\n\n    async def trigger(self):\n        \"\"\"Trigger the watchdog.\"\"\"\n        # if self._log_events:\n        #     LOGGER.debug(\"%s Watchdog trigger\", self._topic)\n        if self._timer_task:\n            self._timer_task.cancel()\n\n        # Cancel any existing expire task\n        if self._expire_task and not self._expire_task.done():\n            self._expire_task.cancel()\n            self._expire_task = None\n\n        self._timer_task = self._loop.call_later(self.timeout, self._on_timer_expire)\n\n    def _on_timer_expire(self):\n        \"\"\"Handle timer expiration - create and manage the expire task.\"\"\"\n        # Create and store the expire task for proper management\n        self._expire_task = asyncio.create_task(self.on_expire())\n\n        # Add done callback to clean up the task reference\n        self._expire_task.add_done_callback(self._on_expire_task_done)\n\n    def _on_expire_task_done(self, task: asyncio.Task):\n        \"\"\"Cleanup when expire task is done.\"\"\"\n        self._expire_task = None\n\n        if task.cancelled():\n            # Task was cancelled - this is normal during shutdown\n            if self._log_events:\n                LOGGER.debug(\"%s Watchdog expire task cancelled.\", self._topic)\n        else:\n            # Safe exception handling - only check for exceptions if not cancelled\n            try:\n                exc = task.exception()\n                if exc and self._log_events:\n                    LOGGER.error(\"%s Watchdog expire task failed: %s\", self._topic, exc)\n            except asyncio.CancelledError:\n                # This shouldn't happen, but just in case\n                pass\n"
  },
  {
    "path": "custom_components/mbapi2020/icons.json",
    "content": "{\n  \"services\": {\n    \"auxheat_configure\": \"mdi:radiator\",\n    \"auxheat_start\": \"mdi:radiator\",\n    \"auxheat_stop\": \"mdi:radiator\",\n    \"battery_max_soc_configure\": \"mdi:car-battery\",\n    \"charging_break_clocktimer_configure\": \"mdi:power-plug-off\",\n    \"charge_program_configure\": \"mdi:car-battery\",\n    \"doors_unlock\": \"mdi:car-door\",\n    \"doors_lock\": \"mdi:car-door\",\n    \"download_images\": \"mdi:download\",\n    \"engine_start\": \"mdi:engine\",\n    \"engine_stop\": \"mdi:engine-off\",\n    \"hv_battery_start_conditioning\": \"mdi:car-battery\",\n    \"hv_battery_stop_conditioning\": \"mdi:car-battery\",\n    \"preconditioning_configure\": \"mdi:car-seat-heater\",\n    \"preconditioning_configure_seats\": \"mdi:car-seat-heater\",\n    \"preheat_start\": \"mdi:car-seat-heater\",\n    \"preheat_start_departure_time\": \"mdi:car-seat-heater\",\n    \"preheat_stop\": \"mdi:car-seat-heater\",\n    \"preheat_stop_departure_time\": \"mdi:car-seat-heater\",\n    \"sigpos_start\": \"mdi:bugle\",\n    \"sunroof_open\": \"mdi:car-door\",\n    \"sunroof_tilt\": \"mdi:car-door\",\n    \"sunroof_close\": \"mdi:car-door\",\n    \"windows_open\": \"mdi:car-door\",\n    \"windows_close\": \"mdi:car-door\",\n    \"windows_move\": \"mdi:car-door\",\n    \"send_route\": \"mdi:routes\",\n    \"temperature_configure\": \"mdi:temperature-check\"\n  },\n  \"entity\": {\n    \"sensor\": {\n      \"selectedchargeprogram\": {\n        \"default\": \"mdi:ev-station\",\n        \"state\": {\n          \"0\": \"mdi:ev-station\",\n          \"2\": \"mdi:home-battery\",\n          \"3\": \"mdi:office-building\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/lock.py",
    "content": "\"\"\"Lock Support for Mercedes cars with Mercedes ME.\n\nFor more details about this component, please refer to the documentation at\nhttps://github.com/ReneNulschDE/mbapi2020/\n\"\"\"\n\nfrom __future__ import annotations\n\nimport asyncio\n\nfrom homeassistant.components.lock import LockEntity\nfrom homeassistant.config_entries import ConfigEntry\nfrom homeassistant.const import ATTR_CODE\nfrom homeassistant.core import HomeAssistant\nfrom homeassistant.helpers.entity_platform import AddEntitiesCallback\nfrom homeassistant.helpers.restore_state import RestoreEntity\n\nfrom . import MercedesMeEntity\nfrom .const import CONF_FT_DISABLE_CAPABILITY_CHECK, CONF_PIN, DOMAIN, LOCKS, LOGGER, SensorConfigFields as scf\nfrom .coordinator import MBAPI2020DataUpdateCoordinator\n\n\nasync def async_setup_entry(\n    hass: HomeAssistant,\n    config_entry: ConfigEntry,\n    async_add_entities: AddEntitiesCallback,\n) -> None:\n    \"\"\"Create the sensor platform.\"\"\"\n\n    coordinator: MBAPI2020DataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id]\n\n    if not coordinator.client.cars:\n        LOGGER.info(\"No Cars found.\")\n        return\n\n    sensor_list = []\n    for car in coordinator.client.cars.values():\n        for key, value in sorted(LOCKS.items()):\n            if (\n                value[scf.CAPABILITIES_LIST.value] is None\n                or config_entry.options.get(CONF_FT_DISABLE_CAPABILITY_CHECK, False) is True\n                or car.features.get(value[scf.CAPABILITIES_LIST.value], False) is True\n            ):\n                device = MercedesMELock(\n                    internal_name=key,\n                    config=value,\n                    vin=car.finorvin,\n                    coordinator=coordinator,\n                )\n                sensor_list.append(device)\n\n    async_add_entities(sensor_list, True)\n\n\nclass MercedesMELock(MercedesMeEntity, LockEntity, RestoreEntity):\n    \"\"\"Representation of a Lock.\"\"\"\n\n    async def async_lock(self, **kwargs):\n        \"\"\"Lock the device.\"\"\"\n        old_state = self.is_locked\n        LOGGER.debug(\"starting lock\")\n        self._attr_is_locking = True\n        await self._coordinator.client.doors_lock(self._vin)\n        LOGGER.debug(\"lock initiated\")\n\n        count = 0\n        while count < 30:\n            if old_state == self.is_locked:\n                count += 1\n                LOGGER.debug(\"lock running %s\", count)\n                await asyncio.sleep(1)\n            else:\n                break\n\n        self._attr_is_locking = False\n        LOGGER.debug(\"unlock finalized %s\", count)\n\n    async def async_unlock(self, **kwargs):\n        \"\"\"Unlock the device.\"\"\"\n        old_state = self.is_locked\n        LOGGER.debug(\"starting unlock\")\n        code = kwargs.get(ATTR_CODE, \"\")\n        pin = self._coordinator.client.config_entry.options.get(CONF_PIN, \"\")\n        self._attr_is_unlocking = True\n\n        if pin and pin.strip():\n            await self._coordinator.client.doors_unlock_with_pin(self._vin, pin)\n        elif code is None or not code.strip():\n            LOGGER.error(\"Code required but none provided\")\n            self._attr_is_unlocking = False\n            return\n        else:\n            await self._coordinator.client.doors_unlock_with_pin(self._vin, code)\n\n        LOGGER.debug(\"unlock initiated\")\n        count = 0\n        while count < 30:\n            if old_state == self.is_locked:\n                count += 1\n                LOGGER.debug(\"unlock running %s\", count)\n                await asyncio.sleep(1)\n            else:\n                break\n        self._attr_is_unlocking = False\n        LOGGER.debug(\"unlock finalized %s\", count)\n\n    @property\n    def is_locked(self):\n        \"\"\"Return true if device is locked.\"\"\"\n\n        value = self._get_car_value(self._feature_name, self._object_name, self._attrib_name, None)\n        if value and int(value) in (1, 2):\n            return True\n\n        if value and int(value) in (0, 3):\n            return False\n\n        return None\n\n    @property\n    def code_format(self):\n        \"\"\"Return the required four digit code if the PIN is not set in config_entry.\"\"\"\n\n        pin = self._coordinator.client.config_entry.options.get(CONF_PIN, None)\n\n        if pin and pin.strip():\n            # Pin is set --> we don't ask for a pin\n            return None\n\n        # Pin is not set --> we ask for a pin\n        return \"^\\\\d{4}$\"\n"
  },
  {
    "path": "custom_components/mbapi2020/manifest.json",
    "content": "{\n  \"domain\": \"mbapi2020\",\n  \"name\": \"MercedesME 2020\",\n  \"codeowners\": [\"@ReneNulschDE\"],\n  \"config_flow\": true,\n  \"dependencies\": [],\n  \"documentation\": \"https://github.com/ReneNulschDE/mbapi2020\",\n  \"integration_type\": \"hub\",\n  \"iot_class\": \"cloud_push\",\n  \"issue_tracker\": \"https://github.com/ReneNulschDE/mbapi2020/issues\",\n  \"loggers\": [\"custom_components.mbapi2020\"],\n  \"requirements\": [\"protobuf>=3.19.5\"],\n  \"version\": \"0.36.0\"\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/oauth.py",
    "content": "\"\"\"Integration of optimized Mercedes Me OAuth2 LoginNew functionality.\"\"\"\n\nfrom __future__ import annotations\n\nimport asyncio\nimport base64\nfrom copy import deepcopy\nimport hashlib\nimport json\nimport logging\nimport secrets\nimport time\nfrom typing import Any\nimport urllib.parse\nimport uuid\n\nimport aiohttp\nfrom aiohttp import ClientSession\n\nfrom custom_components.mbapi2020.errors import MBAuth2FAError, MBAuthError, MBLegalTermsError\nfrom homeassistant.config_entries import ConfigEntry\nfrom homeassistant.core import HomeAssistant\nfrom homeassistant.helpers.aiohttp_client import async_create_clientsession\n\nfrom .const import (\n    DEFAULT_COUNTRY_CODE,\n    DEFAULT_LOCALE,\n    LOGIN_APP_ID_CN,\n    LOGIN_APP_ID_EU,\n    REGION_APAC,\n    REGION_CHINA,\n    REGION_EUROPE,\n    REGION_NORAM,\n    RIS_APPLICATION_VERSION,\n    RIS_APPLICATION_VERSION_CN,\n    RIS_APPLICATION_VERSION_NA,\n    RIS_APPLICATION_VERSION_PA,\n    RIS_OS_NAME,\n    RIS_OS_VERSION,\n    RIS_SDK_VERSION,\n    SYSTEM_PROXY,\n    VERIFY_SSL,\n    WEBSOCKET_USER_AGENT,\n    WEBSOCKET_USER_AGENT_CN,\n    WEBSOCKET_USER_AGENT_PA,\n    X_APPLICATIONNAME_AP,\n    X_APPLICATIONNAME_CN,\n    X_APPLICATIONNAME_ECE,\n    X_APPLICATIONNAME_US,\n)\nfrom .helper import LogHelper, UrlHelper as helper\n\n_LOGGER = logging.getLogger(__name__)\n\n\nclass Oauth:\n    \"\"\"OAuth2 class for Mercedes Me integration.\"\"\"\n\n    # OAuth2 Configuration for new login method\n    CLIENT_ID = LOGIN_APP_ID_EU\n    REDIRECT_URI = \"rismycar://login-callback\"\n    SCOPE = \"email profile ciam-uid phone openid offline_access\"\n\n    def __init__(\n        self,\n        hass: HomeAssistant,\n        session: ClientSession,\n        region: str,\n        config_entry: ConfigEntry,\n    ) -> None:\n        \"\"\"Initialize the extended OAuth instance.\"\"\"\n        self._session: ClientSession = session\n        self._region: str = region\n        self._hass = hass\n        self._config_entry = config_entry\n        self.token = None\n        self._sessionid = \"\"\n        self._get_token_lock = asyncio.Lock()\n        self._device_guid: str = (config_entry.data.get(\"device_guid\") if config_entry else None) or str(uuid.uuid4())\n\n        if region == REGION_CHINA:\n            self.CLIENT_ID = LOGIN_APP_ID_CN\n\n        # PKCE parameters for new login method\n        self.code_verifier: str | None = None\n        self.code_challenge: str | None = None\n\n    def _generate_pkce_parameters(self) -> tuple[str, str]:\n        \"\"\"Generate PKCE (Proof Key for Code Exchange) parameters for OAuth2.\n\n        Returns:\n            tuple: (code_verifier, code_challenge)\n\n        \"\"\"\n        # Generate code_verifier (43-128 characters, URL-safe)\n        code_verifier = base64.urlsafe_b64encode(secrets.token_bytes(32)).decode(\"utf-8\").rstrip(\"=\")\n\n        # Generate code_challenge (SHA256 hash of code_verifier, base64url encoded)\n        code_challenge_bytes = hashlib.sha256(code_verifier.encode(\"utf-8\")).digest()\n        code_challenge = base64.urlsafe_b64encode(code_challenge_bytes).decode(\"utf-8\").rstrip(\"=\")\n\n        _LOGGER.debug(\"Generated PKCE parameters for OAuth2 flow\")\n        return code_verifier, code_challenge\n\n    def _ensure_pkce_parameters(self) -> None:\n        \"\"\"Ensure PKCE parameters are generated.\"\"\"\n        if not self.code_verifier or not self.code_challenge:\n            self.code_verifier, self.code_challenge = self._generate_pkce_parameters()\n\n    async def async_login_new(self, email: str, password: str) -> dict[str, Any]:\n        \"\"\"Perform new OAuth2 login flow with PKCE.\n\n        Args:\n            email: Mercedes Me account email\n            password: Mercedes Me account password\n\n        Returns:\n            dict containing token information\n\n        Raises:\n            MBAuthError: If login fails\n\n        \"\"\"\n        _LOGGER.info(\"Starting OAuth2 login flow\")\n\n        # create a fresh session with CIAM.DEVICE cookie\n        device_guid = self._device_guid\n        cookie_jar = aiohttp.CookieJar()\n        cookie_jar.update_cookies({\"CIAM.DEVICE\": device_guid})\n        self._session = async_create_clientsession(self._hass, verify_ssl=VERIFY_SSL, cookie_jar=cookie_jar)\n\n        try:\n            # Step 1: Get authorization URL and extract resume parameter\n            resume_url = await self._get_authorization_resume()\n\n            # Step 2: Send user agent information\n            await self._send_user_agent_info()\n\n            # Step 3: Submit username\n            await self._submit_username(email)\n\n            # Step 4: Submit password and get pre-login token\n            pre_login_data = await self._submit_password(email, password)\n\n            if pre_login_data and pre_login_data.get(\"result\", \"\") != \"RESUME2OIDCP\":\n                if pre_login_data.get(\"result\", \"\") == \"GOTO_LOGIN_OTP\":\n                    raise MBAuth2FAError(\"Two-factor authentication (2FA) is not supported.\")\n\n                if pre_login_data.get(\"result\", \"\") == \"GOTO_LOGIN_LEGAL_TEXTS\":\n                    home_ountry = pre_login_data.get(\"homeCountry\", \"\")\n                    consent_country = pre_login_data.get(\"consentCountry\", \"\")\n                    pre_login_data = await self._submit_legal_consent(home_ountry, consent_country)\n                    if pre_login_data.get(\"result\", \"\") != \"RESUME2OIDCP\":\n                        raise MBLegalTermsError(\"Problem accepting legal terms during login. %s\", pre_login_data)\n                else:\n                    raise MBAuthError(\"Unexpected login result: %s\", pre_login_data)\n\n            # Step 5: Resume authorization and get code\n            auth_code = await self._resume_authorization(resume_url, pre_login_data[\"token\"])\n\n            # Step 6: Exchange code for tokens\n            token_info = await self._exchange_code_for_tokens(auth_code)\n\n            # Add custom values and save token\n            token_info = self._add_custom_values_to_token_info(token_info)\n            self._save_token_info(token_info)\n            self.token = token_info\n\n            self.code_verifier = None\n            self.code_challenge = None\n\n            _LOGGER.info(\"OAuth2 login successful\")\n            return token_info\n\n        except (MBAuth2FAError, MBLegalTermsError):\n            raise\n        except Exception as e:\n            _LOGGER.error(\"OAuth2 login failed: %s\", e)\n            raise MBAuthError(f\"Login failed: {e}\") from e\n\n    def _get_mobile_safari_headers(\n        self,\n        accept: str = \"application/json, text/plain, */*\",\n        include_referer: bool = True,\n    ) -> dict[str, str]:\n        \"\"\"Build headers with mobile Safari user agent and common fields.\"\"\"\n        base_url = helper.Login_Base_Url(self._region)\n        headers = {\n            \"accept\": accept,\n            \"content-type\": \"application/json\",\n            \"origin\": base_url,\n            \"accept-language\": \"de-DE,de;q=0.9\",\n            \"user-agent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS 15_8_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6.6 Mobile/15E148 Safari/604.1\",\n        }\n\n        if include_referer:\n            headers[\"referer\"] = f\"{base_url}/ciam/auth/login\"\n\n        return headers\n\n    def _extract_code_from_redirect_url(self, redirect_url: str) -> str:\n        \"\"\"Extract authorization code from redirect URL.\"\"\"\n        parsed_url = urllib.parse.urlparse(redirect_url)\n        params = urllib.parse.parse_qs(parsed_url.query)\n        code = params.get(\"code\", [None])[0]\n\n        if not code:\n            raise MBAuthError(\"Authorization code not found in redirect URL\")\n\n        return code\n\n    async def _get_authorization_resume(self) -> str:\n        \"\"\"Get authorization URL and extract resume parameter.\"\"\"\n        self._ensure_pkce_parameters()\n\n        params = {\n            \"client_id\": self.CLIENT_ID,\n            \"code_challenge\": self.code_challenge,\n            \"code_challenge_method\": \"S256\",\n            \"redirect_uri\": self.REDIRECT_URI,\n            \"response_type\": \"code\",\n            \"scope\": self.SCOPE,\n        }\n\n        headers = {\n            \"user-agent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS 15_8_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6.6 Mobile/15E148 Safari/604.1\",\n            \"accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n            \"accept-language\": \"de-DE,de;q=0.9\",\n        }\n\n        auth_url = f\"{helper.Login_Base_Url(self._region)}/as/authorization.oauth2\"\n\n        async with self._session.get(\n            auth_url, params=params, headers=headers, proxy=SYSTEM_PROXY, allow_redirects=True\n        ) as response:\n            if response.status >= 400:\n                raise MBAuthError(f\"Authorization request failed: {response.status}\")\n\n            parsed_url = urllib.parse.urlparse(str(response.url))\n            url_params = urllib.parse.parse_qs(parsed_url.query)\n            resume = url_params.get(\"resume\", [None])[0]\n\n            if not resume:\n                raise MBAuthError(\"Resume parameter not found in authorization response\")\n\n            return resume\n\n    async def _send_user_agent_info(self) -> None:\n        \"\"\"Send user agent information.\"\"\"\n        headers = self._get_mobile_safari_headers(\n            accept=\"*/*\",\n            include_referer=False,\n        )\n\n        data = {\n            \"browserName\": \"Mobile Safari\",\n            \"browserVersion\": \"15.6.6\",\n            \"osName\": \"iOS\",\n        }\n\n        url = f\"{helper.Login_Base_Url(self._region)}/ciam/auth/ua\"\n\n        async with self._session.post(url, json=data, headers=headers, proxy=SYSTEM_PROXY) as response:\n            if response.status >= 400:\n                _LOGGER.warning(\"User agent info submission failed: %s\", response.status)\n\n    async def _submit_username(self, email: str) -> None:\n        \"\"\"Submit username.\"\"\"\n        headers = self._get_mobile_safari_headers()\n        url = f\"{helper.Login_Base_Url(self._region)}/ciam/auth/login/user\"\n\n        async with self._session.post(url, json={\"username\": email}, headers=headers, proxy=SYSTEM_PROXY) as response:\n            if response.status >= 400:\n                error_text = await response.text()\n                raise MBAuthError(f\"Username submission failed: {response.status} - {error_text}\")\n\n    async def _submit_password(self, email: str, password: str) -> dict[str, Any]:\n        \"\"\"Submit password and get pre-login data.\"\"\"\n        rid = secrets.token_urlsafe(24)\n        headers = self._get_mobile_safari_headers()\n\n        data = {\n            \"username\": email,\n            \"password\": password,\n            \"rememberMe\": False,\n            \"rid\": rid,\n        }\n\n        url = f\"{helper.Login_Base_Url(self._region)}/ciam/auth/login/pass\"\n\n        async with self._session.post(url, json=data, headers=headers, proxy=SYSTEM_PROXY) as response:\n            if response.status >= 400:\n                error_text = await response.text()\n                raise MBAuthError(f\"Password submission failed: {response.status} - {error_text}\")\n\n            return await response.json()\n\n    async def _submit_legal_consent(self, home_country: str, consent_country: str) -> dict[str, Any]:\n        \"\"\"Submit legal consent and get pre-login data.\"\"\"\n        headers = self._get_mobile_safari_headers()\n\n        data = {\n            \"texts\": {},\n            \"homeCountry\": home_country,\n            \"consentCountry\": consent_country,\n        }\n\n        url = f\"{helper.Login_Base_Url(self._region)}/ciam/auth/toas/saveLoginConsent\"\n\n        async with self._session.post(url, json=data, headers=headers, proxy=SYSTEM_PROXY) as response:\n            if response.status >= 400:\n                error_text = await response.text()\n                raise MBAuthError(f\"legal_consent submission failed: {response.status} - {error_text}\")\n\n            return await response.json()\n\n    async def _resume_authorization(self, resume_url: str, token: str) -> str:\n        \"\"\"Resume authorization and extract code.\"\"\"\n        headers = self._get_mobile_safari_headers()\n        headers[\"accept\"] = \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\"\n        headers[\"content-type\"] = \"application/x-www-form-urlencoded\"\n\n        data = aiohttp.FormData({\"token\": token})\n\n        try:\n            async with self._session.post(\n                f\"{helper.Login_Base_Url(self._region)}{resume_url}\",\n                data=data,\n                headers=headers,\n                proxy=SYSTEM_PROXY,\n                allow_redirects=False,\n            ) as response:\n                if response.status in (302, 301):\n                    redirect_url = response.headers.get(\"location\", \"\")\n                    if redirect_url.startswith(\"rismycar://\"):\n                        return self._extract_code_from_redirect_url(redirect_url)\n\n                raise MBAuthError(f\"Unexpected response during authorization: {response.status}\")\n\n        except aiohttp.InvalidURL as e:\n            # Handle custom scheme redirect\n            error_str = str(e)\n            if \"rismycar://\" in error_str:\n                # Extract URL from error message\n                start = error_str.find(\"'\") + 1\n                end = error_str.find(\"'\", start)\n                redirect_url = error_str[start:end]\n\n                try:\n                    return self._extract_code_from_redirect_url(redirect_url)\n                except MBAuthError as extract_error:\n                    raise MBAuthError(\"Authorization code not found in redirect URL\") from extract_error\n\n            raise MBAuthError(f\"Unexpected URL error: {e}\") from e\n\n    async def _exchange_code_for_tokens(self, code: str) -> dict[str, Any]:\n        \"\"\"Exchange authorization code for access and refresh tokens.\"\"\"\n        if not self.code_verifier:\n            raise MBAuthError(\"Code verifier not available for token exchange\")\n\n        headers = self._get_header()\n        headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\"\n\n        data = {\n            \"client_id\": self.CLIENT_ID,\n            \"code\": code,\n            \"code_verifier\": self.code_verifier,\n            \"grant_type\": \"authorization_code\",\n            \"redirect_uri\": self.REDIRECT_URI,\n        }\n\n        # Convert to form data\n        form_data = \"&\".join([f\"{k}={urllib.parse.quote_plus(str(v))}\" for k, v in data.items()])\n\n        url = f\"{helper.Login_Base_Url(self._region)}/as/token.oauth2\"\n\n        async with self._session.post(url, data=form_data, headers=headers, proxy=SYSTEM_PROXY) as response:\n            if response.status >= 400:\n                error_text = await response.text()\n                raise MBAuthError(f\"Token exchange failed: {response.status} - {error_text}\")\n\n            return await response.json()\n\n    async def request_access_token_with_pin(self, email: str, pin: str, nonce: str):\n        \"\"\"Request the access token using the Pin.\"\"\"\n        url = f\"{helper.Login_Base_Url(self._region)}/as/token.oauth2\"\n        encoded_email = urllib.parse.quote_plus(email, safe=\"@\")\n\n        data = (\n            f\"client_id={helper.Login_App_Id(self._region)}&grant_type=password&username={encoded_email}&password={nonce}:{pin}\"\n            \"&scope=openid email phone profile offline_access ciam-uid\"\n        )\n\n        headers = self._get_header()\n        headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\"\n        headers[\"Stage\"] = \"prod\"\n        headers[\"X-Device-Id\"] = self._device_guid\n        headers[\"X-Request-Id\"] = str(uuid.uuid4())\n\n        token_info = await self._async_request(\"post\", url, data=data, headers=headers)\n\n        if token_info is not None:\n            token_info = self._add_custom_values_to_token_info(token_info)\n            self._save_token_info(token_info)\n            self.token = token_info\n            return token_info\n\n        return None\n\n    async def request_pin(self, email: str, nonce: str):\n        \"\"\"Initiate a PIN request.\"\"\"\n        _LOGGER.info(\"Start request PIN %s\", LogHelper.Mask_email(email))\n        _LOGGER.debug(\"PIN preflight request 1\")\n        headers = self._get_header()\n        url = f\"{helper.Rest_url(self._region)}/v1/config\"\n        await self._async_request(\"get\", url, headers=headers)\n\n        _LOGGER.info(\"PIN request\")\n        url = f\"{helper.Rest_url(self._region)}/v1/login\"\n        data = json.dumps({\"emailOrPhoneNumber\": email, \"countryCode\": DEFAULT_COUNTRY_CODE, \"nonce\": nonce})\n        headers = self._get_header()\n        return await self._async_request(\"post\", url, data=data, headers=headers)\n\n    async def async_refresh_access_token(self, refresh_token: str, is_retry: bool = False):\n        \"\"\"Refresh the access token.\"\"\"\n        _LOGGER.info(\"Start async_refresh_access_token() with refresh_token\")\n\n        _LOGGER.debug(\"Auth token refresh preflight request 1\")\n        headers = self._get_header()\n        url = f\"{helper.Rest_url(self._region)}/v1/config\"\n        await self._async_request(\"get\", url, headers=headers)\n\n        url = f\"{helper.Login_Base_Url(self._region)}/as/token.oauth2\"\n        data = f\"grant_type=refresh_token&refresh_token={refresh_token}\"\n\n        headers = self._get_header()\n        headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\"\n        headers[\"X-Device-Id\"] = self._device_guid\n        headers[\"X-Request-Id\"] = str(uuid.uuid4())\n\n        token_info = None\n        try:\n            token_info = await self._async_request(method=\"post\", url=url, data=data, headers=headers)\n\n        except MBAuthError:\n            if is_retry:\n                if self._config_entry and self._config_entry.data:\n                    new_config_entry_data = deepcopy(dict(self._config_entry.data))\n                    new_config_entry_data.pop(\"token\", None)\n                    self._hass.config_entries.async_update_entry(self._config_entry, data=new_config_entry_data)\n                raise\n\n        if token_info is not None:\n            if \"refresh_token\" not in token_info:\n                token_info[\"refresh_token\"] = refresh_token\n            token_info = self._add_custom_values_to_token_info(token_info)\n            self._save_token_info(token_info)\n            self.token = token_info\n\n        return token_info\n\n    async def async_get_cached_token(self):\n        \"\"\"Get a cached auth token.\"\"\"\n        # _LOGGER.debug(\"Start async_get_cached_token()\")\n        token_info: dict[str, any]\n\n        if self.token:\n            token_info = self.token\n        elif self._config_entry and self._config_entry.data and \"token\" in self._config_entry.data:\n            token_info = self._config_entry.data[\"token\"]\n        else:\n            _LOGGER.warning(\"No token information - reauth required\")\n            return None\n\n        if self.is_token_expired(token_info):\n            async with self._get_token_lock:\n                if not self.is_token_expired(self.token or token_info):\n                    token_info = self.token\n                else:\n                    _LOGGER.debug(\"%s token expired -> start refresh\", __name__)\n                    if not token_info or \"refresh_token\" not in token_info:\n                        _LOGGER.warning(\"Refresh token is missing - reauth required\")\n                        return None\n\n                    token_info = await self.async_refresh_access_token(token_info[\"refresh_token\"], is_retry=False)\n\n        self.token = token_info\n        return token_info\n\n    @classmethod\n    def is_token_expired(cls, token_info) -> bool:\n        \"\"\"Check if the token is expired.\"\"\"\n        if token_info is not None:\n            now = int(time.time())\n            return token_info[\"expires_at\"] - now < 60\n        return True\n\n    def _save_token_info(self, token_info):\n        \"\"\"Save token info.\"\"\"\n        if self._config_entry:\n            _LOGGER.debug(\n                \"Start _save_token_info() to config_entry %s\",\n                self._config_entry.entry_id,\n            )\n\n            new_config_entry_data = deepcopy(dict(self._config_entry.data))\n            new_config_entry_data[\"token\"] = token_info\n\n            # Ensure device_guid is preserved\n            if self._device_guid:\n                new_config_entry_data[\"device_guid\"] = self._device_guid\n\n            self._hass.config_entries.async_update_entry(self._config_entry, data=new_config_entry_data)\n\n    @classmethod\n    def _add_custom_values_to_token_info(cls, token_info):\n        \"\"\"Add custom values to token info.\"\"\"\n        token_info[\"expires_at\"] = int(time.time()) + token_info[\"expires_in\"]\n        return token_info\n\n    def _get_header(self):\n        \"\"\"Get headers with Session-ID.\"\"\"\n        if not self._sessionid:\n            self._sessionid = str(uuid.uuid4())\n\n        header = {\n            \"Ris-Os-Name\": RIS_OS_NAME,\n            \"Ris-Os-Version\": RIS_OS_VERSION,\n            \"Ris-Sdk-Version\": RIS_SDK_VERSION,\n            \"X-Locale\": DEFAULT_LOCALE,\n            \"X-Trackingid\": str(uuid.uuid4()),\n            \"X-Sessionid\": self._sessionid,\n            \"User-Agent\": WEBSOCKET_USER_AGENT,\n            \"Content-Type\": \"application/json\",\n            \"Accept-Language\": \"en-GB\",\n        }\n\n        return self._get_region_header(header)\n\n    def _get_region_header(self, header):\n        \"\"\"Get region-specific headers.\"\"\"\n        if self._region == REGION_EUROPE:\n            header[\"X-Applicationname\"] = X_APPLICATIONNAME_ECE\n            header[\"Ris-Application-Version\"] = RIS_APPLICATION_VERSION\n\n        if self._region == REGION_NORAM:\n            header[\"X-Applicationname\"] = X_APPLICATIONNAME_US\n            header[\"Ris-Application-Version\"] = RIS_APPLICATION_VERSION_NA\n\n        if self._region == REGION_APAC:\n            header[\"X-Applicationname\"] = X_APPLICATIONNAME_AP\n            header[\"Ris-Application-Version\"] = RIS_APPLICATION_VERSION_PA\n            header[\"User-Agent\"] = WEBSOCKET_USER_AGENT_PA\n\n        if self._region == REGION_CHINA:\n            header[\"X-Applicationname\"] = X_APPLICATIONNAME_CN\n            header[\"Ris-Application-Version\"] = RIS_APPLICATION_VERSION_CN\n            header[\"User-Agent\"] = WEBSOCKET_USER_AGENT_CN\n\n        return header\n\n    async def _async_request(self, method: str, url: str, data: str = \"\", **kwargs):\n        \"\"\"Make a request against the API.\"\"\"\n        kwargs.setdefault(\"headers\", {})\n        kwargs.setdefault(\"proxy\", SYSTEM_PROXY)\n\n        if not self._session or self._session.closed:\n            device_guid = self._device_guid\n            cookie_jar = aiohttp.CookieJar()\n            cookie_jar.update_cookies({\"CIAM.DEVICE\": device_guid})\n            self._session = async_create_clientsession(self._hass, verify_ssl=VERIFY_SSL, cookie_jar=cookie_jar)\n\n        async with self._session.request(method, url, data=data, **kwargs) as resp:\n            if 400 <= resp.status <= 500:\n                try:\n                    error = await resp.text()\n                    error_json = json.loads(error)\n                    if error_json:\n                        error_message = f\"Error requesting: {url} - {error_json['code']} - {error_json['errors']}\"\n                    else:\n                        error_message = f\"Error requesting: {url} - 0 - {error}\"\n                except (json.JSONDecodeError, KeyError):\n                    error_message = f\"Error requesting: {url} - 0 - {error}\"\n\n                _LOGGER.error(error_message)\n                raise MBAuthError(error_message)\n\n            return await resp.json(content_type=None)\n"
  },
  {
    "path": "custom_components/mbapi2020/proto/acp_pb2.py",
    "content": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: acp.proto\n# Protobuf Python Version: 5.29.5\n\"\"\"Generated protocol buffer code.\"\"\"\n\nfrom google.protobuf import (\n    descriptor as _descriptor,\n    descriptor_pool as _descriptor_pool,\n    symbol_database as _symbol_database,\n)\nfrom google.protobuf.internal import builder as _builder\n\n# @@protoc_insertion_point(imports)\n\n_sym_db = _symbol_database.Default()\n\n\nimport custom_components.mbapi2020.proto.gogo_pb2 as gogo__pb2\n\nDESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(\n    b'\\n\\tacp.proto\\x12\\x05proto\\x1a\\ngogo.proto\"\\xa5\\x02\\n\\x03VVA\"v\\n\\x0c\\x43ommandState\\x12\\x19\\n\\x15UNKNOWN_COMMAND_STATE\\x10\\x00\\x12\\x0c\\n\\x07\\x43REATED\\x10\\xf2\\x07\\x12\\r\\n\\x08\\x45NQUEUED\\x10\\xf8\\x07\\x12\\x0f\\n\\nPROCESSING\\x10\\xf4\\x07\\x12\\x0e\\n\\tSUSPENDED\\x10\\xf9\\x07\\x12\\r\\n\\x08\\x46INISHED\\x10\\xfa\\x07\"\\xa5\\x01\\n\\x10\\x43ommandCondition\\x12\\x1d\\n\\x19UNKNWON_COMMAND_CONDITION\\x10\\x00\\x12\\t\\n\\x04NONE\\x10\\xe8\\x07\\x12\\r\\n\\x08\\x41\\x43\\x43\\x45PTED\\x10\\xe9\\x07\\x12\\r\\n\\x08REJECTED\\x10\\xea\\x07\\x12\\x0e\\n\\tTERMINATE\\x10\\xeb\\x07\\x12\\x0c\\n\\x07SUCCESS\\x10\\xf3\\x07\\x12\\x0b\\n\\x06\\x46\\x41ILED\\x10\\xf5\\x07\\x12\\x10\\n\\x0bOVERWRITTEN\\x10\\xf6\\x07\\x12\\x0c\\n\\x07TIMEOUT\\x10\\xf7\\x07\"\\xfe\\x0b\\n\\nVehicleAPI\"\\xec\\x01\\n\\x0c\\x43ommandState\\x12\\x19\\n\\x15UNKNOWN_COMMAND_STATE\\x10\\x00\\x12\\x0e\\n\\nINITIATION\\x10\\x01\\x12\\x0c\\n\\x08\\x45NQUEUED\\x10\\x02\\x12\\x0e\\n\\nPROCESSING\\x10\\x03\\x12\\x0b\\n\\x07WAITING\\x10\\x04\\x12\\x0c\\n\\x08\\x46INISHED\\x10\\x05\\x12\\n\\n\\x06\\x46\\x41ILED\\x10\\x06\\x12\\x14\\n\\x10\\x41\\x43KED_BY_APPTWIN\\x10\\x07\\x12\\r\\n\\tPIN_VALID\\x10\\x08\\x12\\x0f\\n\\x0bWAKEUP_SENT\\x10\\t\\x12\\x12\\n\\x0eWAITING_WAKEUP\\x10\\n\\x12\\x10\\n\\x0cWAITING_SYNC\\x10\\x0b\\x12\\x10\\n\\x0c\\x43OMMAND_SENT\\x10\\x0c\"S\\n\\x0f\\x41ttributeStatus\\x12\\r\\n\\tVALUE_SET\\x10\\x00\\x12\\x11\\n\\rVALUE_NOT_SET\\x10\\x01\\x12\\x0b\\n\\x07INVALID\\x10\\x03\\x12\\x11\\n\\rNOT_AVAILABLE\\x10\\x04\"\\xab\\t\\n\\tQueueType\\x12\\x1b\\n\\x17UNKNOWNCOMMANDQUEUETYPE\\x10\\x00\\x12\\t\\n\\x05\\x44OORS\\x10\\n\\x12\\x0b\\n\\x07\\x41UXHEAT\\x10\\x0b\\x12\\x0b\\n\\x07PRECOND\\x10\\x0c\\x12\\r\\n\\tCHARGEOPT\\x10\\r\\x12\\x0f\\n\\x0bMAINTENANCE\\x10\\x0e\\x12\\x07\\n\\x03TCU\\x10\\x0f\\x12\\x08\\n\\x04\\x46\\x45\\x45\\x44\\x10\\x10\\x12\\x15\\n\\x11SERVICEACTIVATION\\x10\\x11\\x12\\x07\\n\\x03\\x41TP\\x10\\x12\\x12\\x0e\\n\\nASSISTANCE\\x10\\x13\\x12\\x08\\n\\x04RACP\\x10\\x14\\x12\\x0f\\n\\x0bWEEKPROFILE\\x10\\x15\\x12\\x13\\n\\x0fREMOTEDIAGNOSIS\\x10\\x16\\x12\\x08\\n\\x04\\x46LSH\\x10\\x17\\x12\\x0f\\n\\x0bTEMPERATURE\\x10\\x18\\x12\\x0c\\n\\x08TRIPCOMP\\x10\\x19\\x12\\n\\n\\x06\\x45NGINE\\x10\\x1a\\x12\\x0e\\n\\nTHEFTALARM\\x10\\x1b\\x12\\n\\n\\x06WINDOW\\x10\\x1c\\x12\\x0c\\n\\x08HEADUNIT\\x10\\x1d\\x12\\n\\n\\x06MECALL\\x10\\x1f\\x12\\x0f\\n\\x0bIMMOBILIZER\\x10 \\x12\\x10\\n\\x0cRENTALSIGNAL\\x10!\\x12\\x07\\n\\x03\\x42\\x43\\x46\\x10\"\\x12\\x11\\n\\rPLUGANDCHARGE\\x10#\\x12\\x14\\n\\x10\\x43\\x41RSHARINGMODULE\\x10$\\x12\\x0b\\n\\x07\\x42\\x41TTERY\\x10%\\x12\\x11\\n\\rONBOARDFENCES\\x10&\\x12\\x0f\\n\\x0bSPEEDFENCES\\x10\\'\\x12\\x13\\n\\x0f\\x43HARGINGTARIFFS\\x10(\\x12\\r\\n\\tRTMCONFIG\\x10)\\x12\\x17\\n\\x13MAINTENANCECOMPUTER\\x10*\\x12\\x0b\\n\\x07MECALL2\\x10+\\x12\\x19\\n\\x15\\x41UTOMATEDVALETPARKING\\x10,\\x12\\x11\\n\\rCHARGECONTROL\\x10-\\x12\\x0e\\n\\nSPEEDALERT\\x10.\\x12\\x1b\\n\\x17unknowncommandqueuetype\\x10\\x00\\x12\\t\\n\\x05\\x64oors\\x10\\n\\x12\\x0b\\n\\x07\\x61uxheat\\x10\\x0b\\x12\\x0b\\n\\x07precond\\x10\\x0c\\x12\\r\\n\\tchargeopt\\x10\\r\\x12\\x0f\\n\\x0bmaintenance\\x10\\x0e\\x12\\x07\\n\\x03tcu\\x10\\x0f\\x12\\x08\\n\\x04\\x66\\x65\\x65\\x64\\x10\\x10\\x12\\x15\\n\\x11serviceactivation\\x10\\x11\\x12\\x07\\n\\x03\\x61tp\\x10\\x12\\x12\\x0e\\n\\nassistance\\x10\\x13\\x12\\x08\\n\\x04racp\\x10\\x14\\x12\\x0f\\n\\x0bweekprofile\\x10\\x15\\x12\\x13\\n\\x0fremotediagnosis\\x10\\x16\\x12\\x08\\n\\x04\\x66lsh\\x10\\x17\\x12\\x0f\\n\\x0btemperature\\x10\\x18\\x12\\x0c\\n\\x08tripcomp\\x10\\x19\\x12\\n\\n\\x06\\x65ngine\\x10\\x1a\\x12\\x0e\\n\\ntheftalarm\\x10\\x1b\\x12\\n\\n\\x06window\\x10\\x1c\\x12\\x0c\\n\\x08headunit\\x10\\x1d\\x12\\n\\n\\x06mecall\\x10\\x1f\\x12\\x0f\\n\\x0bimmobilizer\\x10 \\x12\\x10\\n\\x0crentalsignal\\x10!\\x12\\x07\\n\\x03\\x62\\x63\\x66\\x10\"\\x12\\x11\\n\\rplugandcharge\\x10#\\x12\\x14\\n\\x10\\x63\\x61rsharingmodule\\x10$\\x12\\x0b\\n\\x07\\x62\\x61ttery\\x10%\\x12\\x11\\n\\ronboardfences\\x10&\\x12\\x0f\\n\\x0bspeedfences\\x10\\'\\x12\\x13\\n\\x0f\\x63hargingtariffs\\x10(\\x12\\r\\n\\trtmconfig\\x10)\\x12\\x17\\n\\x13maintenancecomputer\\x10*\\x12\\x0b\\n\\x07mecall2\\x10+\\x12\\x19\\n\\x15\\x61utomatedvaletparking\\x10,\\x12\\x11\\n\\rchargecontrol\\x10-\\x12\\x0e\\n\\nspeedalert\\x10.\\x1a\\x02\\x10\\x01\"\\xed\\x31\\n\\x03\\x41\\x43P\"\\xe5\\x31\\n\\x0b\\x43ommandType\\x12\\x16\\n\\x12UNKNOWNCOMMANDTYPE\\x10\\x00\\x12\\r\\n\\tDOORSLOCK\\x10\\x64\\x12\\x0f\\n\\x0b\\x44OORSUNLOCK\\x10n\\x12\\x0f\\n\\x0bTRUNKUNLOCK\\x10s\\x12\\x12\\n\\x0e\\x46UELFLAPUNLOCK\\x10t\\x12\\x17\\n\\x13\\x43HARGECOUPLERUNLOCK\\x10v\\x12\\x16\\n\\x12\\x44OORSPREPARERENTAL\\x10x\\x12\\x17\\n\\x12\\x44OORSSECUREVEHICLE\\x10\\x82\\x01\\x12\\x11\\n\\x0c\\x41UXHEATSTART\\x10\\xac\\x02\\x12\\x10\\n\\x0b\\x41UXHEATSTOP\\x10\\xb6\\x02\\x12\\x15\\n\\x10\\x41UXHEATCONFIGURE\\x10\\xc0\\x02\\x12\\x19\\n\\x14TEMPERATURECONFIGURE\\x10\\xde\\x02\\x12\\x19\\n\\x14WEEKPROFILECONFIGURE\\x10\\xe8\\x02\\x12\\x1b\\n\\x16WEEKPROFILEV2CONFIGURE\\x10\\xf2\\x02\\x12\\x11\\n\\x0cPRECONDSTART\\x10\\x90\\x03\\x12\\x10\\n\\x0bPRECONDSTOP\\x10\\x9a\\x03\\x12\\x15\\n\\x10PRECONDCONFIGURE\\x10\\xa4\\x03\\x12\\x1a\\n\\x15PRECONDCONFIGURESEATS\\x10\\xa9\\x03\\x12\\x17\\n\\x12\\x43HARGEOPTCONFIGURE\\x10\\xae\\x03\\x12\\x13\\n\\x0e\\x43HARGEOPTSTART\\x10\\xb8\\x03\\x12\\x12\\n\\rCHARGEOPTSTOP\\x10\\xc2\\x03\\x12\\x0c\\n\\x07\\x46\\x45\\x45\\x44POI\\x10\\xf4\\x03\\x12\\x11\\n\\x0c\\x46\\x45\\x45\\x44\\x46REETEXT\\x10\\xfe\\x03\\x12\\x10\\n\\x0b\\x45NGINESTART\\x10\\xa6\\x04\\x12\\x0f\\n\\nENGINESTOP\\x10\\xb0\\x04\\x12\\x13\\n\\x0e\\x45NGINEAVPSTART\\x10\\xba\\x04\\x12\\x0e\\n\\tTCUWAKEUP\\x10\\xd8\\x04\\x12\\x10\\n\\x0bTCUSWUPDATE\\x10\\xe2\\x04\\x12\\x10\\n\\x0bTCURCSRESET\\x10\\xec\\x04\\x12\\x15\\n\\x10TCUINTERROGATION\\x10\\xf6\\x04\\x12\\x14\\n\\x0fSPEEDALERTSTART\\x10\\xc6\\x05\\x12\\x13\\n\\x0eSPEEDALERTSTOP\\x10\\xd0\\x05\\x12\\x0e\\n\\tFLSHSTART\\x10\\xee\\x05\\x12\\r\\n\\x08\\x46LSHSTOP\\x10\\xf8\\x05\\x12\\x10\\n\\x0bSIGPOSSTART\\x10\\x82\\x06\\x12\\x16\\n\\x11\\x43ONTRACTCONFIGURE\\x10\\xa0\\x06\\x12\\x13\\n\\x0e\\x43ONTRACTREMOVE\\x10\\xaa\\x06\\x12\\x12\\n\\rROOTCONFIGURE\\x10\\xb4\\x06\\x12\\x0f\\n\\nROOTREMOVE\\x10\\xbe\\x06\\x12\\r\\n\\x08TRIPCOMP\\x10\\xd2\\x06\\x12\\x19\\n\\x14MAINTENANCECONFIGURE\\x10\\xa2\\x07\\x12\\x1e\\n\\x19MAINTENANCECOMPUTEROFFSET\\x10\\xa3\\x07\\x12\\x15\\n\\x10SHORTTESTEXECUTE\\x10\\xa7\\x07\\x12\\x1f\\n\\x1aSERVICEACTIVATIONCONFIGURE\\x10\\xac\\x07\\x12\"\\n\\x1d\\x44\\x43\\x32SERVICEACTIVATIONCONFIGURE\\x10\\xb1\\x07\\x12\\x13\\n\\x0e\\x44\\x43\\x32RAWDOWNLOAD\\x10\\xb6\\x07\\x12\\x1d\\n\\x18\\x41PPLICATIONCONFIGURATION\\x10\\xbb\\x07\\x12\\x15\\n\\x10\\x44\\x43\\x32STARTTRACKING\\x10\\xc0\\x07\\x12\\x10\\n\\x0b\\x41TPSEQUENCE\\x10\\xde\\x07\\x12\\x1d\\n\\x18THEFTALARMTOGGLEINTERIOR\\x10\\xe8\\x07\\x12\\x18\\n\\x13THEFTALARMTOGGLETOW\\x10\\xf2\\x07\\x12 \\n\\x1bTHEFTALARMSELECTINTERIORTOW\\x10\\xfc\\x07\\x12\"\\n\\x1dTHEFTALARMDESELECTINTERIORTOW\\x10\\x86\\x08\\x12\\x13\\n\\x0eTHEFTALARMSTOP\\x10\\x90\\x08\\x12\\x0f\\n\\nWINDOWOPEN\\x10\\xcc\\x08\\x12\\x10\\n\\x0bWINDOWCLOSE\\x10\\xd6\\x08\\x12\\x14\\n\\x0fWINDOWVENTILATE\\x10\\xe0\\x08\\x12\\x0f\\n\\nWINDOWMOVE\\x10\\xe1\\x08\\x12\\r\\n\\x08ROOFOPEN\\x10\\xea\\x08\\x12\\x0e\\n\\tROOFCLOSE\\x10\\xf4\\x08\\x12\\r\\n\\x08ROOFLIFT\\x10\\xfe\\x08\\x12\\r\\n\\x08ROOFMOVE\\x10\\xff\\x08\\x12\\x12\\n\\rBATTERYMAXSOC\\x10\\xd0\\x0f\\x12\\x19\\n\\x14\\x42\\x41TTERYCHARGEPROGRAM\\x10\\xda\\x0f\\x12\\x1b\\n\\x16\\x43HARGEPROGRAMCONFIGURE\\x10\\xe4\\x0f\\x12\\x18\\n\\x13ONBOARDFENCESCREATE\\x10\\xb4\\x10\\x12\\x18\\n\\x13ONBOARDFENCESUPDATE\\x10\\xbe\\x10\\x12\\x18\\n\\x13ONBOARDFENCESDELETE\\x10\\xc8\\x10\\x12\\x16\\n\\x11SPEEDFENCESCREATE\\x10\\x98\\x11\\x12\\x16\\n\\x11SPEEDFENCESUPDATE\\x10\\xa2\\x11\\x12\\x16\\n\\x11SPEEDFENCESDELETE\\x10\\xac\\x11\\x12\\x1a\\n\\x15\\x43HARGINGTARIFFSCREATE\\x10\\xfc\\x11\\x12\\x1a\\n\\x15\\x43HARGINGTARIFFSUPDATE\\x10\\x86\\x12\\x12\\x1a\\n\\x15\\x43HARGINGTARIFFSDELETE\\x10\\x90\\x12\\x12\\x14\\n\\x0fTHEFTALARMSTART\\x10\\xc4\\x13\\x12\\x1d\\n\\x18THEFTALARMSELECTINTERIOR\\x10\\xce\\x13\\x12\\x1f\\n\\x1aTHEFTALARMDESELECTINTERIOR\\x10\\xd8\\x13\\x12\\x18\\n\\x13THEFTALARMSELECTTOW\\x10\\xe2\\x13\\x12\\x1a\\n\\x15THEFTALARMDESELECTTOW\\x10\\xec\\x13\\x12$\\n\\x1fTHEFTALARMSELECTDAMAGEDETECTION\\x10\\xf6\\x13\\x12&\\n!THEFTALARMDESELECTDAMAGEDETECTION\\x10\\x80\\x14\\x12%\\n THEFTALARMCONFIRMDAMAGEDETECTION\\x10\\x8a\\x14\\x12\\x11\\n\\x0cMECALL2START\\x10\\xa8\\x14\\x12\\x1e\\n\\x19UDXTRIGGERSYNCHRONIZATION\\x10\\xb0\\t\\x12\\x19\\n\\x14UDXACTIVEUSERPROFILE\\x10\\xba\\t\\x12\\x15\\n\\x10UDXRESETUSERDATA\\x10\\xc4\\t\\x12\\x12\\n\\rUSERPROFSYNCH\\x10\\xce\\t\\x12\\x12\\n\\rUSERDATARESET\\x10\\xd8\\t\\x12\\x17\\n\\x12PROFACTIVATIONSNAP\\x10\\xe2\\t\\x12\\x19\\n\\x14PROFACTIVATIONDIRECT\\x10\\xe7\\t\\x12\\x13\\n\\x0eSOFTWAREUPDATE\\x10\\xec\\t\\x12\\x15\\n\\x10PUSHNOTIFICATION\\x10\\xf6\\t\\x12\\x12\\n\\rMECALLCOMMAND\\x10\\x9e\\n\\x12\\x14\\n\\x0fPRECONDSTARTRCS\\x10\\xf8\\n\\x12\\x13\\n\\x0ePRECONDSTOPRCS\\x10\\x82\\x0b\\x12\\x18\\n\\x13PRECONDCONFIGURERCS\\x10\\x8c\\x0b\\x12\\x11\\n\\x0cTCUCONFIGURE\\x10\\x96\\x0b\\x12\\x1c\\n\\x17\\x45\\x44ISONSERVICEACTIVATION\\x10\\x97\\x0b\\x12\\x11\\n\\x0cTESTSEQUENCE\\x10\\x98\\x0b\\x12\\x19\\n\\x14PRECONDCONFIGURERACP\\x10\\x99\\x0b\\x12\\x1b\\n\\x16\\x43HARGEOPTCONFIGURERACP\\x10\\x9a\\x0b\\x12\\x18\\n\\x13TARIFFTABLEDOWNLOAD\\x10\\x9b\\x0b\\x12\\x15\\n\\x10PRECONDSTARTRACP\\x10\\x9c\\x0b\\x12\\x14\\n\\x0fPRECONDSTOPRACP\\x10\\x9d\\x0b\\x12\\x1a\\n\\x15ROOTCERTIFICATEREMOVE\\x10\\x9e\\x0b\\x12\\x19\\n\\x14ONREQUESTPROBEUPLOAD\\x10\\x9f\\x0b\\x12\\x1c\\n\\x17ROOTCERTIFICATEDOWNLOAD\\x10\\xa0\\x0b\\x12\\x1e\\n\\x19\\x43ONTRACTCERTIFICATEREMOVE\\x10\\xa1\\x0b\\x12 \\n\\x1b\\x43ONTRACTCERTIFICATEDOWNLOAD\\x10\\xa2\\x0b\\x12\\x1d\\n\\x18PROBECONFIGURATIONUPDATE\\x10\\xa3\\x0b\\x12\\x13\\n\\x0eRDIAGDELETEECU\\x10\\xdc\\x0b\\x12\\x16\\n\\x11RDIAGSTATUSREPORT\\x10\\xdd\\x0b\\x12\\x13\\n\\x0eRDIAGEXECUTION\\x10\\xde\\x0b\\x12\\x19\\n\\x14IMMOBILIZERCHALLENGE\\x10\\xc0\\x0c\\x12\\x1d\\n\\x18IMMOBILIZERSEARCHKEYLINE\\x10\\xca\\x0c\\x12\\x1e\\n\\x19IMMOBILIZERRELEASEKEYLINE\\x10\\xd4\\x0c\\x12\\x1b\\n\\x16IMMOBILIZERLOCKKEYLINE\\x10\\xde\\x0c\\x12\\x1b\\n\\x16IMMOBILIZERLOCKVEHICLE\\x10\\xdf\\x0c\\x12\\x1e\\n\\x19IMMOBILIZERRELEASEVEHICLE\\x10\\xd5\\x0c\\x12\\x14\\n\\x0fSETRENTALSIGNAL\\x10\\xa4\\r\\x12\\x19\\n\\x14\\x42LACKCHANNELDOWNLOAD\\x10\\x88\\x0e\\x12\\x17\\n\\x12\\x42LACKCHANNELUPLOAD\\x10\\x92\\x0e\\x12\\x11\\n\\x0c\\x43ONFIGURECSM\\x10\\xec\\x0e\\x12\\x16\\n\\x11UPDATEVEHICLEINFO\\x10\\xed\\x0e\\x12\\x16\\n\\x11RELAYMESSAGETOCSM\\x10\\xee\\x0e\\x12\\x1c\\n\\x17RELAYRENTALREQUESTTOCSB\\x10\\xef\\x0e\\x12\\x16\\n\\x11RTMDOWNLOADCONFIG\\x10\\xe0\\x12\\x12\\x12\\n\\rRTMREADCONFIG\\x10\\xea\\x12\\x12\\x10\\n\\x0b\\x41VPACTIVATE\\x10\\x8c\\x15\\x12\\x1b\\n\\x16\\x43HARGECONTROLCONFIGURE\\x10\\xf0\\x15\\x12%\\n CHARGINGBREAKCLOCKTIMERCONFIGURE\\x10\\xb8\\x17\\x12\\x0f\\n\\nWIPERRESET\\x10\\xa6\\x18\\x12\\x16\\n\\x12unknownCommandType\\x10\\x00\\x12\\r\\n\\tdoorsLock\\x10\\x64\\x12\\x0f\\n\\x0b\\x64oorsUnlock\\x10n\\x12\\x0f\\n\\x0btrunkUnlock\\x10s\\x12\\x12\\n\\x0e\\x66uelflapUnlock\\x10t\\x12\\x17\\n\\x13\\x63hargecouplerUnlock\\x10v\\x12\\x16\\n\\x12\\x64oorsPrepareRental\\x10x\\x12\\x17\\n\\x12\\x64oorsSecureVehicle\\x10\\x82\\x01\\x12\\x11\\n\\x0c\\x61uxheatStart\\x10\\xac\\x02\\x12\\x10\\n\\x0b\\x61uxheatStop\\x10\\xb6\\x02\\x12\\x15\\n\\x10\\x61uxheatConfigure\\x10\\xc0\\x02\\x12\\x19\\n\\x14temperatureConfigure\\x10\\xde\\x02\\x12\\x19\\n\\x14weekprofileConfigure\\x10\\xe8\\x02\\x12\\x1b\\n\\x16weekprofileV2Configure\\x10\\xf2\\x02\\x12\\x11\\n\\x0cprecondStart\\x10\\x90\\x03\\x12\\x10\\n\\x0bprecondStop\\x10\\x9a\\x03\\x12\\x15\\n\\x10precondConfigure\\x10\\xa4\\x03\\x12\\x1a\\n\\x15precondConfigureSeats\\x10\\xa9\\x03\\x12\\x17\\n\\x12\\x63hargeoptConfigure\\x10\\xae\\x03\\x12\\x13\\n\\x0e\\x63hargeoptStart\\x10\\xb8\\x03\\x12\\x12\\n\\rchargeoptStop\\x10\\xc2\\x03\\x12\\x0c\\n\\x07\\x66\\x65\\x65\\x64Poi\\x10\\xf4\\x03\\x12\\x11\\n\\x0c\\x66\\x65\\x65\\x64\\x46reetext\\x10\\xfe\\x03\\x12\\x10\\n\\x0b\\x65ngineStart\\x10\\xa6\\x04\\x12\\x0f\\n\\nengineStop\\x10\\xb0\\x04\\x12\\x13\\n\\x0e\\x65ngineAvpstart\\x10\\xba\\x04\\x12\\x0e\\n\\ttcuWakeup\\x10\\xd8\\x04\\x12\\x10\\n\\x0btcuSwUpdate\\x10\\xe2\\x04\\x12\\x10\\n\\x0btcuRcsReset\\x10\\xec\\x04\\x12\\x15\\n\\x10tcuInterrogation\\x10\\xf6\\x04\\x12\\x14\\n\\x0fspeedalertStart\\x10\\xc6\\x05\\x12\\x13\\n\\x0espeedalertStop\\x10\\xd0\\x05\\x12\\x0e\\n\\tflshStart\\x10\\xee\\x05\\x12\\r\\n\\x08\\x66lshStop\\x10\\xf8\\x05\\x12\\x10\\n\\x0bsigposStart\\x10\\x82\\x06\\x12\\x16\\n\\x11\\x63ontractConfigure\\x10\\xa0\\x06\\x12\\x13\\n\\x0e\\x63ontractRemove\\x10\\xaa\\x06\\x12\\x12\\n\\rrootConfigure\\x10\\xb4\\x06\\x12\\x0f\\n\\nrootRemove\\x10\\xbe\\x06\\x12\\r\\n\\x08tripcomp\\x10\\xd2\\x06\\x12\\x19\\n\\x14maintenanceConfigure\\x10\\xa2\\x07\\x12\\x1e\\n\\x19maintenanceComputerOffset\\x10\\xa3\\x07\\x12\\x15\\n\\x10shorttestExecute\\x10\\xa7\\x07\\x12\\x1f\\n\\x1aserviceactivationConfigure\\x10\\xac\\x07\\x12\"\\n\\x1d\\x64\\x63\\x32ServiceactivationConfigure\\x10\\xb1\\x07\\x12\\x13\\n\\x0e\\x64\\x63\\x32RawDownload\\x10\\xb6\\x07\\x12\\x1d\\n\\x18\\x61pplicationConfiguration\\x10\\xbb\\x07\\x12\\x15\\n\\x10\\x64\\x63\\x32StartTracking\\x10\\xc0\\x07\\x12\\x10\\n\\x0b\\x61tpSequence\\x10\\xde\\x07\\x12\\x1d\\n\\x18theftalarmToggleInterior\\x10\\xe8\\x07\\x12\\x18\\n\\x13theftalarmToggleTow\\x10\\xf2\\x07\\x12 \\n\\x1btheftalarmSelectInteriorTow\\x10\\xfc\\x07\\x12\"\\n\\x1dtheftalarmDeselectInteriorTow\\x10\\x86\\x08\\x12\\x13\\n\\x0etheftalarmStop\\x10\\x90\\x08\\x12\\x0f\\n\\nwindowOpen\\x10\\xcc\\x08\\x12\\x10\\n\\x0bwindowClose\\x10\\xd6\\x08\\x12\\x14\\n\\x0fwindowVentilate\\x10\\xe0\\x08\\x12\\x0f\\n\\nwindowMove\\x10\\xe1\\x08\\x12\\r\\n\\x08roofOpen\\x10\\xea\\x08\\x12\\x0e\\n\\troofClose\\x10\\xf4\\x08\\x12\\r\\n\\x08roofLift\\x10\\xfe\\x08\\x12\\r\\n\\x08roofMove\\x10\\xff\\x08\\x12\\x12\\n\\rbatteryMaxsoc\\x10\\xd0\\x0f\\x12\\x19\\n\\x14\\x62\\x61tteryChargeprogram\\x10\\xda\\x0f\\x12\\x1b\\n\\x16\\x63hargeprogramconfigure\\x10\\xe4\\x0f\\x12\\x18\\n\\x13onboardfencesCreate\\x10\\xb4\\x10\\x12\\x18\\n\\x13onboardfencesUpdate\\x10\\xbe\\x10\\x12\\x18\\n\\x13onboardfencesDelete\\x10\\xc8\\x10\\x12\\x16\\n\\x11speedfencesCreate\\x10\\x98\\x11\\x12\\x16\\n\\x11speedfencesUpdate\\x10\\xa2\\x11\\x12\\x16\\n\\x11speedfencesDelete\\x10\\xac\\x11\\x12\\x1a\\n\\x15\\x63hargingtariffsCreate\\x10\\xfc\\x11\\x12\\x1a\\n\\x15\\x63hargingtariffsUpdate\\x10\\x86\\x12\\x12\\x1a\\n\\x15\\x63hargingtariffsDelete\\x10\\x90\\x12\\x12\\x14\\n\\x0ftheftalarmstart\\x10\\xc4\\x13\\x12\\x1d\\n\\x18theftalarmselectinterior\\x10\\xce\\x13\\x12\\x1f\\n\\x1atheftalarmdeselectinterior\\x10\\xd8\\x13\\x12\\x18\\n\\x13theftalarmselecttow\\x10\\xe2\\x13\\x12\\x1a\\n\\x15theftalarmdeselecttow\\x10\\xec\\x13\\x12$\\n\\x1ftheftalarmselectdamagedetection\\x10\\xf6\\x13\\x12&\\n!theftalarmdeselectdamagedetection\\x10\\x80\\x14\\x12%\\n theftalarmconfirmdamagedetection\\x10\\x8a\\x14\\x12\\x11\\n\\x0cmecall2start\\x10\\xa8\\x14\\x12\\x1e\\n\\x19udxTriggerSynchronization\\x10\\xb0\\t\\x12\\x19\\n\\x14udxActiveUserProfile\\x10\\xba\\t\\x12\\x15\\n\\x10udxResetUserData\\x10\\xc4\\t\\x12\\x12\\n\\ruserProfSynch\\x10\\xce\\t\\x12\\x12\\n\\ruserDataReset\\x10\\xd8\\t\\x12\\x17\\n\\x12profActivationSnap\\x10\\xe2\\t\\x12\\x19\\n\\x14profActivationDirect\\x10\\xe7\\t\\x12\\x13\\n\\x0esoftwareUpdate\\x10\\xec\\t\\x12\\x15\\n\\x10pushNotification\\x10\\xf6\\t\\x12\\x12\\n\\rmecallcommand\\x10\\x9e\\n\\x12\\x14\\n\\x0fprecondStartRcs\\x10\\xf8\\n\\x12\\x13\\n\\x0eprecondStopRcs\\x10\\x82\\x0b\\x12\\x18\\n\\x13precondConfigureRcs\\x10\\x8c\\x0b\\x12\\x11\\n\\x0ctcuConfigure\\x10\\x96\\x0b\\x12\\x1c\\n\\x17\\x65\\x64isonServiceActivation\\x10\\x97\\x0b\\x12\\x11\\n\\x0ctestSequence\\x10\\x98\\x0b\\x12\\x19\\n\\x14precondConfigureRacp\\x10\\x99\\x0b\\x12\\x1b\\n\\x16\\x63hargeoptConfigureRacp\\x10\\x9a\\x0b\\x12\\x18\\n\\x13tariffTableDownload\\x10\\x9b\\x0b\\x12\\x15\\n\\x10precondStartRacp\\x10\\x9c\\x0b\\x12\\x14\\n\\x0fprecondStopRacp\\x10\\x9d\\x0b\\x12\\x1a\\n\\x15rootCertificateRemove\\x10\\x9e\\x0b\\x12\\x19\\n\\x14onRequestProbeUpload\\x10\\x9f\\x0b\\x12\\x1c\\n\\x17rootCertificateDownload\\x10\\xa0\\x0b\\x12\\x1e\\n\\x19\\x63ontractCertificateRemove\\x10\\xa1\\x0b\\x12 \\n\\x1b\\x63ontractCertificateDownload\\x10\\xa2\\x0b\\x12\\x1d\\n\\x18probeConfigurationUpdate\\x10\\xa3\\x0b\\x12\\x13\\n\\x0erdiagDeleteEcu\\x10\\xdc\\x0b\\x12\\x16\\n\\x11rdiagStatusReport\\x10\\xdd\\x0b\\x12\\x13\\n\\x0erdiagExecution\\x10\\xde\\x0b\\x12\\x19\\n\\x14immobilizerChallenge\\x10\\xc0\\x0c\\x12\\x1d\\n\\x18immobilizerSearchKeyline\\x10\\xca\\x0c\\x12\\x1e\\n\\x19immobilizerReleaseKeyline\\x10\\xd4\\x0c\\x12\\x1b\\n\\x16immobilizerLockKeyline\\x10\\xde\\x0c\\x12\\x1b\\n\\x16immobilizerLockVehicle\\x10\\xdf\\x0c\\x12\\x1e\\n\\x19immobilizerReleaseVehicle\\x10\\xd5\\x0c\\x12\\x14\\n\\x0fsetRentalSignal\\x10\\xa4\\r\\x12\\x19\\n\\x14\\x62lackchannelDownload\\x10\\x88\\x0e\\x12\\x17\\n\\x12\\x62lackchannelUpload\\x10\\x92\\x0e\\x12\\x11\\n\\x0c\\x63onfigurecsm\\x10\\xec\\x0e\\x12\\x16\\n\\x11updatevehicleinfo\\x10\\xed\\x0e\\x12\\x16\\n\\x11relaymessagetocsm\\x10\\xee\\x0e\\x12\\x1c\\n\\x17relayrentalrequesttocsb\\x10\\xef\\x0e\\x12\\x16\\n\\x11rtmDownloadConfig\\x10\\xe0\\x12\\x12\\x12\\n\\rrtmReadConfig\\x10\\xea\\x12\\x12\\x10\\n\\x0b\\x61vpActivate\\x10\\x8c\\x15\\x12\\x1b\\n\\x16\\x63hargecontrolconfigure\\x10\\xf0\\x15\\x12%\\n chargingbreakclocktimerconfigure\\x10\\xb8\\x17\\x12\\x0f\\n\\nwiperreset\\x10\\xa6\\x18\\x1a\\x02\\x10\\x01\\x42 \\n\\x1a\\x63om.daimler.mbcarkit.proto\\xd0\\xe1\\x1e\\x01\\x62\\x06proto3'\n)\n\n_globals = globals()\n_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)\n_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, \"acp_pb2\", _globals)\nif not _descriptor._USE_C_DESCRIPTORS:\n    _globals[\"DESCRIPTOR\"]._loaded_options = None\n    _globals[\"DESCRIPTOR\"]._serialized_options = b\"\\n\\032com.daimler.mbcarkit.proto\\320\\341\\036\\001\"\n    _globals[\"_VEHICLEAPI_QUEUETYPE\"]._loaded_options = None\n    _globals[\"_VEHICLEAPI_QUEUETYPE\"]._serialized_options = b\"\\020\\001\"\n    _globals[\"_ACP_COMMANDTYPE\"]._loaded_options = None\n    _globals[\"_ACP_COMMANDTYPE\"]._serialized_options = b\"\\020\\001\"\n    _globals[\"_VVA\"]._serialized_start = 33\n    _globals[\"_VVA\"]._serialized_end = 326\n    _globals[\"_VVA_COMMANDSTATE\"]._serialized_start = 40\n    _globals[\"_VVA_COMMANDSTATE\"]._serialized_end = 158\n    _globals[\"_VVA_COMMANDCONDITION\"]._serialized_start = 161\n    _globals[\"_VVA_COMMANDCONDITION\"]._serialized_end = 326\n    _globals[\"_VEHICLEAPI\"]._serialized_start = 329\n    _globals[\"_VEHICLEAPI\"]._serialized_end = 1863\n    _globals[\"_VEHICLEAPI_COMMANDSTATE\"]._serialized_start = 344\n    _globals[\"_VEHICLEAPI_COMMANDSTATE\"]._serialized_end = 580\n    _globals[\"_VEHICLEAPI_ATTRIBUTESTATUS\"]._serialized_start = 582\n    _globals[\"_VEHICLEAPI_ATTRIBUTESTATUS\"]._serialized_end = 665\n    _globals[\"_VEHICLEAPI_QUEUETYPE\"]._serialized_start = 668\n    _globals[\"_VEHICLEAPI_QUEUETYPE\"]._serialized_end = 1863\n    _globals[\"_ACP\"]._serialized_start = 1866\n    _globals[\"_ACP\"]._serialized_end = 8247\n    _globals[\"_ACP_COMMANDTYPE\"]._serialized_start = 1874\n    _globals[\"_ACP_COMMANDTYPE\"]._serialized_end = 8247\n# @@protoc_insertion_point(module_scope)\n"
  },
  {
    "path": "custom_components/mbapi2020/proto/client_pb2.py",
    "content": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: client.proto\n# Protobuf Python Version: 5.29.5\n\"\"\"Generated protocol buffer code.\"\"\"\n\nfrom google.protobuf import (\n    descriptor as _descriptor,\n    descriptor_pool as _descriptor_pool,\n    symbol_database as _symbol_database,\n)\nfrom google.protobuf.internal import builder as _builder\n\n# @@protoc_insertion_point(imports)\n\n_sym_db = _symbol_database.Default()\n\n\nimport custom_components.mbapi2020.proto.protos_pb2 as protos__pb2\nimport custom_components.mbapi2020.proto.service_activation_pb2 as service__activation__pb2\nimport custom_components.mbapi2020.proto.user_events_pb2 as user__events__pb2\nimport custom_components.mbapi2020.proto.vehicle_commands_pb2 as vehicle__commands__pb2\nimport custom_components.mbapi2020.proto.vehicle_events_pb2 as vehicle__events__pb2\nimport custom_components.mbapi2020.proto.vehicleapi_pb2 as vehicleapi__pb2\n\nDESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(\n    b'\\n\\x0c\\x63lient.proto\\x12\\x05proto\\x1a\\x0cprotos.proto\\x1a\\x18service-activation.proto\\x1a\\x11user-events.proto\\x1a\\x16vehicle-commands.proto\\x1a\\x14vehicle-events.proto\\x1a\\x10vehicleapi.proto\"\\xca\\r\\n\\rClientMessage\\x12\\x13\\n\\x0btracking_id\\x18\\x05 \\x01(\\t\\x12\\x37\\n\\x12unsubscribeRequest\\x18\\x02 \\x01(\\x0b\\x32\\x19.proto.UnsubscribeRequestH\\x00\\x12/\\n\\x0e\\x63ommandRequest\\x18\\x03 \\x01(\\x0b\\x32\\x15.proto.CommandRequestH\\x00\\x12.\\n\\x0etracking_event\\x18\\x04 \\x01(\\x0b\\x32\\x14.proto.TrackingEventH\\x00\\x12\\x35\\n\\rping_interval\\x18\\x06 \\x01(\\x0b\\x32\\x1c.proto.ConfigurePingIntervalH\\x00\\x12?\\n\\x17\\x61\\x63knowledge_vep_request\\x18\\x07 \\x01(\\x0b\\x32\\x1c.proto.AcknowledgeVEPRequestH\\x00\\x12`\\n)acknowledge_service_status_updates_by_vin\\x18\\t \\x01(\\x0b\\x32+.proto.AcknowledgeServiceStatusUpdatesByVINH\\x00\\x12R\\n!acknowledge_service_status_update\\x18\\r \\x01(\\x0b\\x32%.proto.AcknowledgeServiceStatusUpdateH\\x00\\x12H\\n\\x1c\\x61\\x63knowledge_user_data_update\\x18\\n \\x01(\\x0b\\x32 .proto.AcknowledgeUserDataUpdateH\\x00\\x12N\\n\\x1f\\x61\\x63knowledge_user_picture_update\\x18\\x0b \\x01(\\x0b\\x32#.proto.AcknowledgeUserPictureUpdateH\\x00\\x12\\x46\\n\\x1b\\x61\\x63knowledge_user_pin_update\\x18\\x0c \\x01(\\x0b\\x32\\x1f.proto.AcknowledgeUserPINUpdateH\\x00\\x12>\\n\\x17update_user_jwt_request\\x18\\x0e \\x01(\\x0b\\x32\\x1b.proto.UpdateUserJWTRequestH\\x00\\x12\\x66\\n,acknowledge_user_vehicle_auth_changed_update\\x18\\x0f \\x01(\\x0b\\x32..proto.AcknowledgeUserVehicleAuthChangedUpdateH\\x00\\x12\\x82\\x01\\n<acknowledge_ability_to_get_vehicle_master_data_from_rest_api\\x18\\x10 \\x01(\\x0b\\x32:.proto.AcknowledgeAbilityToGetVehicleMasterDataFromRestAPIH\\x00\\x12G\\n\\x1b\\x61\\x63knowledge_vehicle_updated\\x18\\x11 \\x01(\\x0b\\x32 .proto.AcknowledgeVehicleUpdatedH\\x00\\x12V\\n#acknowledge_preferred_dealer_change\\x18\\x12 \\x01(\\x0b\\x32\\'.proto.AcknowledgePreferredDealerChangeH\\x00\\x12n\\n0acknowledge_apptwin_command_status_update_by_vin\\x18\\x13 \\x01(\\x0b\\x32\\x32.proto.AcknowledgeAppTwinCommandStatusUpdatesByVINH\\x00\\x12\\x1f\\n\\x06logout\\x18\\x14 \\x01(\\x0b\\x32\\r.proto.LogoutH\\x00\\x12R\\n!apptwin_pending_commands_response\\x18\\x15 \\x01(\\x0b\\x32%.proto.AppTwinPendingCommandsResponseH\\x00\\x12K\\n\\x1e\\x61\\x63knowledge_vep_updates_by_vin\\x18\\x16 \\x01(\\x0b\\x32!.proto.AcknowledgeVEPUpdatesByVINH\\x00\\x12K\\n\\x1d\\x61\\x63knowledge_assigned_vehicles\\x18\\x17 \\x01(\\x0b\\x32\".proto.AcknowledgeAssignedVehiclesH\\x00\\x12J\\n\\x1d\\x61\\x63knowledge_data_change_event\\x18\\x1a \\x01(\\x0b\\x32!.proto.AcknowledgeDataChangeEventH\\x00\\x12T\\n\"acknowledge_vehicle_status_updates\\x18\\x1c \\x01(\\x0b\\x32&.proto.AcknowledgeVehicleStatusUpdatesH\\x00\\x42\\x05\\n\\x03msgJ\\x04\\x08\\x08\\x10\\t\"\\x08\\n\\x06LogoutB\\x1c\\n\\x1a\\x63om.daimler.mbcarkit.protob\\x06proto3'\n)\n\n_globals = globals()\n_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)\n_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, \"client_pb2\", _globals)\nif not _descriptor._USE_C_DESCRIPTORS:\n    _globals[\"DESCRIPTOR\"]._loaded_options = None\n    _globals[\"DESCRIPTOR\"]._serialized_options = b\"\\n\\032com.daimler.mbcarkit.proto\"\n    _globals[\"_CLIENTMESSAGE\"]._serialized_start = 147\n    _globals[\"_CLIENTMESSAGE\"]._serialized_end = 1885\n    _globals[\"_LOGOUT\"]._serialized_start = 1887\n    _globals[\"_LOGOUT\"]._serialized_end = 1895\n# @@protoc_insertion_point(module_scope)\n"
  },
  {
    "path": "custom_components/mbapi2020/proto/cluster_pb2.py",
    "content": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: cluster.proto\n# Protobuf Python Version: 5.29.5\n\"\"\"Generated protocol buffer code.\"\"\"\n\nfrom google.protobuf import (\n    descriptor as _descriptor,\n    descriptor_pool as _descriptor_pool,\n    symbol_database as _symbol_database,\n)\nfrom google.protobuf.internal import builder as _builder\n\n# @@protoc_insertion_point(imports)\n\n_sym_db = _symbol_database.Default()\n\n\nDESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(\n    b'\\n\\rcluster.proto\\x12\\x05proto\"V\\n\\x18\\x41ppTwinMemberStatusValue\\x12#\\n\\x06status\\x18\\x01 \\x01(\\x0e\\x32\\x13.proto.MemberStatus\\x12\\x15\\n\\rapptwin_count\\x18\\x02 \\x01(\\r*P\\n\\x0cMemberStatus\\x12\\x19\\n\\x15UNKNOWN_MEMBER_STATUS\\x10\\x00\\x12\\x0c\\n\\x08STARTING\\x10\\x01\\x12\\t\\n\\x05READY\\x10\\x02\\x12\\x0c\\n\\x08STOPPING\\x10\\x03\\x62\\x06proto3'\n)\n\n_globals = globals()\n_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)\n_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, \"cluster_pb2\", _globals)\nif not _descriptor._USE_C_DESCRIPTORS:\n    DESCRIPTOR._loaded_options = None\n    _globals[\"_MEMBERSTATUS\"]._serialized_start = 112\n    _globals[\"_MEMBERSTATUS\"]._serialized_end = 192\n    _globals[\"_APPTWINMEMBERSTATUSVALUE\"]._serialized_start = 24\n    _globals[\"_APPTWINMEMBERSTATUSVALUE\"]._serialized_end = 110\n# @@protoc_insertion_point(module_scope)\n"
  },
  {
    "path": "custom_components/mbapi2020/proto/eventpush_pb2.py",
    "content": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: eventpush.proto\n# Protobuf Python Version: 5.29.5\n\"\"\"Generated protocol buffer code.\"\"\"\n\nfrom google.protobuf import (\n    descriptor as _descriptor,\n    descriptor_pool as _descriptor_pool,\n    symbol_database as _symbol_database,\n)\nfrom google.protobuf.internal import builder as _builder\n\n# @@protoc_insertion_point(imports)\n\n_sym_db = _symbol_database.Default()\n\n\nimport custom_components.mbapi2020.proto.acp_pb2 as acp__pb2\nimport custom_components.mbapi2020.proto.gogo_pb2 as gogo__pb2\n\nDESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(\n    b'\\n\\x0f\\x65ventpush.proto\\x12\\x05proto\\x1a\\tacp.proto\\x1a\\ngogo.proto\"\\x83\\x03\\n\\x10\\x45ventPushCommand\\x12\\x10\\n\\x03vin\\x18\\x01 \\x01(\\tR\\x03vin\\x12\\x30\\n\\x05state\\x18\\x02 \\x01(\\x0e\\x32\\x17.proto.VVA.CommandStateR\\x08\\x61\\x63pState\\x12<\\n\\tcondition\\x18\\x03 \\x01(\\x0e\\x32\\x1b.proto.VVA.CommandConditionR\\x0c\\x61\\x63pCondition\\x12\\x34\\n\\x04type\\x18\\x04 \\x01(\\x0e\\x32\\x16.proto.ACP.CommandTypeR\\x0e\\x61\\x63pCommandType\\x12\\x17\\n\\nprocess_id\\x18\\x05 \\x01(\\x03R\\x03pid\\x12\\x1f\\n\\x0btracking_id\\x18\\x06 \\x01(\\tR\\ntrackingId\\x12%\\n\\x0e\\x63orrelation_id\\x18\\x07 \\x01(\\tR\\rcorrelationId\\x12\\x1f\\n\\x0b\\x65rror_codes\\x18\\x08 \\x03(\\x05R\\nerrorCodes\\x12\\x12\\n\\x04guid\\x18\\t \\x01(\\tR\\x04guid\\x12!\\n\\x0etimestamp_in_s\\x18\\n \\x01(\\x03R\\ttimestampB \\n\\x1a\\x63om.daimler.mbcarkit.proto\\xd0\\xe1\\x1e\\x01\\x62\\x06proto3'\n)\n\n_globals = globals()\n_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)\n_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, \"eventpush_pb2\", _globals)\nif not _descriptor._USE_C_DESCRIPTORS:\n    _globals[\"DESCRIPTOR\"]._loaded_options = None\n    _globals[\"DESCRIPTOR\"]._serialized_options = b\"\\n\\032com.daimler.mbcarkit.proto\\320\\341\\036\\001\"\n    _globals[\"_EVENTPUSHCOMMAND\"]._serialized_start = 50\n    _globals[\"_EVENTPUSHCOMMAND\"]._serialized_end = 437\n# @@protoc_insertion_point(module_scope)\n"
  },
  {
    "path": "custom_components/mbapi2020/proto/gogo_pb2.py",
    "content": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: gogo.proto\n# Protobuf Python Version: 5.29.5\n\"\"\"Generated protocol buffer code.\"\"\"\n\nfrom google.protobuf import (\n    descriptor as _descriptor,\n    descriptor_pool as _descriptor_pool,\n    symbol_database as _symbol_database,\n)\nfrom google.protobuf.internal import builder as _builder\n\n# @@protoc_insertion_point(imports)\n\n_sym_db = _symbol_database.Default()\n\n\nfrom google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2\n\nDESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(\n    b'\\n\\ngogo.proto\\x12\\tgogoproto\\x1a google/protobuf/descriptor.proto:;\\n\\x13goproto_enum_prefix\\x12\\x1c.google.protobuf.EnumOptions\\x18\\xb1\\xe4\\x03 \\x01(\\x08:=\\n\\x15goproto_enum_stringer\\x12\\x1c.google.protobuf.EnumOptions\\x18\\xc5\\xe4\\x03 \\x01(\\x08:5\\n\\renum_stringer\\x12\\x1c.google.protobuf.EnumOptions\\x18\\xc6\\xe4\\x03 \\x01(\\x08:7\\n\\x0f\\x65num_customname\\x12\\x1c.google.protobuf.EnumOptions\\x18\\xc7\\xe4\\x03 \\x01(\\t:0\\n\\x08\\x65numdecl\\x12\\x1c.google.protobuf.EnumOptions\\x18\\xc8\\xe4\\x03 \\x01(\\x08:A\\n\\x14\\x65numvalue_customname\\x12!.google.protobuf.EnumValueOptions\\x18\\xd1\\x83\\x04 \\x01(\\t:;\\n\\x13goproto_getters_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\x99\\xec\\x03 \\x01(\\x08:?\\n\\x17goproto_enum_prefix_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\x9a\\xec\\x03 \\x01(\\x08:<\\n\\x14goproto_stringer_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\x9b\\xec\\x03 \\x01(\\x08:9\\n\\x11verbose_equal_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\x9c\\xec\\x03 \\x01(\\x08:0\\n\\x08\\x66\\x61\\x63\\x65_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\x9d\\xec\\x03 \\x01(\\x08:4\\n\\x0cgostring_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\x9e\\xec\\x03 \\x01(\\x08:4\\n\\x0cpopulate_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\x9f\\xec\\x03 \\x01(\\x08:4\\n\\x0cstringer_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xa0\\xec\\x03 \\x01(\\x08:3\\n\\x0bonlyone_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xa1\\xec\\x03 \\x01(\\x08:1\\n\\tequal_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xa5\\xec\\x03 \\x01(\\x08:7\\n\\x0f\\x64\\x65scription_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xa6\\xec\\x03 \\x01(\\x08:3\\n\\x0btestgen_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xa7\\xec\\x03 \\x01(\\x08:4\\n\\x0c\\x62\\x65nchgen_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xa8\\xec\\x03 \\x01(\\x08:5\\n\\rmarshaler_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xa9\\xec\\x03 \\x01(\\x08:7\\n\\x0funmarshaler_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xaa\\xec\\x03 \\x01(\\x08:<\\n\\x14stable_marshaler_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xab\\xec\\x03 \\x01(\\x08:1\\n\\tsizer_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xac\\xec\\x03 \\x01(\\x08:A\\n\\x19goproto_enum_stringer_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xad\\xec\\x03 \\x01(\\x08:9\\n\\x11\\x65num_stringer_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xae\\xec\\x03 \\x01(\\x08:<\\n\\x14unsafe_marshaler_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xaf\\xec\\x03 \\x01(\\x08:>\\n\\x16unsafe_unmarshaler_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xb0\\xec\\x03 \\x01(\\x08:B\\n\\x1agoproto_extensions_map_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xb1\\xec\\x03 \\x01(\\x08:@\\n\\x18goproto_unrecognized_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xb2\\xec\\x03 \\x01(\\x08:8\\n\\x10gogoproto_import\\x12\\x1c.google.protobuf.FileOptions\\x18\\xb3\\xec\\x03 \\x01(\\x08:6\\n\\x0eprotosizer_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xb4\\xec\\x03 \\x01(\\x08:3\\n\\x0b\\x63ompare_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xb5\\xec\\x03 \\x01(\\x08:4\\n\\x0ctypedecl_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xb6\\xec\\x03 \\x01(\\x08:4\\n\\x0c\\x65numdecl_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xb7\\xec\\x03 \\x01(\\x08:<\\n\\x14goproto_registration\\x12\\x1c.google.protobuf.FileOptions\\x18\\xb8\\xec\\x03 \\x01(\\x08:7\\n\\x0fmessagename_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xb9\\xec\\x03 \\x01(\\x08:=\\n\\x15goproto_sizecache_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xba\\xec\\x03 \\x01(\\x08:;\\n\\x13goproto_unkeyed_all\\x12\\x1c.google.protobuf.FileOptions\\x18\\xbb\\xec\\x03 \\x01(\\x08::\\n\\x0fgoproto_getters\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x81\\xf4\\x03 \\x01(\\x08:;\\n\\x10goproto_stringer\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x83\\xf4\\x03 \\x01(\\x08:8\\n\\rverbose_equal\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x84\\xf4\\x03 \\x01(\\x08:/\\n\\x04\\x66\\x61\\x63\\x65\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x85\\xf4\\x03 \\x01(\\x08:3\\n\\x08gostring\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x86\\xf4\\x03 \\x01(\\x08:3\\n\\x08populate\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x87\\xf4\\x03 \\x01(\\x08:3\\n\\x08stringer\\x12\\x1f.google.protobuf.MessageOptions\\x18\\xc0\\x8b\\x04 \\x01(\\x08:2\\n\\x07onlyone\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x89\\xf4\\x03 \\x01(\\x08:0\\n\\x05\\x65qual\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x8d\\xf4\\x03 \\x01(\\x08:6\\n\\x0b\\x64\\x65scription\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x8e\\xf4\\x03 \\x01(\\x08:2\\n\\x07testgen\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x8f\\xf4\\x03 \\x01(\\x08:3\\n\\x08\\x62\\x65nchgen\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x90\\xf4\\x03 \\x01(\\x08:4\\n\\tmarshaler\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x91\\xf4\\x03 \\x01(\\x08:6\\n\\x0bunmarshaler\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x92\\xf4\\x03 \\x01(\\x08:;\\n\\x10stable_marshaler\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x93\\xf4\\x03 \\x01(\\x08:0\\n\\x05sizer\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x94\\xf4\\x03 \\x01(\\x08:;\\n\\x10unsafe_marshaler\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x97\\xf4\\x03 \\x01(\\x08:=\\n\\x12unsafe_unmarshaler\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x98\\xf4\\x03 \\x01(\\x08:A\\n\\x16goproto_extensions_map\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x99\\xf4\\x03 \\x01(\\x08:?\\n\\x14goproto_unrecognized\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x9a\\xf4\\x03 \\x01(\\x08:5\\n\\nprotosizer\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x9c\\xf4\\x03 \\x01(\\x08:2\\n\\x07\\x63ompare\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x9d\\xf4\\x03 \\x01(\\x08:3\\n\\x08typedecl\\x12\\x1f.google.protobuf.MessageOptions\\x18\\x9e\\xf4\\x03 \\x01(\\x08:6\\n\\x0bmessagename\\x12\\x1f.google.protobuf.MessageOptions\\x18\\xa1\\xf4\\x03 \\x01(\\x08:<\\n\\x11goproto_sizecache\\x12\\x1f.google.protobuf.MessageOptions\\x18\\xa2\\xf4\\x03 \\x01(\\x08::\\n\\x0fgoproto_unkeyed\\x12\\x1f.google.protobuf.MessageOptions\\x18\\xa3\\xf4\\x03 \\x01(\\x08:1\\n\\x08nullable\\x12\\x1d.google.protobuf.FieldOptions\\x18\\xe9\\xfb\\x03 \\x01(\\x08:.\\n\\x05\\x65mbed\\x12\\x1d.google.protobuf.FieldOptions\\x18\\xea\\xfb\\x03 \\x01(\\x08:3\\n\\ncustomtype\\x12\\x1d.google.protobuf.FieldOptions\\x18\\xeb\\xfb\\x03 \\x01(\\t:3\\n\\ncustomname\\x12\\x1d.google.protobuf.FieldOptions\\x18\\xec\\xfb\\x03 \\x01(\\t:0\\n\\x07jsontag\\x12\\x1d.google.protobuf.FieldOptions\\x18\\xed\\xfb\\x03 \\x01(\\t:1\\n\\x08moretags\\x12\\x1d.google.protobuf.FieldOptions\\x18\\xee\\xfb\\x03 \\x01(\\t:1\\n\\x08\\x63\\x61sttype\\x12\\x1d.google.protobuf.FieldOptions\\x18\\xef\\xfb\\x03 \\x01(\\t:0\\n\\x07\\x63\\x61stkey\\x12\\x1d.google.protobuf.FieldOptions\\x18\\xf0\\xfb\\x03 \\x01(\\t:2\\n\\tcastvalue\\x12\\x1d.google.protobuf.FieldOptions\\x18\\xf1\\xfb\\x03 \\x01(\\t:0\\n\\x07stdtime\\x12\\x1d.google.protobuf.FieldOptions\\x18\\xf2\\xfb\\x03 \\x01(\\x08:4\\n\\x0bstdduration\\x12\\x1d.google.protobuf.FieldOptions\\x18\\xf3\\xfb\\x03 \\x01(\\x08:3\\n\\nwktpointer\\x12\\x1d.google.protobuf.FieldOptions\\x18\\xf4\\xfb\\x03 \\x01(\\x08\\x42\\x45\\n\\x13\\x63om.google.protobufB\\nGoGoProtosZ\"github.com/gogo/protobuf/gogoproto'\n)\n\n_globals = globals()\n_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)\n_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, \"gogo_pb2\", _globals)\nif not _descriptor._USE_C_DESCRIPTORS:\n    _globals[\"DESCRIPTOR\"]._loaded_options = None\n    _globals[\n        \"DESCRIPTOR\"\n    ]._serialized_options = b'\\n\\023com.google.protobufB\\nGoGoProtosZ\"github.com/gogo/protobuf/gogoproto'\n# @@protoc_insertion_point(module_scope)\n"
  },
  {
    "path": "custom_components/mbapi2020/proto/protos_pb2.py",
    "content": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: protos.proto\n# Protobuf Python Version: 5.29.5\n\"\"\"Generated protocol buffer code.\"\"\"\n\nfrom google.protobuf import (\n    descriptor as _descriptor,\n    descriptor_pool as _descriptor_pool,\n    symbol_database as _symbol_database,\n)\nfrom google.protobuf.internal import builder as _builder\n\n# @@protoc_insertion_point(imports)\n\n_sym_db = _symbol_database.Default()\n\n\nDESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(\n    b'\\n\\x0cprotos.proto\\x12\\x05proto\"3\\n\\x10SubscribeRequest\\x12\\x0e\\n\\x06topics\\x18\\x01 \\x03(\\t\\x12\\x0f\\n\\x07replace\\x18\\x02 \\x01(\\x08\"\\xbe\\x01\\n\\x11SubscribeResponse\\x12\\x0f\\n\\x07success\\x18\\x01 \\x01(\\x08\\x12\\x34\\n\\x06\\x65rrors\\x18\\x02 \\x03(\\x0b\\x32$.proto.SubscribeResponse.ErrorsEntry\\x12\\x19\\n\\x11subscribed_topics\\x18\\x03 \\x03(\\t\\x1aG\\n\\x0b\\x45rrorsEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\t\\x12\\'\\n\\x05value\\x18\\x02 \\x01(\\x0b\\x32\\x18.proto.SubscriptionError:\\x02\\x38\\x01\"A\\n\\x12UnsubscribeRequest\\x12\\x0e\\n\\x06topics\\x18\\x01 \\x03(\\t\\x12\\x1b\\n\\x13\\x61nticipate_response\\x18\\x02 \\x01(\\x08\"\\xc4\\x01\\n\\x13UnsubscribeResponse\\x12\\x0f\\n\\x07success\\x18\\x01 \\x01(\\x08\\x12\\x36\\n\\x06\\x65rrors\\x18\\x02 \\x03(\\x0b\\x32&.proto.UnsubscribeResponse.ErrorsEntry\\x12\\x1b\\n\\x13unsubscribed_topics\\x18\\x03 \\x03(\\t\\x1aG\\n\\x0b\\x45rrorsEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\t\\x12\\'\\n\\x05value\\x18\\x02 \\x01(\\x0b\\x32\\x18.proto.SubscriptionError:\\x02\\x38\\x01\"P\\n\\x11SubscriptionError\\x12*\\n\\x04\\x63ode\\x18\\x01 \\x03(\\x0e\\x32\\x1c.proto.SubscriptionErrorType\\x12\\x0f\\n\\x07message\\x18\\x02 \\x03(\\t\"\\x81\\x02\\n\\x19SubscribeToAppTwinRequest\\x12\\x12\\n\\nsession_id\\x18\\x01 \\x01(\\t\\x12\\x0f\\n\\x07\\x63iam_id\\x18\\x02 \\x01(\\t\\x12\\x15\\n\\rdevice_locale\\x18\\x03 \\x01(\\t\\x12\\x0e\\n\\x06\\x61pp_id\\x18\\x04 \\x01(\\t\\x12\\x13\\n\\x0b\\x61pp_version\\x18\\x05 \\x01(\\t\\x12+\\n\\x07os_name\\x18\\x06 \\x01(\\x0e\\x32\\x1a.proto.OperatingSystemName\\x12\\x12\\n\\nos_version\\x18\\x07 \\x01(\\t\\x12\\x14\\n\\x0c\\x64\\x65vice_model\\x18\\x08 \\x01(\\t\\x12\\x17\\n\\x0fnetwork_carrier\\x18\\t \\x01(\\t\\x12\\x13\\n\\x0bsdk_version\\x18\\n \\x01(\\t\"B\\n\\x1bResubscribeToAppTwinRequest\\x12\\x12\\n\\nsession_id\\x18\\x01 \\x01(\\t\\x12\\x0f\\n\\x07\\x63iam_id\\x18\\x02 \\x01(\\t\"\\xcc\\x01\\n\\x1cResubscribeToAppTwinResponse\\x12\\x45\\n\\x06result\\x18\\x01 \\x01(\\x0e\\x32\\x35.proto.ResubscribeToAppTwinResponse.ResubscribeResult\"e\\n\\x11ResubscribeResult\\x12\\x11\\n\\rUNKNOWN_ERROR\\x10\\x00\\x12\\x0b\\n\\x07SUCCESS\\x10\\x01\\x12\\x15\\n\\x11INVALID_JWT_ERROR\\x10\\x02\\x12\\x19\\n\\x15TARGET_DOES_NOT_EXIST\\x10\\x03\"_\\n\\x1aSubscribeToAppTwinResponse\\x12\\x0f\\n\\x07success\\x18\\x01 \\x01(\\x08\\x12\\x30\\n\\nerror_code\\x18\\x02 \\x01(\\x0e\\x32\\x1c.proto.SubscriptionErrorType\"3\\n\\x1dUnsubscribeFromAppTwinRequest\\x12\\x12\\n\\nsession_id\\x18\\x01 \\x01(\\t\"\\xbd\\x01\\n\\x1eUnsubscribeFromAppTwinResponse\\x12\\x0f\\n\\x07success\\x18\\x01 \\x01(\\x08\\x12\\x41\\n\\x06\\x65rrors\\x18\\x02 \\x03(\\x0b\\x32\\x31.proto.UnsubscribeFromAppTwinResponse.ErrorsEntry\\x1aG\\n\\x0b\\x45rrorsEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\t\\x12\\'\\n\\x05value\\x18\\x02 \\x01(\\x0b\\x32\\x18.proto.SubscriptionError:\\x02\\x38\\x01\"\\x0b\\n\\tHeartbeat\" \\n\\x10\\x41ssignedVehicles\\x12\\x0c\\n\\x04vins\\x18\\x01 \\x03(\\t\"\\x1d\\n\\x1b\\x41\\x63knowledgeAssignedVehicles*5\\n\\x15SubscriptionErrorType\\x12\\x0b\\n\\x07UNKNOWN\\x10\\x00\\x12\\x0f\\n\\x0bINVALID_JWT\\x10\\x01*q\\n\\x13OperatingSystemName\\x12\\x1c\\n\\x18UNKNOWN_OPERATING_SYSTEM\\x10\\x00\\x12\\x07\\n\\x03IOS\\x10\\x01\\x12\\x0b\\n\\x07\\x41NDROID\\x10\\x02\\x12\\x0c\\n\\x08INT_TEST\\x10\\x03\\x12\\x0f\\n\\x0bMANUAL_TEST\\x10\\x04\\x12\\x07\\n\\x03WEB\\x10\\x05\\x42\\x1c\\n\\x1a\\x63om.daimler.mbcarkit.protob\\x06proto3'\n)\n\n_globals = globals()\n_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)\n_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, \"protos_pb2\", _globals)\nif not _descriptor._USE_C_DESCRIPTORS:\n    _globals[\"DESCRIPTOR\"]._loaded_options = None\n    _globals[\"DESCRIPTOR\"]._serialized_options = b\"\\n\\032com.daimler.mbcarkit.proto\"\n    _globals[\"_SUBSCRIBERESPONSE_ERRORSENTRY\"]._loaded_options = None\n    _globals[\"_SUBSCRIBERESPONSE_ERRORSENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_UNSUBSCRIBERESPONSE_ERRORSENTRY\"]._loaded_options = None\n    _globals[\"_UNSUBSCRIBERESPONSE_ERRORSENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_UNSUBSCRIBEFROMAPPTWINRESPONSE_ERRORSENTRY\"]._loaded_options = None\n    _globals[\"_UNSUBSCRIBEFROMAPPTWINRESPONSE_ERRORSENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_SUBSCRIPTIONERRORTYPE\"]._serialized_start = 1572\n    _globals[\"_SUBSCRIPTIONERRORTYPE\"]._serialized_end = 1625\n    _globals[\"_OPERATINGSYSTEMNAME\"]._serialized_start = 1627\n    _globals[\"_OPERATINGSYSTEMNAME\"]._serialized_end = 1740\n    _globals[\"_SUBSCRIBEREQUEST\"]._serialized_start = 23\n    _globals[\"_SUBSCRIBEREQUEST\"]._serialized_end = 74\n    _globals[\"_SUBSCRIBERESPONSE\"]._serialized_start = 77\n    _globals[\"_SUBSCRIBERESPONSE\"]._serialized_end = 267\n    _globals[\"_SUBSCRIBERESPONSE_ERRORSENTRY\"]._serialized_start = 196\n    _globals[\"_SUBSCRIBERESPONSE_ERRORSENTRY\"]._serialized_end = 267\n    _globals[\"_UNSUBSCRIBEREQUEST\"]._serialized_start = 269\n    _globals[\"_UNSUBSCRIBEREQUEST\"]._serialized_end = 334\n    _globals[\"_UNSUBSCRIBERESPONSE\"]._serialized_start = 337\n    _globals[\"_UNSUBSCRIBERESPONSE\"]._serialized_end = 533\n    _globals[\"_UNSUBSCRIBERESPONSE_ERRORSENTRY\"]._serialized_start = 196\n    _globals[\"_UNSUBSCRIBERESPONSE_ERRORSENTRY\"]._serialized_end = 267\n    _globals[\"_SUBSCRIPTIONERROR\"]._serialized_start = 535\n    _globals[\"_SUBSCRIPTIONERROR\"]._serialized_end = 615\n    _globals[\"_SUBSCRIBETOAPPTWINREQUEST\"]._serialized_start = 618\n    _globals[\"_SUBSCRIBETOAPPTWINREQUEST\"]._serialized_end = 875\n    _globals[\"_RESUBSCRIBETOAPPTWINREQUEST\"]._serialized_start = 877\n    _globals[\"_RESUBSCRIBETOAPPTWINREQUEST\"]._serialized_end = 943\n    _globals[\"_RESUBSCRIBETOAPPTWINRESPONSE\"]._serialized_start = 946\n    _globals[\"_RESUBSCRIBETOAPPTWINRESPONSE\"]._serialized_end = 1150\n    _globals[\"_RESUBSCRIBETOAPPTWINRESPONSE_RESUBSCRIBERESULT\"]._serialized_start = 1049\n    _globals[\"_RESUBSCRIBETOAPPTWINRESPONSE_RESUBSCRIBERESULT\"]._serialized_end = 1150\n    _globals[\"_SUBSCRIBETOAPPTWINRESPONSE\"]._serialized_start = 1152\n    _globals[\"_SUBSCRIBETOAPPTWINRESPONSE\"]._serialized_end = 1247\n    _globals[\"_UNSUBSCRIBEFROMAPPTWINREQUEST\"]._serialized_start = 1249\n    _globals[\"_UNSUBSCRIBEFROMAPPTWINREQUEST\"]._serialized_end = 1300\n    _globals[\"_UNSUBSCRIBEFROMAPPTWINRESPONSE\"]._serialized_start = 1303\n    _globals[\"_UNSUBSCRIBEFROMAPPTWINRESPONSE\"]._serialized_end = 1492\n    _globals[\"_UNSUBSCRIBEFROMAPPTWINRESPONSE_ERRORSENTRY\"]._serialized_start = 196\n    _globals[\"_UNSUBSCRIBEFROMAPPTWINRESPONSE_ERRORSENTRY\"]._serialized_end = 267\n    _globals[\"_HEARTBEAT\"]._serialized_start = 1494\n    _globals[\"_HEARTBEAT\"]._serialized_end = 1505\n    _globals[\"_ASSIGNEDVEHICLES\"]._serialized_start = 1507\n    _globals[\"_ASSIGNEDVEHICLES\"]._serialized_end = 1539\n    _globals[\"_ACKNOWLEDGEASSIGNEDVEHICLES\"]._serialized_start = 1541\n    _globals[\"_ACKNOWLEDGEASSIGNEDVEHICLES\"]._serialized_end = 1570\n# @@protoc_insertion_point(module_scope)\n"
  },
  {
    "path": "custom_components/mbapi2020/proto/service_activation_pb2.py",
    "content": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: service-activation.proto\n# Protobuf Python Version: 5.29.5\n\"\"\"Generated protocol buffer code.\"\"\"\n\nfrom google.protobuf import (\n    descriptor as _descriptor,\n    descriptor_pool as _descriptor_pool,\n    symbol_database as _symbol_database,\n)\nfrom google.protobuf.internal import builder as _builder\n\n# @@protoc_insertion_point(imports)\n\n_sym_db = _symbol_database.Default()\n\n\nDESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(\n    b'\\n\\x18service-activation.proto\\x12\\x05proto\"?\\n$AcknowledgeServiceStatusUpdatesByVIN\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\"9\\n\\x1e\\x41\\x63knowledgeServiceStatusUpdate\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\"\\xc0\\x01\\n\\x19ServiceStatusUpdatesByVIN\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\\x12>\\n\\x07updates\\x18\\x02 \\x03(\\x0b\\x32-.proto.ServiceStatusUpdatesByVIN.UpdatesEntry\\x1aJ\\n\\x0cUpdatesEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\t\\x12)\\n\\x05value\\x18\\x02 \\x01(\\x0b\\x32\\x1a.proto.ServiceStatusUpdate:\\x02\\x38\\x01\"\\x82\\x02\\n\\x13ServiceStatusUpdate\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\\x12\\x0f\\n\\x07\\x63iam_id\\x18\\x07 \\x01(\\t\\x12\\x0b\\n\\x03vin\\x18\\x05 \\x01(\\t\\x12\\x16\\n\\x0e\\x65mit_timestamp\\x18\\x02 \\x01(\\x03\\x12\\x1c\\n\\x14\\x65mit_timestamp_in_ms\\x18\\x08 \\x01(\\x03\\x12\\x38\\n\\x07updates\\x18\\x06 \\x03(\\x0b\\x32\\'.proto.ServiceStatusUpdate.UpdatesEntry\\x1a\\x44\\n\\x0cUpdatesEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\x05\\x12#\\n\\x05value\\x18\\x02 \\x01(\\x0e\\x32\\x14.proto.ServiceStatus:\\x02\\x38\\x01*\\xb3\\x01\\n\\rServiceStatus\\x12\\x1a\\n\\x16SERVICE_STATUS_UNKNOWN\\x10\\x00\\x12\\x19\\n\\x15SERVICE_STATUS_ACTIVE\\x10\\x01\\x12\\x1b\\n\\x17SERVICE_STATUS_INACTIVE\\x10\\x02\\x12%\\n!SERVICE_STATUS_ACTIVATION_PENDING\\x10\\x03\\x12\\'\\n#SERVICE_STATUS_DEACTIVATION_PENDING\\x10\\x04\\x42\\x1c\\n\\x1a\\x63om.daimler.mbcarkit.protob\\x06proto3'\n)\n\n_globals = globals()\n_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)\n_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, \"service_activation_pb2\", _globals)\nif not _descriptor._USE_C_DESCRIPTORS:\n    _globals[\"DESCRIPTOR\"]._loaded_options = None\n    _globals[\"DESCRIPTOR\"]._serialized_options = b\"\\n\\032com.daimler.mbcarkit.proto\"\n    _globals[\"_SERVICESTATUSUPDATESBYVIN_UPDATESENTRY\"]._loaded_options = None\n    _globals[\"_SERVICESTATUSUPDATESBYVIN_UPDATESENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_SERVICESTATUSUPDATE_UPDATESENTRY\"]._loaded_options = None\n    _globals[\"_SERVICESTATUSUPDATE_UPDATESENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_SERVICESTATUS\"]._serialized_start = 616\n    _globals[\"_SERVICESTATUS\"]._serialized_end = 795\n    _globals[\"_ACKNOWLEDGESERVICESTATUSUPDATESBYVIN\"]._serialized_start = 35\n    _globals[\"_ACKNOWLEDGESERVICESTATUSUPDATESBYVIN\"]._serialized_end = 98\n    _globals[\"_ACKNOWLEDGESERVICESTATUSUPDATE\"]._serialized_start = 100\n    _globals[\"_ACKNOWLEDGESERVICESTATUSUPDATE\"]._serialized_end = 157\n    _globals[\"_SERVICESTATUSUPDATESBYVIN\"]._serialized_start = 160\n    _globals[\"_SERVICESTATUSUPDATESBYVIN\"]._serialized_end = 352\n    _globals[\"_SERVICESTATUSUPDATESBYVIN_UPDATESENTRY\"]._serialized_start = 278\n    _globals[\"_SERVICESTATUSUPDATESBYVIN_UPDATESENTRY\"]._serialized_end = 352\n    _globals[\"_SERVICESTATUSUPDATE\"]._serialized_start = 355\n    _globals[\"_SERVICESTATUSUPDATE\"]._serialized_end = 613\n    _globals[\"_SERVICESTATUSUPDATE_UPDATESENTRY\"]._serialized_start = 545\n    _globals[\"_SERVICESTATUSUPDATE_UPDATESENTRY\"]._serialized_end = 613\n# @@protoc_insertion_point(module_scope)\n"
  },
  {
    "path": "custom_components/mbapi2020/proto/user_events_pb2.py",
    "content": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: user-events.proto\n# Protobuf Python Version: 5.29.5\n\"\"\"Generated protocol buffer code.\"\"\"\n\nfrom google.protobuf import (\n    descriptor as _descriptor,\n    descriptor_pool as _descriptor_pool,\n    symbol_database as _symbol_database,\n)\nfrom google.protobuf.internal import builder as _builder\n\n# @@protoc_insertion_point(imports)\n\n_sym_db = _symbol_database.Default()\n\n\nDESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(\n    b'\\n\\x11user-events.proto\\x12\\x05proto\"4\\n\\x19\\x41\\x63knowledgeUserDataUpdate\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\"\\xbc\\x01\\n\\x0eUserDataUpdate\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\\x12\\x0f\\n\\x07\\x63iam_id\\x18\\x02 \\x01(\\t\\x12\\x16\\n\\x0e\\x65mit_timestamp\\x18\\x03 \\x01(\\x03\\x12\\x1c\\n\\x14\\x65mit_timestamp_in_ms\\x18\\x08 \\x01(\\x03\\x12$\\n\\x08old_data\\x18\\x06 \\x01(\\x0b\\x32\\x12.proto.CPDUserData\\x12$\\n\\x08new_data\\x18\\x07 \\x01(\\x0b\\x32\\x12.proto.CPDUserData\"B\\n\\'AcknowledgeUserVehicleAuthChangedUpdate\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\"N\\n3AcknowledgeAbilityToGetVehicleMasterDataFromRestAPI\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\"~\\n\\x1cUserVehicleAuthChangedUpdate\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\\x12\\x0f\\n\\x07\\x63iam_id\\x18\\x02 \\x01(\\t\\x12\\x16\\n\\x0e\\x65mit_timestamp\\x18\\x03 \\x01(\\x03\\x12\\x1c\\n\\x14\\x65mit_timestamp_in_ms\\x18\\x08 \\x01(\\x03\"\\x9e\\x04\\n\\x0b\\x43PDUserData\\x12\\x0f\\n\\x07\\x63iam_id\\x18\\x01 \\x01(\\t\\x12\\x0f\\n\\x07user_id\\x18\\x02 \\x01(\\t\\x12\\x12\\n\\nfirst_name\\x18\\x03 \\x01(\\t\\x12\\x12\\n\\nlast_name1\\x18\\x04 \\x01(\\t\\x12\\x12\\n\\nlast_name2\\x18\\x05 \\x01(\\t\\x12\\r\\n\\x05title\\x18\\x06 \\x01(\\t\\x12\\x13\\n\\x0bname_prefix\\x18\\x07 \\x01(\\t\\x12\\x16\\n\\x0emiddle_initial\\x18\\x08 \\x01(\\t\\x12\\x17\\n\\x0fsalutation_code\\x18\\t \\x01(\\t\\x12\\r\\n\\x05\\x65mail\\x18\\n \\x01(\\t\\x12\\x16\\n\\x0elandline_phone\\x18\\x0b \\x01(\\t\\x12\\x1b\\n\\x13mobile_phone_number\\x18\\x0c \\x01(\\t\\x12\\x12\\n\\ncreated_at\\x18\\r \\x01(\\t\\x12\\x12\\n\\ncreated_by\\x18\\x0e \\x01(\\t\\x12\\x12\\n\\nupdated_at\\x18\\x0f \\x01(\\t\\x12\\x10\\n\\x08\\x62irthday\\x18\\x1c \\x01(\\t\\x12\\x1f\\n\\x17preferred_language_code\\x18\\x1d \\x01(\\t\\x12\\x1c\\n\\x14\\x61\\x63\\x63ount_country_code\\x18\\x1e \\x01(\\t\\x12\\r\\n\\x05uc_id\\x18\\x1f \\x01(\\t\\x12\\x0b\\n\\x03vip\\x18  \\x01(\\x08\\x12&\\n\\x07\\x61\\x64\\x64ress\\x18! \\x01(\\x0b\\x32\\x15.proto.CPDUserAddress\\x12G\\n\\x18\\x63ommunication_preference\\x18\" \\x01(\\x0b\\x32%.proto.CPDUserCommunicationPreference\"\\xb3\\x02\\n\\x0e\\x43PDUserAddress\\x12\\x14\\n\\x0c\\x63ountry_code\\x18\\x01 \\x01(\\t\\x12\\r\\n\\x05state\\x18\\x02 \\x01(\\t\\x12\\x10\\n\\x08province\\x18\\x03 \\x01(\\t\\x12\\x0e\\n\\x06street\\x18\\x04 \\x01(\\t\\x12\\x10\\n\\x08house_no\\x18\\x05 \\x01(\\t\\x12\\x10\\n\\x08zip_code\\x18\\x06 \\x01(\\t\\x12\\x0c\\n\\x04\\x63ity\\x18\\x07 \\x01(\\t\\x12\\x13\\n\\x0bstreet_type\\x18\\x08 \\x01(\\t\\x12\\x12\\n\\nhouse_name\\x18\\t \\x01(\\t\\x12\\x10\\n\\x08\\x66loor_no\\x18\\n \\x01(\\t\\x12\\x0f\\n\\x07\\x64oor_no\\x18\\x0b \\x01(\\t\\x12\\x15\\n\\raddress_line1\\x18\\x0c \\x01(\\t\\x12\\x15\\n\\raddress_line2\\x18\\r \\x01(\\t\\x12\\x15\\n\\raddress_line3\\x18\\x0e \\x01(\\t\\x12\\x17\\n\\x0fpost_office_box\\x18\\x0f \\x01(\\t\"\\x8f\\x01\\n\\x1e\\x43PDUserCommunicationPreference\\x12\\x1a\\n\\x12\\x63ontacted_by_phone\\x18\\x01 \\x01(\\x08\\x12\\x1b\\n\\x13\\x63ontacted_by_letter\\x18\\x02 \\x01(\\x08\\x12\\x1a\\n\\x12\\x63ontacted_by_email\\x18\\x03 \\x01(\\x08\\x12\\x18\\n\\x10\\x63ontacted_by_sms\\x18\\x04 \\x01(\\x08\"7\\n\\x1c\\x41\\x63knowledgeUserPictureUpdate\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\"\\xba\\x01\\n\\x11UserPictureUpdate\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\\x12\\x0f\\n\\x07\\x63iam_id\\x18\\x05 \\x01(\\t\\x12\\x16\\n\\x0e\\x65mit_timestamp\\x18\\x02 \\x01(\\x03\\x12\\x1c\\n\\x14\\x65mit_timestamp_in_ms\\x18\\x06 \\x01(\\x03\\x12\"\\n\\x1a\\x65venthub_receive_timestamp\\x18\\x03 \\x01(\\x03\\x12!\\n\\x19\\x61pptwin_receive_timestamp\\x18\\x04 \\x01(\\x03\"3\\n\\x18\\x41\\x63knowledgeUserPINUpdate\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\"\\xb6\\x01\\n\\rUserPINUpdate\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\\x12\\x0f\\n\\x07\\x63iam_id\\x18\\x05 \\x01(\\t\\x12\\x16\\n\\x0e\\x65mit_timestamp\\x18\\x02 \\x01(\\x03\\x12\\x1c\\n\\x14\\x65mit_timestamp_in_ms\\x18\\x06 \\x01(\\x03\\x12\"\\n\\x1a\\x65venthub_receive_timestamp\\x18\\x03 \\x01(\\x03\\x12!\\n\\x19\\x61pptwin_receive_timestamp\\x18\\x04 \\x01(\\x03\"#\\n\\x14UpdateUserJWTRequest\\x12\\x0b\\n\\x03jwt\\x18\\x01 \\x01(\\t\"!\\n\\x1f\\x41\\x63knowledgeUpdateUserJWTRequestB\\x1c\\n\\x1a\\x63om.daimler.mbcarkit.protob\\x06proto3'\n)\n\n_globals = globals()\n_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)\n_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, \"user_events_pb2\", _globals)\nif not _descriptor._USE_C_DESCRIPTORS:\n    _globals[\"DESCRIPTOR\"]._loaded_options = None\n    _globals[\"DESCRIPTOR\"]._serialized_options = b\"\\n\\032com.daimler.mbcarkit.proto\"\n    _globals[\"_ACKNOWLEDGEUSERDATAUPDATE\"]._serialized_start = 28\n    _globals[\"_ACKNOWLEDGEUSERDATAUPDATE\"]._serialized_end = 80\n    _globals[\"_USERDATAUPDATE\"]._serialized_start = 83\n    _globals[\"_USERDATAUPDATE\"]._serialized_end = 271\n    _globals[\"_ACKNOWLEDGEUSERVEHICLEAUTHCHANGEDUPDATE\"]._serialized_start = 273\n    _globals[\"_ACKNOWLEDGEUSERVEHICLEAUTHCHANGEDUPDATE\"]._serialized_end = 339\n    _globals[\"_ACKNOWLEDGEABILITYTOGETVEHICLEMASTERDATAFROMRESTAPI\"]._serialized_start = 341\n    _globals[\"_ACKNOWLEDGEABILITYTOGETVEHICLEMASTERDATAFROMRESTAPI\"]._serialized_end = 419\n    _globals[\"_USERVEHICLEAUTHCHANGEDUPDATE\"]._serialized_start = 421\n    _globals[\"_USERVEHICLEAUTHCHANGEDUPDATE\"]._serialized_end = 547\n    _globals[\"_CPDUSERDATA\"]._serialized_start = 550\n    _globals[\"_CPDUSERDATA\"]._serialized_end = 1092\n    _globals[\"_CPDUSERADDRESS\"]._serialized_start = 1095\n    _globals[\"_CPDUSERADDRESS\"]._serialized_end = 1402\n    _globals[\"_CPDUSERCOMMUNICATIONPREFERENCE\"]._serialized_start = 1405\n    _globals[\"_CPDUSERCOMMUNICATIONPREFERENCE\"]._serialized_end = 1548\n    _globals[\"_ACKNOWLEDGEUSERPICTUREUPDATE\"]._serialized_start = 1550\n    _globals[\"_ACKNOWLEDGEUSERPICTUREUPDATE\"]._serialized_end = 1605\n    _globals[\"_USERPICTUREUPDATE\"]._serialized_start = 1608\n    _globals[\"_USERPICTUREUPDATE\"]._serialized_end = 1794\n    _globals[\"_ACKNOWLEDGEUSERPINUPDATE\"]._serialized_start = 1796\n    _globals[\"_ACKNOWLEDGEUSERPINUPDATE\"]._serialized_end = 1847\n    _globals[\"_USERPINUPDATE\"]._serialized_start = 1850\n    _globals[\"_USERPINUPDATE\"]._serialized_end = 2032\n    _globals[\"_UPDATEUSERJWTREQUEST\"]._serialized_start = 2034\n    _globals[\"_UPDATEUSERJWTREQUEST\"]._serialized_end = 2069\n    _globals[\"_ACKNOWLEDGEUPDATEUSERJWTREQUEST\"]._serialized_start = 2071\n    _globals[\"_ACKNOWLEDGEUPDATEUSERJWTREQUEST\"]._serialized_end = 2104\n# @@protoc_insertion_point(module_scope)\n"
  },
  {
    "path": "custom_components/mbapi2020/proto/vehicle_commands_pb2.py",
    "content": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: vehicle-commands.proto\n# Protobuf Python Version: 5.29.5\n\"\"\"Generated protocol buffer code.\"\"\"\n\nfrom google.protobuf import (\n    descriptor as _descriptor,\n    descriptor_pool as _descriptor_pool,\n    symbol_database as _symbol_database,\n)\nfrom google.protobuf.internal import builder as _builder\n\n# @@protoc_insertion_point(imports)\n\n_sym_db = _symbol_database.Default()\n\n\nfrom google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2\n\nimport custom_components.mbapi2020.proto.gogo_pb2 as gogo__pb2\n\nDESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(\n    b'\\n\\x16vehicle-commands.proto\\x12\\x05proto\\x1a\\ngogo.proto\\x1a\\x1egoogle/protobuf/wrappers.proto\"/\\n\\x19\\x41\\x63knowledgeCommandRequest\\x12\\x12\\n\\nrequest_id\\x18\\x01 \\x01(\\t\"\\xca\\x1f\\n\\x0e\\x43ommandRequest\\x12\\x0b\\n\\x03vin\\x18\\x01 \\x01(\\t\\x12\\x12\\n\\nrequest_id\\x18\\x07 \\x01(\\t\\x12.\\n\\x07\\x62\\x61\\x63kend\\x18$ \\x01(\\x0e\\x32\\x1d.proto.CommandRequest.Backend\\x12,\\n\\rauxheat_start\\x18\\x02 \\x01(\\x0b\\x32\\x13.proto.AuxheatStartH\\x00\\x12*\\n\\x0c\\x61uxheat_stop\\x18\\x03 \\x01(\\x0b\\x32\\x12.proto.AuxheatStopH\\x00\\x12\\x34\\n\\x11\\x61uxheat_configure\\x18\\x04 \\x01(\\x0b\\x32\\x17.proto.AuxheatConfigureH\\x00\\x12&\\n\\ndoors_lock\\x18\\x05 \\x01(\\x0b\\x32\\x10.proto.DoorsLockH\\x00\\x12*\\n\\x0c\\x64oors_unlock\\x18\\x06 \\x01(\\x0b\\x32\\x12.proto.DoorsUnlockH\\x00\\x12*\\n\\x0csunroof_open\\x18\\t \\x01(\\x0b\\x32\\x12.proto.SunroofOpenH\\x00\\x12,\\n\\rsunroof_close\\x18\\n \\x01(\\x0b\\x32\\x13.proto.SunroofCloseH\\x00\\x12*\\n\\x0csunroof_lift\\x18\\x0b \\x01(\\x0b\\x32\\x12.proto.SunroofLiftH\\x00\\x12*\\n\\x0csunroof_move\\x18/ \\x01(\\x0b\\x32\\x12.proto.SunroofMoveH\\x00\\x12*\\n\\x0cwindows_open\\x18\\x0c \\x01(\\x0b\\x32\\x12.proto.WindowsOpenH\\x00\\x12,\\n\\rwindows_close\\x18\\r \\x01(\\x0b\\x32\\x13.proto.WindowsCloseH\\x00\\x12\\x34\\n\\x11windows_ventilate\\x18+ \\x01(\\x0b\\x32\\x17.proto.WindowsVentilateH\\x00\\x12*\\n\\x0cwindows_move\\x18, \\x01(\\x0b\\x32\\x12.proto.WindowsMoveH\\x00\\x12*\\n\\x0c\\x65ngine_start\\x18\\x13 \\x01(\\x0b\\x32\\x12.proto.EngineStartH\\x00\\x12(\\n\\x0b\\x65ngine_stop\\x18\\x14 \\x01(\\x0b\\x32\\x11.proto.EngineStopH\\x00\\x12\\x43\\n\\x19zev_preconditioning_start\\x18\\x15 \\x01(\\x0b\\x32\\x1e.proto.ZEVPreconditioningStartH\\x00\\x12\\x41\\n\\x18zev_preconditioning_stop\\x18\\x16 \\x01(\\x0b\\x32\\x1d.proto.ZEVPreconditioningStopH\\x00\\x12H\\n\\x1azev_precondition_configure\\x18\\x19 \\x01(\\x0b\\x32\".proto.ZEVPreconditioningConfigureH\\x00\\x12S\\n zev_precondition_configure_seats\\x18\\x1a \\x01(\\x0b\\x32\\'.proto.ZEVPreconditioningConfigureSeatsH\\x00\\x12\\x32\\n\\x10speedalert_start\\x18\\x17 \\x01(\\x0b\\x32\\x16.proto.SpeedalertStartH\\x00\\x12\\x30\\n\\x0fspeedalert_stop\\x18\\x18 \\x01(\\x0b\\x32\\x15.proto.SpeedalertStopH\\x00\\x12\\x46\\n\\x16\\x62\\x61ttery_charge_program\\x18\\x1b \\x01(\\x0b\\x32$.proto.BatteryChargeProgramConfigureH\\x00\\x12\\x38\\n\\x0f\\x62\\x61ttery_max_soc\\x18\\x1c \\x01(\\x0b\\x32\\x1d.proto.BatteryMaxSocConfigureH\\x00\\x12\\x41\\n\\x18\\x63harge_program_configure\\x18\" \\x01(\\x0b\\x32\\x1d.proto.ChargeProgramConfigureH\\x00\\x12\\x41\\n\\x18\\x63harge_control_configure\\x18( \\x01(\\x0b\\x32\\x1d.proto.ChargeControlConfigureH\\x00\\x12\\x39\\n\\x14\\x63harge_opt_configure\\x18\\x1d \\x01(\\x0b\\x32\\x19.proto.ChargeOptConfigureH\\x00\\x12\\x31\\n\\x10\\x63harge_opt_start\\x18\\x1e \\x01(\\x0b\\x32\\x15.proto.ChargeOptStartH\\x00\\x12/\\n\\x0f\\x63harge_opt_stop\\x18\\x1f \\x01(\\x0b\\x32\\x14.proto.ChargeOptStopH\\x00\\x12<\\n\\x15temperature_configure\\x18  \\x01(\\x0b\\x32\\x1b.proto.TemperatureConfigureH\\x00\\x12=\\n\\x16week_profile_configure\\x18! \\x01(\\x0b\\x32\\x1b.proto.WeekProfileConfigureH\\x00\\x12\\x42\\n\\x19week_profile_configure_v2\\x18) \\x01(\\x0b\\x32\\x1d.proto.WeekProfileConfigureV2H\\x00\\x12*\\n\\x0csigpos_start\\x18# \\x01(\\x0b\\x32\\x12.proto.SigPosStartH\\x00\\x12W\\n#theftalarm_deselect_damagedetection\\x18\\x0e \\x01(\\x0b\\x32(.proto.TheftalarmDeselectDamagedetectionH\\x00\\x12I\\n\\x1ctheftalarm_deselect_interior\\x18\\x0f \\x01(\\x0b\\x32!.proto.TheftalarmDeselectInteriorH\\x00\\x12?\\n\\x17theftalarm_deselect_tow\\x18\\x10 \\x01(\\x0b\\x32\\x1c.proto.TheftalarmDeselectTowH\\x00\\x12S\\n!theftalarm_select_damagedetection\\x18\\x11 \\x01(\\x0b\\x32&.proto.TheftalarmSelectDamagedetectionH\\x00\\x12\\x45\\n\\x1atheftalarm_select_interior\\x18\\x12 \\x01(\\x0b\\x32\\x1f.proto.TheftalarmSelectInteriorH\\x00\\x12;\\n\\x15theftalarm_select_tow\\x18% \\x01(\\x0b\\x32\\x1a.proto.TheftalarmSelectTowH\\x00\\x12\\x32\\n\\x10theftalarm_start\\x18& \\x01(\\x0b\\x32\\x16.proto.TheftalarmStartH\\x00\\x12\\x30\\n\\x0ftheftalarm_stop\\x18\\' \\x01(\\x0b\\x32\\x15.proto.TheftalarmStopH\\x00\\x12P\\n automatic_valet_parking_activate\\x18* \\x01(\\x0b\\x32$.proto.AutomaticValetParkingActivateH\\x00\\x12\\x35\\n\\x12\\x63harge_flap_unlock\\x18- \\x01(\\x0b\\x32\\x17.proto.ChargeFlapUnlockH\\x00\\x12;\\n\\x15\\x63harge_coupler_unlock\\x18. \\x01(\\x0b\\x32\\x1a.proto.ChargeCouplerUnlockH\\x00\\x12?\\n\\x17\\x64\\x65\\x61\\x63tivate_vehicle_keys\\x18\\x30 \\x01(\\x0b\\x32\\x1c.proto.DeactivateVehicleKeysH\\x00\\x12;\\n\\x15\\x61\\x63tivate_vehicle_keys\\x18\\x31 \\x01(\\x0b\\x32\\x1a.proto.ActivateVehicleKeysH\\x00\\x12U\\n\"chargingbreak_clocktimer_configure\\x18\\x32 \\x01(\\x0b\\x32\\'.proto.ChargingBreakClocktimerConfigureH\\x00\\x12\\x45\\n\\x1aselective_key_deactivation\\x18= \\x01(\\x0b\\x32\\x1f.proto.SelectiveKeyDeactivationH\\x00\\x12\\x37\\n\\x13sunroof_blinds_move\\x18> \\x01(\\x0b\\x32\\x18.proto.SunroofBlindsMoveH\\x00\\x12\\x35\\n\\x12window_blinds_move\\x18? \\x01(\\x0b\\x32\\x17.proto.WindowBlindsMoveH\\x00\\x12\\x61\\n)child_presence_detection_deactivate_alarm\\x18\\x41 \\x01(\\x0b\\x32,.proto.ChildPresenceDetectionDeactivateAlarmH\\x00\\x12P\\n interior_monitoring_take_picture\\x18\\x42 \\x01(\\x0b\\x32$.proto.InteriorMonitoringTakePictureH\\x00\\x12P\\n exterior_monitoring_take_picture\\x18\\x43 \\x01(\\x0b\\x32$.proto.ExteriorMonitoringTakePictureH\\x00\\x12\\x37\\n\\x13remote_update_start\\x18\\x44 \\x01(\\x0b\\x32\\x18.proto.RemoteUpdateStartH\\x00\\x12P\\n theftalarm_select_picture_taking\\x18\\x45 \\x01(\\x0b\\x32$.proto.TheftAlarmSelectPictureTakingH\\x00\\x12T\\n\"theftalarm_deselect_picture_taking\\x18\\x46 \\x01(\\x0b\\x32&.proto.TheftAlarmDeselectPictureTakingH\\x00\\x12;\\n\\x15\\x63lock_timer_configure\\x18G \\x01(\\x0b\\x32\\x1a.proto.ClockTimerConfigureH\\x00\\x12\\x36\\n\\x12\\x63harging_configure\\x18H \\x01(\\x0b\\x32\\x18.proto.ChargingConfigureH\\x00\\x12Y\\n%child_presence_detection_take_picture\\x18I \\x01(\\x0b\\x32(.proto.ChildPresenceDetectionTakePictureH\\x00\\x12\\x30\\n\\x0fstagemode_start\\x18J \\x01(\\x0b\\x32\\x15.proto.StagemodeStartH\\x00\\x12.\\n\\x0estagemode_stop\\x18K \\x01(\\x0b\\x32\\x14.proto.StagemodeStopH\\x00\\x12J\\n\\x1dhv_battery_start_conditioning\\x18L \\x01(\\x0b\\x32!.proto.HvBatteryStartConditioningH\\x00\\x12H\\n\\x1chv_battery_stop_conditioning\\x18M \\x01(\\x0b\\x32 .proto.HvBatteryStopConditioningH\\x00\\x12I\\n\\x1cremote_seat_ballet_configure\\x18N \\x01(\\x0b\\x32!.proto.RemoteSeatBallettConfigureH\\x00\"\"\\n\\x07\\x42\\x61\\x63kend\\x12\\x07\\n\\x03VVA\\x10\\x00\\x12\\x0e\\n\\nVehicleAPI\\x10\\x01\\x42\\t\\n\\x07\\x63ommand\"\\xbc\\x07\\n\\x11\\x43hargingConfigure\\x12/\\n\\x06\\x61\\x63tion\\x18\\x01 \\x01(\\x0e\\x32\\x1f.proto.ChargingConfigure.Action\\x12G\\n\\x13\\x64\\x63_charging_profile\\x18\\x02 \\x01(\\x0e\\x32*.proto.ChargingConfigure.DcChargingProfile\\x12M\\n\\x0e\\x63harge_program\\x18\\x03 \\x01(\\x0e\\x32&.proto.ChargingConfigure.ChargeProgramR\\rchargeprogram\\x12-\\n\\x08inlet_id\\x18\\x04 \\x03(\\x0b\\x32\\x1b.google.protobuf.Int32Value\\x12,\\n\\x07max_soc\\x18\\x05 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32Value\\x12,\\n\\x07min_soc\\x18\\x06 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32Value\\x12/\\n\\ntarget_soc\\x18\\t \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32Value\\x12\\x30\\n\\x0btarget_time\\x18\\n \\x01(\\x0b\\x32\\x1b.google.protobuf.Int64Value\\x12U\\n\\x1asoh_calibration_activation\\x18\\x0b \\x01(\\x0e\\x32\\x31.proto.ChargingConfigure.SohCalibrationActivation\"L\\n\\x06\\x41\\x63tion\\x12\\x16\\n\\x12NO_ACTION_SELECTED\\x10\\x00\\x12\\t\\n\\x05START\\x10\\x01\\x12\\t\\n\\x05PAUSE\\x10\\x02\\x12\\n\\n\\x06RESUME\\x10\\x03\\x12\\x08\\n\\x04STOP\\x10\\x04\"\\x92\\x01\\n\\x11\\x44\\x63\\x43hargingProfile\\x12#\\n\\x1fNO_DC_CHARGING_PROFILE_SELECTED\\x10\\x00\\x12\\x0c\\n\\x08STANDARD\\x10\\x01\\x12\\x0e\\n\\nSILENT_ECO\\x10\\x02\\x12\\r\\n\\tULTRAFAST\\x10\\x03\\x12\\x0b\\n\\x07PITSTOP\\x10\\x04\\x12\\x0e\\n\\nFAST_ECO_1\\x10\\x05\\x12\\x0e\\n\\nFAST_ECO_2\\x10\\x06\"]\\n\\rChargeProgram\\x12\\x1a\\n\\x16\\x44\\x45\\x46\\x41ULT_CHARGE_PROGRAM\\x10\\x00\\x12\\x17\\n\\x13HOME_CHARGE_PROGRAM\\x10\\x02\\x12\\x17\\n\\x13WORK_CHARGE_PROGRAM\\x10\\x03\"W\\n\\x18SohCalibrationActivation\\x12*\\n&NO_SOH_CALIBRATION_ACTIVATION_SELECTED\\x10\\x00\\x12\\x06\\n\\x02ON\\x10\\x01\\x12\\x07\\n\\x03OFF\\x10\\x02\"\\x1c\\n\\x1aHvBatteryStartConditioning\"\\x1b\\n\\x19HvBatteryStopConditioning\"\\x1c\\n\\x1aRemoteSeatBallettConfigure\"\\xa5\\x01\\n\\x15\\x44\\x65\\x61\\x63tivateVehicleKeys\\x12\\x0b\\n\\x03pin\\x18\\x01 \\x01(\\t\\x12\\x17\\n\\x0f\\x65xpiration_unix\\x18\\x02 \\x01(\\x03\\x12-\\n\\x12\\x65xpiration_seconds\\x18\\x03 \\x01(\\tR\\x11\\x65xpirationSeconds\\x12\\x37\\n\\x17\\x65xpiration_milliseconds\\x18\\x04 \\x01(\\tR\\x16\\x65xpirationMilliseconds\"\\xa3\\x01\\n\\x13\\x41\\x63tivateVehicleKeys\\x12\\x0b\\n\\x03pin\\x18\\x01 \\x01(\\t\\x12\\x17\\n\\x0f\\x65xpiration_unix\\x18\\x02 \\x01(\\x03\\x12-\\n\\x12\\x65xpiration_seconds\\x18\\x03 \\x01(\\tR\\x11\\x65xpirationSeconds\\x12\\x37\\n\\x17\\x65xpiration_milliseconds\\x18\\x04 \\x01(\\tR\\x16\\x65xpirationMilliseconds\"\\x0e\\n\\x0c\\x41uxheatStart\"\\r\\n\\x0b\\x41uxheatStop\"\\x80\\x02\\n\\x10\\x41uxheatConfigure\\x12O\\n\\x0etime_selection\\x18\\x01 \\x01(\\x0e\\x32!.proto.AuxheatConfigure.SelectionR\\x14\\x61uxheattimeselection\\x12\\x1c\\n\\x06time_1\\x18\\x02 \\x01(\\x05R\\x0c\\x61uxheattime1\\x12\\x1c\\n\\x06time_2\\x18\\x03 \\x01(\\x05R\\x0c\\x61uxheattime2\\x12\\x1c\\n\\x06time_3\\x18\\x04 \\x01(\\x05R\\x0c\\x61uxheattime3\"A\\n\\tSelection\\x12\\x10\\n\\x0cNO_SELECTION\\x10\\x00\\x12\\n\\n\\x06TIME_1\\x10\\x01\\x12\\n\\n\\x06TIME_2\\x10\\x02\\x12\\n\\n\\x06TIME_3\\x10\\x03\"\\'\\n\\tDoorsLock\\x12\\x1a\\n\\x05\\x64oors\\x18\\x01 \\x03(\\x0e\\x32\\x0b.proto.Door\"6\\n\\x0b\\x44oorsUnlock\\x12\\x0b\\n\\x03pin\\x18\\x01 \\x01(\\t\\x12\\x1a\\n\\x05\\x64oors\\x18\\x02 \\x03(\\x0e\\x32\\x0b.proto.Door\"\\x1a\\n\\x0b\\x45ngineStart\\x12\\x0b\\n\\x03pin\\x18\\x01 \\x01(\\t\"\\x0c\\n\\nEngineStop\"\\x1a\\n\\x0bSunroofOpen\\x12\\x0b\\n\\x03pin\\x18\\x01 \\x01(\\t\"\\x0e\\n\\x0cSunroofClose\"\\x1a\\n\\x0bSunroofLift\\x12\\x0b\\n\\x03pin\\x18\\x01 \\x01(\\t\"\\xe9\\x01\\n\\x0bSunroofMove\\x12\\x0b\\n\\x03pin\\x18\\x01 \\x01(\\t\\x12\\x35\\n\\x07sunroof\\x18\\x02 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x07sunroof\\x12K\\n\\x13sunroof_blind_front\\x18\\x03 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x11sunroofblindfront\\x12I\\n\\x12sunroof_blind_rear\\x18\\x04 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x10sunroofblindrear\"\\x1a\\n\\x0bWindowsOpen\\x12\\x0b\\n\\x03pin\\x18\\x01 \\x01(\\t\"\\x0e\\n\\x0cWindowsClose\"\\x1f\\n\\x10WindowsVentilate\\x12\\x0b\\n\\x03pin\\x18\\x01 \\x01(\\t\"\\xfc\\x03\\n\\x0bWindowsMove\\x12\\x0b\\n\\x03pin\\x18\\x01 \\x01(\\t\\x12@\\n\\nfront_left\\x18\\x02 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x0fwindowfrontleft\\x12\\x42\\n\\x0b\\x66ront_right\\x18\\x03 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x10windowfrontright\\x12@\\n\\nrear_blind\\x18\\x04 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x0fwindowrearblind\\x12>\\n\\trear_left\\x18\\x05 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x0ewindowrearleft\\x12I\\n\\x0frear_left_blind\\x18\\x06 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x13windowrearleftblind\\x12@\\n\\nrear_right\\x18\\x07 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x0fwindowrearright\\x12K\\n\\x10rear_right_blind\\x18\\x08 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x14windowrearrightblind\"d\\n\\x0fSpeedalertStart\\x12&\\n\\tthreshold\\x18\\x01 \\x01(\\x05R\\x13speedAlertThreshold\\x12)\\n\\x0e\\x61lert_end_time\\x18\\x02 \\x01(\\x03R\\x11speedAlertEndTime\"\\x10\\n\\x0eSpeedalertStop\"s\\n\\x17ZEVPreconditioningStart\\x12%\\n\\x0e\\x64\\x65parture_time\\x18\\x01 \\x01(\\x05R\\rdeparturetime\\x12\\x31\\n\\x04type\\x18\\x02 \\x01(\\x0e\\x32\\x1d.proto.ZEVPreconditioningTypeR\\x04type\"K\\n\\x16ZEVPreconditioningStop\\x12\\x31\\n\\x04type\\x18\\x02 \\x01(\\x0e\\x32\\x1d.proto.ZEVPreconditioningTypeR\\x04type\"\\xf9\\x01\\n\\x1bZEVPreconditioningConfigure\\x12\\x64\\n\\x13\\x64\\x65parture_time_mode\\x18\\x01 \\x01(\\x0e\\x32\\x34.proto.ZEVPreconditioningConfigure.DepartureTimeModeR\\x11\\x64\\x65partureTimeMode\\x12%\\n\\x0e\\x64\\x65parture_time\\x18\\x03 \\x01(\\x05R\\rdeparturetime\"M\\n\\x11\\x44\\x65partureTimeMode\\x12\\x0c\\n\\x08\\x44ISABLED\\x10\\x00\\x12\\x14\\n\\x10SINGLE_DEPARTURE\\x10\\x01\\x12\\x14\\n\\x10WEEKLY_DEPARTURE\\x10\\x02\"\\xca\\x01\\n ZEVPreconditioningConfigureSeats\\x12(\\n\\nfront_left\\x18\\x01 \\x01(\\x08R\\x14precondSeatFrontLeft\\x12*\\n\\x0b\\x66ront_right\\x18\\x02 \\x01(\\x08R\\x15precondSeatFrontRight\\x12&\\n\\trear_left\\x18\\x03 \\x01(\\x08R\\x13precondSeatRearLeft\\x12(\\n\\nrear_right\\x18\\x04 \\x01(\\x08R\\x14precondSeatRearRight\"\\xa5\\x01\\n\\x1d\\x42\\x61tteryChargeProgramConfigure\\x12Y\\n\\x0e\\x63harge_program\\x18\\x01 \\x01(\\x0e\\x32\\x32.proto.BatteryChargeProgramConfigure.ChargeProgramR\\rchargeprogram\")\\n\\rChargeProgram\\x12\\x0b\\n\\x07\\x44\\x45\\x46\\x41ULT\\x10\\x00\\x12\\x0b\\n\\x07INSTANT\\x10\\x01\"1\\n\\x16\\x42\\x61tteryMaxSocConfigure\\x12\\x17\\n\\x07max_soc\\x18\\x01 \\x01(\\x05R\\x06maxsoc\"\\x8e\\x04\\n\\x16\\x43hargeProgramConfigure\\x12R\\n\\x0e\\x63harge_program\\x18\\x01 \\x01(\\x0e\\x32+.proto.ChargeProgramConfigure.ChargeProgramR\\rchargeprogram\\x12\\x34\\n\\x07max_soc\\x18\\x02 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x06maxsoc\\x12;\\n\\x0b\\x61uto_unlock\\x18\\x03 \\x01(\\x0b\\x32\\x1a.google.protobuf.BoolValueR\\nautounlock\\x12R\\n\\x17location_based_charging\\x18\\x04 \\x01(\\x0b\\x32\\x1a.google.protobuf.BoolValueR\\x15locationbasedcharging\\x12;\\n\\x0b\\x63lock_timer\\x18\\x06 \\x01(\\x0b\\x32\\x1a.google.protobuf.BoolValueR\\nclocktimer\\x12=\\n\\x0c\\x65\\x63o_charging\\x18\\x07 \\x01(\\x0b\\x32\\x1a.google.protobuf.BoolValueR\\x0b\\x65\\x63ocharging\"]\\n\\rChargeProgram\\x12\\x1a\\n\\x16\\x44\\x45\\x46\\x41ULT_CHARGE_PROGRAM\\x10\\x00\\x12\\x17\\n\\x13HOME_CHARGE_PROGRAM\\x10\\x02\\x12\\x17\\n\\x13WORK_CHARGE_PROGRAM\\x10\\x03\"\\xe0\\x01\\n\\x16\\x43hargeControlConfigure\\x12L\\n\\x13\\x62i_charging_enabled\\x18\\x01 \\x01(\\x0b\\x32\\x1a.google.protobuf.BoolValueR\\x13\\x62idichargingenabled\\x12\\x42\\n\\x0e\\x63harging_power\\x18\\x02 \\x01(\\x0b\\x32\\x1b.google.protobuf.FloatValueR\\rchargingpower\\x12\\x34\\n\\x07min_soc\\x18\\x03 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x06minsoc\"\\xcc\\x02\\n\\x12\\x43hargeOptConfigure\\x12G\\n\\x0eweekday_tariff\\x18\\x01 \\x03(\\x0b\\x32 .proto.ChargeOptConfigure.TariffR\\rweekdaytariff\\x12G\\n\\x0eweekend_tariff\\x18\\x02 \\x03(\\x0b\\x32 .proto.ChargeOptConfigure.TariffR\\rweekendtariff\\x1a\\xa3\\x01\\n\\x06Tariff\\x12\\x39\\n\\x04rate\\x18\\x01 \\x01(\\x0e\\x32%.proto.ChargeOptConfigure.Tariff.RateR\\x04rate\\x12\\x12\\n\\x04time\\x18\\x02 \\x01(\\x05R\\x04time\"J\\n\\x04Rate\\x12\\x11\\n\\rINVALID_PRICE\\x10\\x00\\x12\\r\\n\\tLOW_PRICE\\x10!\\x12\\x10\\n\\x0cNORMAL_PRICE\\x10,\\x12\\x0e\\n\\nHIGH_PRICE\\x10\\x42\"\\x10\\n\\x0e\\x43hargeOptStart\"\\x0f\\n\\rChargeOptStop\"\\xcd\\x04\\n\\x14TemperatureConfigure\\x12[\\n\\x12temperature_points\\x18\\x01 \\x03(\\x0b\\x32,.proto.TemperatureConfigure.TemperaturePointR\\x11temperaturePoints\\x1a\\xd7\\x03\\n\\x10TemperaturePoint\\x12\\x45\\n\\x04zone\\x18\\x01 \\x01(\\x0e\\x32\\x31.proto.TemperatureConfigure.TemperaturePoint.ZoneR\\x04zone\\x12$\\n\\x16temperature_in_celsius\\x18\\x03 \\x01(\\x01R\\x04temp\"\\xcf\\x02\\n\\x04Zone\\x12\\x0b\\n\\x07unknown\\x10\\x00\\x12\\r\\n\\tfrontLeft\\x10\\x01\\x12\\x0e\\n\\nfrontRight\\x10\\x02\\x12\\x0f\\n\\x0b\\x66rontCenter\\x10\\x03\\x12\\x0c\\n\\x08rearLeft\\x10\\x04\\x12\\r\\n\\trearRight\\x10\\x05\\x12\\x0e\\n\\nrearCenter\\x10\\x06\\x12\\r\\n\\trear2Left\\x10\\x07\\x12\\x0e\\n\\nrear2Right\\x10\\x08\\x12\\x0f\\n\\x0brear2Center\\x10\\t\\x12\\x10\\n\\x0cUNKNOWN_ZONE\\x10\\x00\\x12\\x0e\\n\\nFRONT_LEFT\\x10\\x01\\x12\\x0f\\n\\x0b\\x46RONT_RIGHT\\x10\\x02\\x12\\x10\\n\\x0c\\x46RONT_CENTER\\x10\\x03\\x12\\r\\n\\tREAR_LEFT\\x10\\x04\\x12\\x0e\\n\\nREAR_RIGHT\\x10\\x05\\x12\\x0f\\n\\x0bREAR_CENTER\\x10\\x06\\x12\\x0f\\n\\x0bREAR_2_LEFT\\x10\\x07\\x12\\x10\\n\\x0cREAR_2_RIGHT\\x10\\x08\\x12\\x11\\n\\rREAR_2_CENTER\\x10\\t\\x1a\\x02\\x10\\x01J\\x04\\x08\\x02\\x10\\x03\"\\xa9\\x02\\n\\x14WeekProfileConfigure\\x12K\\n\\rweekly_set_hu\\x18\\x01 \\x03(\\x0b\\x32\\'.proto.WeekProfileConfigure.WeeklySetHUR\\x0bweeklySetHU\\x1a\\xc3\\x01\\n\\x0bWeeklySetHU\\x12=\\n\\x03\\x64\\x61y\\x18\\x01 \\x01(\\x0e\\x32+.proto.WeekProfileConfigure.WeeklySetHU.DayR\\x03\\x64\\x61y\\x12\\x12\\n\\x04time\\x18\\x02 \\x01(\\x05R\\x04time\"a\\n\\x03\\x44\\x61y\\x12\\n\\n\\x06MONDAY\\x10\\x00\\x12\\x0b\\n\\x07TUESDAY\\x10\\x01\\x12\\r\\n\\tWEDNESDAY\\x10\\x02\\x12\\x0c\\n\\x08THURSDAY\\x10\\x03\\x12\\n\\n\\x06\\x46RIDAY\\x10\\x04\\x12\\x0c\\n\\x08SATURDAY\\x10\\x05\\x12\\n\\n\\x06SUNDAY\\x10\\x06\"Q\\n\\x16WeekProfileConfigureV2\\x12\\x37\\n\\rtime_profiles\\x18\\x01 \\x03(\\x0b\\x32\\x12.proto.TimeProfileR\\x0ctimeprofiles\"\\xb2\\x02\\n\\x0bTimeProfile\\x12\\x33\\n\\nidentifier\\x18\\x01 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x02id\\x12/\\n\\x04hour\\x18\\x02 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x04hour\\x12\\x30\\n\\x06minute\\x18\\x03 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32ValueR\\x03min\\x12(\\n\\x04\\x64\\x61ys\\x18\\x04 \\x03(\\x0e\\x32\\x15.proto.TimeProfileDayR\\x03\\x64\\x61y\\x12\\x32\\n\\x06\\x61\\x63tive\\x18\\x05 \\x01(\\x0b\\x32\\x1a.google.protobuf.BoolValueR\\x06\\x61\\x63tive\\x12-\\n\\x16\\x61pplication_identifier\\x18\\x06 \\x01(\\x05R\\rapplicationId\"\\xeb\\x03\\n\\x0bSigPosStart\\x12\\x1f\\n\\x0bhorn_repeat\\x18\\x01 \\x01(\\x05R\\nhornRepeat\\x12\\x38\\n\\thorn_type\\x18\\x02 \\x01(\\x0e\\x32\\x1b.proto.SigPosStart.HornTypeR\\x08hornType\\x12;\\n\\nlight_type\\x18\\x03 \\x01(\\x0e\\x32\\x1c.proto.SigPosStart.LightTypeR\\tlightType\\x12\\'\\n\\x0fsigpos_duration\\x18\\x04 \\x01(\\x05R\\x0esigposDuration\\x12>\\n\\x0bsigpos_type\\x18\\x05 \\x01(\\x0e\\x32\\x1d.proto.SigPosStart.SigposTypeR\\nsigposType\"C\\n\\x08HornType\\x12\\x0c\\n\\x08HORN_OFF\\x10\\x00\\x12\\x13\\n\\x0fHORN_LOW_VOLUME\\x10\\x01\\x12\\x14\\n\\x10HORN_HIGH_VOLUME\\x10\\x02\"D\\n\\tLightType\\x12\\r\\n\\tLIGHT_OFF\\x10\\x00\\x12\\x15\\n\\x11\\x44IPPED_HEAD_LIGHT\\x10\\x01\\x12\\x11\\n\\rWARNING_LIGHT\\x10\\x02\"P\\n\\nSigposType\\x12\\x0e\\n\\nLIGHT_ONLY\\x10\\x00\\x12\\r\\n\\tHORN_ONLY\\x10\\x01\\x12\\x12\\n\\x0eLIGHT_AND_HORN\\x10\\x02\\x12\\x0f\\n\\x0bPANIC_ALARM\\x10\\x03\"\"\\n TheftalarmConfirmDamagedetection\"#\\n!TheftalarmDeselectDamagedetection\"\\x1c\\n\\x1aTheftalarmDeselectInterior\"\\x17\\n\\x15TheftalarmDeselectTow\"!\\n\\x1fTheftalarmSelectDamagedetection\"\\x1a\\n\\x18TheftalarmSelectInterior\"\\x15\\n\\x13TheftalarmSelectTow\"C\\n\\x0fTheftalarmStart\\x12\\x30\\n\\x19\\x61larm_duration_in_seconds\\x18\\x01 \\x01(\\x05R\\ralarmduration\"\\x10\\n\\x0eTheftalarmStop\"o\\n\\x1d\\x41utomaticValetParkingActivate\\x12\\x1d\\n\\nbooking_id\\x18\\x01 \\x01(\\tR\\tbookingId\\x12/\\n\\ndrive_type\\x18\\x02 \\x01(\\x0e\\x32\\x10.proto.DriveTypeR\\tdriveType\"\\x1f\\n\\x10\\x43hargeFlapUnlock\\x12\\x0b\\n\\x03pin\\x18\\x01 \\x01(\\t\"\\x15\\n\\x13\\x43hargeCouplerUnlock\"\\x82\\x01\\n ChargingBreakClocktimerConfigure\\x12^\\n(chargingbreak_clocktimer_configure_entry\\x18\\x01 \\x03(\\x0b\\x32,.proto.ChargingBreakClockTimerConfigureEntry\"\\xcf\\x01\\n%ChargingBreakClockTimerConfigureEntry\\x12\\x39\\n\\x06\\x61\\x63tion\\x18\\x01 \\x01(\\x0e\\x32).proto.ChargingBreakClockTimerEntryStatus\\x12\\x13\\n\\x0b\\x65ndTimeHour\\x18\\x02 \\x01(\\x05\\x12\\x15\\n\\rendTimeMinute\\x18\\x03 \\x01(\\x05\\x12\\x15\\n\\rstartTimeHour\\x18\\x04 \\x01(\\x05\\x12\\x17\\n\\x0fstartTimeMinute\\x18\\x05 \\x01(\\x05\\x12\\x0f\\n\\x07timerId\\x18\\x06 \\x01(\\x05\"\\x12\\n\\x10WiperHealthReset\"\\'\\n\\x18SelectiveKeyDeactivation\\x12\\x0b\\n\\x03pin\\x18\\x01 \\x01(\\t\"\\x86\\x01\\n\\x11SunroofBlindsMove\\x12\\x38\\n\\x13sunroof_blind_front\\x18\\x01 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32Value\\x12\\x37\\n\\x12sunroof_blind_rear\\x18\\x02 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32Value\"\\xb0\\x01\\n\\x10WindowBlindsMove\\x12/\\n\\nrear_blind\\x18\\x01 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32Value\\x12\\x34\\n\\x0frear_left_blind\\x18\\x02 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32Value\\x12\\x35\\n\\x10rear_right_blind\\x18\\x03 \\x01(\\x0b\\x32\\x1b.google.protobuf.Int32Value\"\\'\\n%ChildPresenceDetectionDeactivateAlarm\"#\\n!ChildPresenceDetectionTakePicture\"\\x1f\\n\\x1dInteriorMonitoringTakePicture\"\\x1f\\n\\x1d\\x45xteriorMonitoringTakePicture\";\\n\\x11RemoteUpdateStart\\x12\\x0e\\n\\x06pkg_id\\x18\\x01 \\x01(\\t\\x12\\x16\\n\\x0erelease_pkg_id\\x18\\x02 \\x01(\\t\"\\x1f\\n\\x1dTheftAlarmSelectPictureTaking\"!\\n\\x1fTheftAlarmDeselectPictureTaking\"\\x10\\n\\x0eStagemodeStart\"\\x0f\\n\\rStagemodeStop\"[\\n\\x13\\x43lockTimerConfigure\\x12\\x44\\n\\x1b\\x63lock_timer_configure_entry\\x18\\x01 \\x03(\\x0b\\x32\\x1f.proto.ClockTimerConfigureEntry\"\\x8c\\x03\\n\\x18\\x43lockTimerConfigureEntry\\x12\\x36\\n\\x06\\x61\\x63tion\\x18\\x01 \\x01(\\x0e\\x32&.proto.ClockTimerConfigureEntry.Action\\x12\\x15\\n\\rend_time_hour\\x18\\x02 \\x01(\\x03\\x12\\x14\\n\\x0c\\x65nd_time_min\\x18\\x03 \\x01(\\x03\\x12\\x17\\n\\x0fstart_time_hour\\x18\\x04 \\x01(\\x03\\x12\\x16\\n\\x0estart_time_min\\x18\\x05 \\x01(\\x03\\x12\\x10\\n\\x08timer_id\\x18\\x06 \\x01(\\x03\\x12\\x31\\n\\x04\\x64\\x61ys\\x18\\x07 \\x03(\\x0e\\x32#.proto.ClockTimerConfigureEntry.Day\"2\\n\\x06\\x41\\x63tion\\x12\\n\\n\\x06\\x44\\x45LETE\\x10\\x00\\x12\\x0e\\n\\nDEACTIVATE\\x10\\x01\\x12\\x0c\\n\\x08\\x41\\x43TIVATE\\x10\\x02\"a\\n\\x03\\x44\\x61y\\x12\\n\\n\\x06MONDAY\\x10\\x00\\x12\\x0b\\n\\x07TUESDAY\\x10\\x01\\x12\\r\\n\\tWEDNESDAY\\x10\\x02\\x12\\x0c\\n\\x08THURSDAY\\x10\\x03\\x12\\n\\n\\x06\\x46RIDAY\\x10\\x04\\x12\\x0c\\n\\x08SATURDAY\\x10\\x05\\x12\\n\\n\\x06SUNDAY\\x10\\x06*\\xa5\\x02\\n\\x04\\x44oor\\x12\\x10\\n\\x0cunknown_door\\x10\\x00\\x12\\r\\n\\tfrontleft\\x10\\x01\\x12\\x0e\\n\\nfrontright\\x10\\x02\\x12\\x0c\\n\\x08rearleft\\x10\\x03\\x12\\r\\n\\trearright\\x10\\x04\\x12\\t\\n\\x05trunk\\x10\\x05\\x12\\x0c\\n\\x08\\x66uelflap\\x10\\x06\\x12\\x0e\\n\\nchargeflap\\x10\\x07\\x12\\x11\\n\\rchargecoupler\\x10\\x08\\x12\\x10\\n\\x0cUNKNOWN_DOOR\\x10\\x00\\x12\\x0e\\n\\nFRONT_LEFT\\x10\\x01\\x12\\x0f\\n\\x0b\\x46RONT_RIGHT\\x10\\x02\\x12\\r\\n\\tREAR_LEFT\\x10\\x03\\x12\\x0e\\n\\nREAR_RIGHT\\x10\\x04\\x12\\t\\n\\x05TRUNK\\x10\\x05\\x12\\r\\n\\tFUEL_FLAP\\x10\\x06\\x12\\x0f\\n\\x0b\\x43HARGE_FLAP\\x10\\x07\\x12\\x12\\n\\x0e\\x43HARGE_COUPLER\\x10\\x08\\x1a\\x02\\x10\\x01*\\xf1\\x01\\n\\x16ZEVPreconditioningType\\x12,\\n(unknown_zev_preconditioning_command_type\\x10\\x00\\x12\\r\\n\\timmediate\\x10\\x01\\x12\\r\\n\\tdeparture\\x10\\x02\\x12\\x07\\n\\x03now\\x10\\x03\\x12\\x13\\n\\x0f\\x64\\x65partureWeekly\\x10\\x04\\x12,\\n(UNKNOWN_ZEV_PRECONDITIONING_COMMAND_TYPE\\x10\\x00\\x12\\r\\n\\tIMMEDIATE\\x10\\x01\\x12\\r\\n\\tDEPARTURE\\x10\\x02\\x12\\x07\\n\\x03NOW\\x10\\x03\\x12\\x14\\n\\x10\\x44\\x45PARTURE_WEEKLY\\x10\\x04\\x1a\\x02\\x10\\x01*\\xa8\\x01\\n\\x0eTimeProfileDay\\x12\\x06\\n\\x02Mo\\x10\\x00\\x12\\x06\\n\\x02Tu\\x10\\x01\\x12\\x06\\n\\x02We\\x10\\x02\\x12\\x06\\n\\x02Th\\x10\\x03\\x12\\x06\\n\\x02\\x46r\\x10\\x04\\x12\\x06\\n\\x02Sa\\x10\\x05\\x12\\x06\\n\\x02Su\\x10\\x06\\x12\\n\\n\\x06MONDAY\\x10\\x00\\x12\\x0b\\n\\x07TUESDAY\\x10\\x01\\x12\\r\\n\\tWEDNESDAY\\x10\\x02\\x12\\x0c\\n\\x08THURSDAY\\x10\\x03\\x12\\n\\n\\x06\\x46RIDAY\\x10\\x04\\x12\\x0c\\n\\x08SATURDAY\\x10\\x05\\x12\\n\\n\\x06SUNDAY\\x10\\x06\\x1a\\x02\\x10\\x01*>\\n\\tDriveType\\x12\\x16\\n\\x12UNKNOWN_DRIVE_TYPE\\x10\\x00\\x12\\x0b\\n\\x07PICK_UP\\x10\\x01\\x12\\x0c\\n\\x08\\x44ROP_OFF\\x10\\x02*J\\n\"ChargingBreakClockTimerEntryStatus\\x12\\n\\n\\x06\\x44\\x45LETE\\x10\\x00\\x12\\x0c\\n\\x08INACTIVE\\x10\\x01\\x12\\n\\n\\x06\\x41\\x43TIVE\\x10\\x02\\x42 \\n\\x1a\\x63om.daimler.mbcarkit.proto\\xd0\\xe1\\x1e\\x01\\x62\\x06proto3'\n)\n\n_globals = globals()\n_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)\n_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, \"vehicle_commands_pb2\", _globals)\nif not _descriptor._USE_C_DESCRIPTORS:\n    _globals[\"DESCRIPTOR\"]._loaded_options = None\n    _globals[\"DESCRIPTOR\"]._serialized_options = b\"\\n\\032com.daimler.mbcarkit.proto\\320\\341\\036\\001\"\n    _globals[\"_DOOR\"]._loaded_options = None\n    _globals[\"_DOOR\"]._serialized_options = b\"\\020\\001\"\n    _globals[\"_ZEVPRECONDITIONINGTYPE\"]._loaded_options = None\n    _globals[\"_ZEVPRECONDITIONINGTYPE\"]._serialized_options = b\"\\020\\001\"\n    _globals[\"_TIMEPROFILEDAY\"]._loaded_options = None\n    _globals[\"_TIMEPROFILEDAY\"]._serialized_options = b\"\\020\\001\"\n    _globals[\"_TEMPERATURECONFIGURE_TEMPERATUREPOINT_ZONE\"]._loaded_options = None\n    _globals[\"_TEMPERATURECONFIGURE_TEMPERATUREPOINT_ZONE\"]._serialized_options = b\"\\020\\001\"\n    _globals[\"_DOOR\"]._serialized_start = 12763\n    _globals[\"_DOOR\"]._serialized_end = 13056\n    _globals[\"_ZEVPRECONDITIONINGTYPE\"]._serialized_start = 13059\n    _globals[\"_ZEVPRECONDITIONINGTYPE\"]._serialized_end = 13300\n    _globals[\"_TIMEPROFILEDAY\"]._serialized_start = 13303\n    _globals[\"_TIMEPROFILEDAY\"]._serialized_end = 13471\n    _globals[\"_DRIVETYPE\"]._serialized_start = 13473\n    _globals[\"_DRIVETYPE\"]._serialized_end = 13535\n    _globals[\"_CHARGINGBREAKCLOCKTIMERENTRYSTATUS\"]._serialized_start = 13537\n    _globals[\"_CHARGINGBREAKCLOCKTIMERENTRYSTATUS\"]._serialized_end = 13611\n    _globals[\"_ACKNOWLEDGECOMMANDREQUEST\"]._serialized_start = 77\n    _globals[\"_ACKNOWLEDGECOMMANDREQUEST\"]._serialized_end = 124\n    _globals[\"_COMMANDREQUEST\"]._serialized_start = 127\n    _globals[\"_COMMANDREQUEST\"]._serialized_end = 4169\n    _globals[\"_COMMANDREQUEST_BACKEND\"]._serialized_start = 4124\n    _globals[\"_COMMANDREQUEST_BACKEND\"]._serialized_end = 4158\n    _globals[\"_CHARGINGCONFIGURE\"]._serialized_start = 4172\n    _globals[\"_CHARGINGCONFIGURE\"]._serialized_end = 5128\n    _globals[\"_CHARGINGCONFIGURE_ACTION\"]._serialized_start = 4719\n    _globals[\"_CHARGINGCONFIGURE_ACTION\"]._serialized_end = 4795\n    _globals[\"_CHARGINGCONFIGURE_DCCHARGINGPROFILE\"]._serialized_start = 4798\n    _globals[\"_CHARGINGCONFIGURE_DCCHARGINGPROFILE\"]._serialized_end = 4944\n    _globals[\"_CHARGINGCONFIGURE_CHARGEPROGRAM\"]._serialized_start = 4946\n    _globals[\"_CHARGINGCONFIGURE_CHARGEPROGRAM\"]._serialized_end = 5039\n    _globals[\"_CHARGINGCONFIGURE_SOHCALIBRATIONACTIVATION\"]._serialized_start = 5041\n    _globals[\"_CHARGINGCONFIGURE_SOHCALIBRATIONACTIVATION\"]._serialized_end = 5128\n    _globals[\"_HVBATTERYSTARTCONDITIONING\"]._serialized_start = 5130\n    _globals[\"_HVBATTERYSTARTCONDITIONING\"]._serialized_end = 5158\n    _globals[\"_HVBATTERYSTOPCONDITIONING\"]._serialized_start = 5160\n    _globals[\"_HVBATTERYSTOPCONDITIONING\"]._serialized_end = 5187\n    _globals[\"_REMOTESEATBALLETTCONFIGURE\"]._serialized_start = 5189\n    _globals[\"_REMOTESEATBALLETTCONFIGURE\"]._serialized_end = 5217\n    _globals[\"_DEACTIVATEVEHICLEKEYS\"]._serialized_start = 5220\n    _globals[\"_DEACTIVATEVEHICLEKEYS\"]._serialized_end = 5385\n    _globals[\"_ACTIVATEVEHICLEKEYS\"]._serialized_start = 5388\n    _globals[\"_ACTIVATEVEHICLEKEYS\"]._serialized_end = 5551\n    _globals[\"_AUXHEATSTART\"]._serialized_start = 5553\n    _globals[\"_AUXHEATSTART\"]._serialized_end = 5567\n    _globals[\"_AUXHEATSTOP\"]._serialized_start = 5569\n    _globals[\"_AUXHEATSTOP\"]._serialized_end = 5582\n    _globals[\"_AUXHEATCONFIGURE\"]._serialized_start = 5585\n    _globals[\"_AUXHEATCONFIGURE\"]._serialized_end = 5841\n    _globals[\"_AUXHEATCONFIGURE_SELECTION\"]._serialized_start = 5776\n    _globals[\"_AUXHEATCONFIGURE_SELECTION\"]._serialized_end = 5841\n    _globals[\"_DOORSLOCK\"]._serialized_start = 5843\n    _globals[\"_DOORSLOCK\"]._serialized_end = 5882\n    _globals[\"_DOORSUNLOCK\"]._serialized_start = 5884\n    _globals[\"_DOORSUNLOCK\"]._serialized_end = 5938\n    _globals[\"_ENGINESTART\"]._serialized_start = 5940\n    _globals[\"_ENGINESTART\"]._serialized_end = 5966\n    _globals[\"_ENGINESTOP\"]._serialized_start = 5968\n    _globals[\"_ENGINESTOP\"]._serialized_end = 5980\n    _globals[\"_SUNROOFOPEN\"]._serialized_start = 5982\n    _globals[\"_SUNROOFOPEN\"]._serialized_end = 6008\n    _globals[\"_SUNROOFCLOSE\"]._serialized_start = 6010\n    _globals[\"_SUNROOFCLOSE\"]._serialized_end = 6024\n    _globals[\"_SUNROOFLIFT\"]._serialized_start = 6026\n    _globals[\"_SUNROOFLIFT\"]._serialized_end = 6052\n    _globals[\"_SUNROOFMOVE\"]._serialized_start = 6055\n    _globals[\"_SUNROOFMOVE\"]._serialized_end = 6288\n    _globals[\"_WINDOWSOPEN\"]._serialized_start = 6290\n    _globals[\"_WINDOWSOPEN\"]._serialized_end = 6316\n    _globals[\"_WINDOWSCLOSE\"]._serialized_start = 6318\n    _globals[\"_WINDOWSCLOSE\"]._serialized_end = 6332\n    _globals[\"_WINDOWSVENTILATE\"]._serialized_start = 6334\n    _globals[\"_WINDOWSVENTILATE\"]._serialized_end = 6365\n    _globals[\"_WINDOWSMOVE\"]._serialized_start = 6368\n    _globals[\"_WINDOWSMOVE\"]._serialized_end = 6876\n    _globals[\"_SPEEDALERTSTART\"]._serialized_start = 6878\n    _globals[\"_SPEEDALERTSTART\"]._serialized_end = 6978\n    _globals[\"_SPEEDALERTSTOP\"]._serialized_start = 6980\n    _globals[\"_SPEEDALERTSTOP\"]._serialized_end = 6996\n    _globals[\"_ZEVPRECONDITIONINGSTART\"]._serialized_start = 6998\n    _globals[\"_ZEVPRECONDITIONINGSTART\"]._serialized_end = 7113\n    _globals[\"_ZEVPRECONDITIONINGSTOP\"]._serialized_start = 7115\n    _globals[\"_ZEVPRECONDITIONINGSTOP\"]._serialized_end = 7190\n    _globals[\"_ZEVPRECONDITIONINGCONFIGURE\"]._serialized_start = 7193\n    _globals[\"_ZEVPRECONDITIONINGCONFIGURE\"]._serialized_end = 7442\n    _globals[\"_ZEVPRECONDITIONINGCONFIGURE_DEPARTURETIMEMODE\"]._serialized_start = 7365\n    _globals[\"_ZEVPRECONDITIONINGCONFIGURE_DEPARTURETIMEMODE\"]._serialized_end = 7442\n    _globals[\"_ZEVPRECONDITIONINGCONFIGURESEATS\"]._serialized_start = 7445\n    _globals[\"_ZEVPRECONDITIONINGCONFIGURESEATS\"]._serialized_end = 7647\n    _globals[\"_BATTERYCHARGEPROGRAMCONFIGURE\"]._serialized_start = 7650\n    _globals[\"_BATTERYCHARGEPROGRAMCONFIGURE\"]._serialized_end = 7815\n    _globals[\"_BATTERYCHARGEPROGRAMCONFIGURE_CHARGEPROGRAM\"]._serialized_start = 7774\n    _globals[\"_BATTERYCHARGEPROGRAMCONFIGURE_CHARGEPROGRAM\"]._serialized_end = 7815\n    _globals[\"_BATTERYMAXSOCCONFIGURE\"]._serialized_start = 7817\n    _globals[\"_BATTERYMAXSOCCONFIGURE\"]._serialized_end = 7866\n    _globals[\"_CHARGEPROGRAMCONFIGURE\"]._serialized_start = 7869\n    _globals[\"_CHARGEPROGRAMCONFIGURE\"]._serialized_end = 8395\n    _globals[\"_CHARGEPROGRAMCONFIGURE_CHARGEPROGRAM\"]._serialized_start = 4946\n    _globals[\"_CHARGEPROGRAMCONFIGURE_CHARGEPROGRAM\"]._serialized_end = 5039\n    _globals[\"_CHARGECONTROLCONFIGURE\"]._serialized_start = 8398\n    _globals[\"_CHARGECONTROLCONFIGURE\"]._serialized_end = 8622\n    _globals[\"_CHARGEOPTCONFIGURE\"]._serialized_start = 8625\n    _globals[\"_CHARGEOPTCONFIGURE\"]._serialized_end = 8957\n    _globals[\"_CHARGEOPTCONFIGURE_TARIFF\"]._serialized_start = 8794\n    _globals[\"_CHARGEOPTCONFIGURE_TARIFF\"]._serialized_end = 8957\n    _globals[\"_CHARGEOPTCONFIGURE_TARIFF_RATE\"]._serialized_start = 8883\n    _globals[\"_CHARGEOPTCONFIGURE_TARIFF_RATE\"]._serialized_end = 8957\n    _globals[\"_CHARGEOPTSTART\"]._serialized_start = 8959\n    _globals[\"_CHARGEOPTSTART\"]._serialized_end = 8975\n    _globals[\"_CHARGEOPTSTOP\"]._serialized_start = 8977\n    _globals[\"_CHARGEOPTSTOP\"]._serialized_end = 8992\n    _globals[\"_TEMPERATURECONFIGURE\"]._serialized_start = 8995\n    _globals[\"_TEMPERATURECONFIGURE\"]._serialized_end = 9584\n    _globals[\"_TEMPERATURECONFIGURE_TEMPERATUREPOINT\"]._serialized_start = 9113\n    _globals[\"_TEMPERATURECONFIGURE_TEMPERATUREPOINT\"]._serialized_end = 9584\n    _globals[\"_TEMPERATURECONFIGURE_TEMPERATUREPOINT_ZONE\"]._serialized_start = 9243\n    _globals[\"_TEMPERATURECONFIGURE_TEMPERATUREPOINT_ZONE\"]._serialized_end = 9578\n    _globals[\"_WEEKPROFILECONFIGURE\"]._serialized_start = 9587\n    _globals[\"_WEEKPROFILECONFIGURE\"]._serialized_end = 9884\n    _globals[\"_WEEKPROFILECONFIGURE_WEEKLYSETHU\"]._serialized_start = 9689\n    _globals[\"_WEEKPROFILECONFIGURE_WEEKLYSETHU\"]._serialized_end = 9884\n    _globals[\"_WEEKPROFILECONFIGURE_WEEKLYSETHU_DAY\"]._serialized_start = 9787\n    _globals[\"_WEEKPROFILECONFIGURE_WEEKLYSETHU_DAY\"]._serialized_end = 9884\n    _globals[\"_WEEKPROFILECONFIGUREV2\"]._serialized_start = 9886\n    _globals[\"_WEEKPROFILECONFIGUREV2\"]._serialized_end = 9967\n    _globals[\"_TIMEPROFILE\"]._serialized_start = 9970\n    _globals[\"_TIMEPROFILE\"]._serialized_end = 10276\n    _globals[\"_SIGPOSSTART\"]._serialized_start = 10279\n    _globals[\"_SIGPOSSTART\"]._serialized_end = 10770\n    _globals[\"_SIGPOSSTART_HORNTYPE\"]._serialized_start = 10551\n    _globals[\"_SIGPOSSTART_HORNTYPE\"]._serialized_end = 10618\n    _globals[\"_SIGPOSSTART_LIGHTTYPE\"]._serialized_start = 10620\n    _globals[\"_SIGPOSSTART_LIGHTTYPE\"]._serialized_end = 10688\n    _globals[\"_SIGPOSSTART_SIGPOSTYPE\"]._serialized_start = 10690\n    _globals[\"_SIGPOSSTART_SIGPOSTYPE\"]._serialized_end = 10770\n    _globals[\"_THEFTALARMCONFIRMDAMAGEDETECTION\"]._serialized_start = 10772\n    _globals[\"_THEFTALARMCONFIRMDAMAGEDETECTION\"]._serialized_end = 10806\n    _globals[\"_THEFTALARMDESELECTDAMAGEDETECTION\"]._serialized_start = 10808\n    _globals[\"_THEFTALARMDESELECTDAMAGEDETECTION\"]._serialized_end = 10843\n    _globals[\"_THEFTALARMDESELECTINTERIOR\"]._serialized_start = 10845\n    _globals[\"_THEFTALARMDESELECTINTERIOR\"]._serialized_end = 10873\n    _globals[\"_THEFTALARMDESELECTTOW\"]._serialized_start = 10875\n    _globals[\"_THEFTALARMDESELECTTOW\"]._serialized_end = 10898\n    _globals[\"_THEFTALARMSELECTDAMAGEDETECTION\"]._serialized_start = 10900\n    _globals[\"_THEFTALARMSELECTDAMAGEDETECTION\"]._serialized_end = 10933\n    _globals[\"_THEFTALARMSELECTINTERIOR\"]._serialized_start = 10935\n    _globals[\"_THEFTALARMSELECTINTERIOR\"]._serialized_end = 10961\n    _globals[\"_THEFTALARMSELECTTOW\"]._serialized_start = 10963\n    _globals[\"_THEFTALARMSELECTTOW\"]._serialized_end = 10984\n    _globals[\"_THEFTALARMSTART\"]._serialized_start = 10986\n    _globals[\"_THEFTALARMSTART\"]._serialized_end = 11053\n    _globals[\"_THEFTALARMSTOP\"]._serialized_start = 11055\n    _globals[\"_THEFTALARMSTOP\"]._serialized_end = 11071\n    _globals[\"_AUTOMATICVALETPARKINGACTIVATE\"]._serialized_start = 11073\n    _globals[\"_AUTOMATICVALETPARKINGACTIVATE\"]._serialized_end = 11184\n    _globals[\"_CHARGEFLAPUNLOCK\"]._serialized_start = 11186\n    _globals[\"_CHARGEFLAPUNLOCK\"]._serialized_end = 11217\n    _globals[\"_CHARGECOUPLERUNLOCK\"]._serialized_start = 11219\n    _globals[\"_CHARGECOUPLERUNLOCK\"]._serialized_end = 11240\n    _globals[\"_CHARGINGBREAKCLOCKTIMERCONFIGURE\"]._serialized_start = 11243\n    _globals[\"_CHARGINGBREAKCLOCKTIMERCONFIGURE\"]._serialized_end = 11373\n    _globals[\"_CHARGINGBREAKCLOCKTIMERCONFIGUREENTRY\"]._serialized_start = 11376\n    _globals[\"_CHARGINGBREAKCLOCKTIMERCONFIGUREENTRY\"]._serialized_end = 11583\n    _globals[\"_WIPERHEALTHRESET\"]._serialized_start = 11585\n    _globals[\"_WIPERHEALTHRESET\"]._serialized_end = 11603\n    _globals[\"_SELECTIVEKEYDEACTIVATION\"]._serialized_start = 11605\n    _globals[\"_SELECTIVEKEYDEACTIVATION\"]._serialized_end = 11644\n    _globals[\"_SUNROOFBLINDSMOVE\"]._serialized_start = 11647\n    _globals[\"_SUNROOFBLINDSMOVE\"]._serialized_end = 11781\n    _globals[\"_WINDOWBLINDSMOVE\"]._serialized_start = 11784\n    _globals[\"_WINDOWBLINDSMOVE\"]._serialized_end = 11960\n    _globals[\"_CHILDPRESENCEDETECTIONDEACTIVATEALARM\"]._serialized_start = 11962\n    _globals[\"_CHILDPRESENCEDETECTIONDEACTIVATEALARM\"]._serialized_end = 12001\n    _globals[\"_CHILDPRESENCEDETECTIONTAKEPICTURE\"]._serialized_start = 12003\n    _globals[\"_CHILDPRESENCEDETECTIONTAKEPICTURE\"]._serialized_end = 12038\n    _globals[\"_INTERIORMONITORINGTAKEPICTURE\"]._serialized_start = 12040\n    _globals[\"_INTERIORMONITORINGTAKEPICTURE\"]._serialized_end = 12071\n    _globals[\"_EXTERIORMONITORINGTAKEPICTURE\"]._serialized_start = 12073\n    _globals[\"_EXTERIORMONITORINGTAKEPICTURE\"]._serialized_end = 12104\n    _globals[\"_REMOTEUPDATESTART\"]._serialized_start = 12106\n    _globals[\"_REMOTEUPDATESTART\"]._serialized_end = 12165\n    _globals[\"_THEFTALARMSELECTPICTURETAKING\"]._serialized_start = 12167\n    _globals[\"_THEFTALARMSELECTPICTURETAKING\"]._serialized_end = 12198\n    _globals[\"_THEFTALARMDESELECTPICTURETAKING\"]._serialized_start = 12200\n    _globals[\"_THEFTALARMDESELECTPICTURETAKING\"]._serialized_end = 12233\n    _globals[\"_STAGEMODESTART\"]._serialized_start = 12235\n    _globals[\"_STAGEMODESTART\"]._serialized_end = 12251\n    _globals[\"_STAGEMODESTOP\"]._serialized_start = 12253\n    _globals[\"_STAGEMODESTOP\"]._serialized_end = 12268\n    _globals[\"_CLOCKTIMERCONFIGURE\"]._serialized_start = 12270\n    _globals[\"_CLOCKTIMERCONFIGURE\"]._serialized_end = 12361\n    _globals[\"_CLOCKTIMERCONFIGUREENTRY\"]._serialized_start = 12364\n    _globals[\"_CLOCKTIMERCONFIGUREENTRY\"]._serialized_end = 12760\n    _globals[\"_CLOCKTIMERCONFIGUREENTRY_ACTION\"]._serialized_start = 12611\n    _globals[\"_CLOCKTIMERCONFIGUREENTRY_ACTION\"]._serialized_end = 12661\n    _globals[\"_CLOCKTIMERCONFIGUREENTRY_DAY\"]._serialized_start = 9787\n    _globals[\"_CLOCKTIMERCONFIGUREENTRY_DAY\"]._serialized_end = 9884\n# @@protoc_insertion_point(module_scope)\n"
  },
  {
    "path": "custom_components/mbapi2020/proto/vehicle_events_pb2.py",
    "content": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: vehicle-events.proto\n# Protobuf Python Version: 5.29.5\n\"\"\"Generated protocol buffer code.\"\"\"\n\nfrom google.protobuf import (\n    descriptor as _descriptor,\n    descriptor_pool as _descriptor_pool,\n    symbol_database as _symbol_database,\n)\nfrom google.protobuf.internal import builder as _builder\n\n# @@protoc_insertion_point(imports)\n\n_sym_db = _symbol_database.Default()\n\nfrom google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2\n\nimport custom_components.mbapi2020.proto.protos_pb2 as protos__pb2\nimport custom_components.mbapi2020.proto.service_activation_pb2 as service__activation__pb2\nimport custom_components.mbapi2020.proto.user_events_pb2 as user__events__pb2\nimport custom_components.mbapi2020.proto.vehicle_commands_pb2 as vehicle__commands__pb2\nimport custom_components.mbapi2020.proto.vehicleapi_pb2 as vehicleapi__pb2\n\nDESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(\n    b'\\n\\x14vehicle-events.proto\\x12\\x05proto\\x1a\\x18service-activation.proto\\x1a\\x11user-events.proto\\x1a\\x16vehicle-commands.proto\\x1a\\x0cprotos.proto\\x1a\\x10vehicleapi.proto\\x1a\\x1fgoogle/protobuf/timestamp.proto\"\\x84\\x02\\n\\tVEPUpdate\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\\x12\\x0b\\n\\x03vin\\x18\\x02 \\x01(\\t\\x12\\x13\\n\\x0b\\x66ull_update\\x18\\x0f \\x01(\\x08\\x12\\x16\\n\\x0e\\x65mit_timestamp\\x18\\n \\x01(\\x03\\x12\\x1c\\n\\x14\\x65mit_timestamp_in_ms\\x18\\x0e \\x01(\\x03\\x12\\x34\\n\\nattributes\\x18\\x0b \\x03(\\x0b\\x32 .proto.VEPUpdate.AttributesEntry\\x1aP\\n\\x0f\\x41ttributesEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\t\\x12,\\n\\x05value\\x18\\x02 \\x01(\\x0b\\x32\\x1d.proto.VehicleAttributeStatus:\\x02\\x38\\x01\"\\xb8>\\n\\x16VehicleAttributeStatus\\x12\\x15\\n\\ttimestamp\\x18\\x01 \\x01(\\x03\\x42\\x02\\x18\\x01\\x12\\x17\\n\\x0ftimestamp_in_ms\\x18\\n \\x01(\\x03\\x12\\x0f\\n\\x07\\x63hanged\\x18\\x02 \\x01(\\x08\\x12\\x0e\\n\\x06status\\x18\\x03 \\x01(\\x05\\x12\\x13\\n\\x0bservice_ids\\x18\\x1e \\x03(\\x05\\x12\\x15\\n\\rdisplay_value\\x18\\x0b \\x01(\\t\\x12^\\n\\x1b\\x63ombustion_consumption_unit\\x18\\x0c \\x01(\\x0e\\x32\\x37.proto.VehicleAttributeStatus.CombustionConsumptionUnitH\\x00\\x12P\\n\\x14gas_consumption_unit\\x18\\r \\x01(\\x0e\\x32\\x30.proto.VehicleAttributeStatus.GasConsumptionUnitH\\x00\\x12`\\n\\x1c\\x65lectricity_consumption_unit\\x18\\x0e \\x01(\\x0e\\x32\\x38.proto.VehicleAttributeStatus.ElectricityConsumptionUnitH\\x00\\x12R\\n\\x13speed_distance_unit\\x18\\x0f \\x01(\\x0e\\x32/.proto.VehicleAttributeStatus.SpeedDistanceUnitB\\x02\\x18\\x01H\\x00\\x12=\\n\\nspeed_unit\\x18\\x19 \\x01(\\x0e\\x32\\'.proto.VehicleAttributeStatus.SpeedUnitH\\x00\\x12\\x43\\n\\rdistance_unit\\x18\\x1a \\x01(\\x0e\\x32*.proto.VehicleAttributeStatus.DistanceUnitH\\x00\\x12I\\n\\x10temperature_unit\\x18\\x10 \\x01(\\x0e\\x32-.proto.VehicleAttributeStatus.TemperatureUnitH\\x00\\x12\\x43\\n\\rpressure_unit\\x18\\x11 \\x01(\\x0e\\x32*.proto.VehicleAttributeStatus.PressureUnitH\\x00\\x12=\\n\\nratio_unit\\x18\\x12 \\x01(\\x0e\\x32\\'.proto.VehicleAttributeStatus.RatioUnitH\\x00\\x12\\x46\\n\\x0f\\x63lock_hour_unit\\x18\\x13 \\x01(\\x0e\\x32+.proto.VehicleAttributeStatus.ClockHourUnitH\\x00\\x12\\x13\\n\\tint_value\\x18\\x04 \\x01(\\x03H\\x01\\x12\\x14\\n\\nbool_value\\x18\\x05 \\x01(\\x08H\\x01\\x12\\x16\\n\\x0cstring_value\\x18\\x06 \\x01(\\tH\\x01\\x12\\x16\\n\\x0c\\x64ouble_value\\x18\\x07 \\x01(\\x01H\\x01\\x12\\x13\\n\\tnil_value\\x18\\x08 \\x01(\\x08H\\x01\\x12\\x1b\\n\\x11unsupported_value\\x18\\t \\x01(\\tH\\x01\\x12\\x41\\n\\x18temperature_points_value\\x18\\x14 \\x01(\\x0b\\x32\\x1d.proto.TemperaturePointsValueH\\x01\\x12\\x39\\n\\x14weekday_tariff_value\\x18\\x15 \\x01(\\x0b\\x32\\x19.proto.WeekdayTariffValueH\\x01\\x12\\x39\\n\\x14weekend_tariff_value\\x18\\x16 \\x01(\\x0b\\x32\\x19.proto.WeekendTariffValueH\\x01\\x12I\\n\\x1dstate_of_charge_profile_value\\x18\\x17 \\x01(\\x0b\\x32 .proto.StateOfChargeProfileValueH\\x01\\x12M\\n\\x1fweekly_settings_head_unit_value\\x18\\x18 \\x01(\\x0b\\x32\".proto.WeeklySettingsHeadUnitValueH\\x01\\x12N\\n\\x1fspeed_alert_configuration_value\\x18\\x1b \\x01(\\x0b\\x32#.proto.SpeedAlertConfigurationValueH\\x01\\x12\\x37\\n\\x13\\x65\\x63o_histogram_value\\x18\\x1c \\x01(\\x0b\\x32\\x18.proto.EcoHistogramValueH\\x01\\x12\\x39\\n\\x14weekly_profile_value\\x18\\x1d \\x01(\\x0b\\x32\\x19.proto.WeeklyProfileValueH\\x01\\x12;\\n\\x15\\x63harge_programs_value\\x18\\x1f \\x01(\\x0b\\x32\\x1a.proto.ChargeProgramsValueH\\x01\\x12M\\n\\x1e\\x63hargingbreak_clocktimer_value\\x18  \\x01(\\x0b\\x32#.proto.ChargingBreakClockTimerValueH\\x01\\x12=\\n\\x16\\x63harging_power_control\\x18! \\x01(\\x0b\\x32\\x1b.proto.ChargingPowerControlH\\x01\\x12L\\n\\x1ekeyline_activation_state_value\\x18$ \\x01(\\x0b\\x32\".proto.KeylineActivationStateValueH\\x01\\x12\\x42\\n\\x19next_departure_time_value\\x18% \\x01(\\x0b\\x32\\x1d.proto.NextDepartureTimeValueH\\x01\\x12l\\n tcu_connection_state_low_channel\\x18& \\x01(\\x0e\\x32@.proto.VehicleAttributeStatus.TcuConnectionStateLowChannelStatusH\\x01\\x12\\x45\\n\\x1bturn_off_engine_pre_warning\\x18\\' \\x01(\\x0e\\x32\\x1e.proto.TurnOffEnginePreWarningH\\x01\\x12\\x64\\n+child_presence_detection_warning_last_event\\x18( \\x01(\\x0e\\x32-.proto.ChildPresenceDetectionWarningLastEventH\\x01\\x12[\\n&child_presence_detection_warning_level\\x18) \\x01(\\x0e\\x32).proto.ChildPresenceDetectionWarningLevelH\\x01\\x12T\\n\"performance_limitation_mode_status\\x18* \\x01(\\x0e\\x32&.proto.PerformanceLimitationModeStatusH\\x01\\x12.\\n\\x0e\\x62\\x61ttery_health\\x18+ \\x01(\\x0e\\x32\\x14.proto.BatteryHealthH\\x01\\x12,\\n\\rprecond_state\\x18, \\x01(\\x0b\\x32\\x13.proto.PrecondStateH\\x01\\x12\\x45\\n\\x1a\\x65xterior_monitoring_status\\x18- \\x01(\\x0e\\x32\\x1f.proto.ExteriorMonitoringStatusH\\x01\\x12\\x45\\n\\x1ainterior_monitoring_status\\x18. \\x01(\\x0e\\x32\\x1f.proto.InteriorMonitoringStatusH\\x01\\x12\\x44\\n\\x1aremote_update_start_status\\x18/ \\x01(\\x0b\\x32\\x1e.proto.RemoteUpdateStartStatusH\\x01\\x12\\x41\\n\\x18soh_calibration_required\\x18\\x30 \\x01(\\x0e\\x32\\x1d.proto.SohCalibrationRequiredH\\x01\\x12?\\n\\x17soc_calibration_request\\x18\\x31 \\x01(\\x0e\\x32\\x1c.proto.SocCalibrationRequestH\\x01\\x12?\\n\\x17soh_calibration_request\\x18\\x32 \\x01(\\x0e\\x32\\x1c.proto.SohCalibrationRequestH\\x01\\x12;\\n\\x15soh_calibration_state\\x18\\x33 \\x01(\\x0e\\x32\\x1a.proto.SohCalibrationStateH\\x01\\x12?\\n\\x17soh_calibration_planned\\x18\\x34 \\x01(\\x0e\\x32\\x1c.proto.SohCalibrationPlannedH\\x01\\x12\\x41\\n\\x18soh_favorable_conditions\\x18\\x35 \\x01(\\x0e\\x32\\x1d.proto.SohFavorableConditionsH\\x01\\x12K\\n\\x1dsoh_calibration_notifications\\x18\\x36 \\x01(\\x0e\\x32\".proto.SohCalibrationNotificationsH\\x01\\x12G\\n\\x1b\\x63harging_power_restrictions\\x18\\x37 \\x01(\\x0b\\x32 .proto.ChargingPowerRestrictionsH\\x01\\x12\\x63\\n\\x1e\\x63harging_coupler_error_details\\x18\\x38 \\x01(\\x0e\\x32\\x39.proto.VehicleAttributeStatus.ChargingCouplerErrorDetailsH\\x01\\x12\\x46\\n\\x1b\\x63harging_stop_error_details\\x18\\x39 \\x01(\\x0e\\x32\\x1f.proto.ChargingStopErrorDetailsH\\x01\\x12q\\n&charging_error_vehicle_no_support_400v\\x18: \\x01(\\x0e\\x32?.proto.VehicleAttributeStatus.ChargingErrorVehicleNoSupport400VH\\x01\\x12u\\n(charging_error_impossible_change_to_400v\\x18; \\x01(\\x0e\\x32\\x41.proto.VehicleAttributeStatus.ChargingErrorImpossibleChangeTo400VH\\x01\\x12u\\n(charging_error_impossible_change_to_800v\\x18< \\x01(\\x0e\\x32\\x41.proto.VehicleAttributeStatus.ChargingErrorImpossibleChangeTo800VH\\x01\\x12\\x43\\n\\x19precond_operability_state\\x18= \\x01(\\x0b\\x32\\x1e.proto.PrecondOperabilityStateH\\x01\\x12\\x41\\n\\x18picture_recording_status\\x18> \\x01(\\x0e\\x32\\x1d.proto.PictureRecordingStatusH\\x01\\x12U\\n#park_event_picture_selection_status\\x18? \\x01(\\x0e\\x32&.proto.ParkEventPictureSelectionStatusH\\x01\\x12\\x35\\n\\x12panic_alarm_active\\x18@ \\x01(\\x0e\\x32\\x17.proto.PanicAlarmActiveH\\x01\\x12X\\n$interior_protection_selection_status\\x18\\x41 \\x01(\\x0e\\x32(.proto.InteriorProtectionSelectionStatusH\\x01\\x12Z\\n%interior_protection_activation_status\\x18\\x42 \\x01(\\x0e\\x32).proto.InteriorProtectionActivationStatusH\\x01\\x12N\\n\\x1ftow_protection_selection_status\\x18\\x43 \\x01(\\x0e\\x32#.proto.TowProtectionSelectionStatusH\\x01\\x12P\\n tow_protection_activation_status\\x18\\x44 \\x01(\\x0e\\x32$.proto.TowProtectionActivationStatusH\\x01\\x12U\\n#vehicle_theft_alarm_inactive_reason\\x18\\x45 \\x01(\\x0e\\x32&.proto.VehicleTheftAlarmInactiveReasonH\\x01\\x12N\\n\\x1fpark_collision_selection_status\\x18\\x46 \\x01(\\x0e\\x32#.proto.ParkCollisionSelectionStatusH\\x01\\x12P\\n park_collision_activation_status\\x18G \\x01(\\x0e\\x32$.proto.ParkCollisionActivationStatusH\\x01\\x12L\\n\\x1epark_collision_inactive_reason\\x18H \\x01(\\x0e\\x32\".proto.ParkCollisionInactiveReasonH\\x01\\x12[\\n&park_collision_picture_transfer_status\\x18I \\x01(\\x0e\\x32).proto.ParkCollisionPictureTransferStatusH\\x01\\x12=\\n\\x16\\x65mergency_power_supply\\x18N \\x01(\\x0e\\x32\\x1b.proto.EmergencyPowerSupplyH\\x01\\x12\\x35\\n\\x12\\x65vse_pairing_state\\x18O \\x01(\\x0e\\x32\\x17.proto.EvsePairingStateH\\x01\\x12?\\n\\x17\\x63harging_prediction_soc\\x18P \\x01(\\x0b\\x32\\x1c.proto.ChargingPredictionSocH\\x01\\x12T\\n\"charging_prediction_departure_time\\x18Q \\x01(\\x0b\\x32&.proto.ChargingPredictionDepartureTimeH\\x01\\x12\\x41\\n\\x18\\x63harging_schedule_active\\x18R \\x01(\\x0b\\x32\\x1d.proto.ChargingScheduleActiveH\\x01\\x12\\x37\\n\\x13\\x64\\x63_charging_profile\\x18S \\x01(\\x0e\\x32\\x18.proto.DcChargingProfileH\\x01\\x12*\\n\\x0c\\x63harge_flaps\\x18T \\x01(\\x0b\\x32\\x12.proto.ChargeFlapsH\\x01\\x12,\\n\\rcharge_inlets\\x18U \\x01(\\x0b\\x32\\x13.proto.ChargeInletsH\\x01\\x12.\\n\\x0e\\x63harging_timer\\x18V \\x01(\\x0b\\x32\\x14.proto.ChargingTimerH\\x01\\x12[\\n&park_event_picture_transmission_status\\x18W \\x01(\\x0e\\x32).proto.ParkEventPictureTransmissionStatusH\\x01\\x12G\\n\\x1b\\x63harging_schedule_requested\\x18X \\x01(\\x0b\\x32 .proto.ChargingScheduleRequestedH\\x01\\x12\\x46\\n\\x1b\\x63harging_flap_error_details\\x18Y \\x01(\\x0e\\x32\\x1f.proto.ChargingFlapErrorDetailsH\\x01\\x12I\\n\\x1c\\x63harging_compatibility_error\\x18Z \\x01(\\x0e\\x32!.proto.ChargingCompatibilityErrorH\\x01\\x12N\\n\\x1fhv_battery_precond_availability\\x18[ \\x01(\\x0e\\x32#.proto.HvBatteryPrecondAvailabilityH\\x01\\x12O\\n hv_battery_precond_request_state\\x18\\\\ \\x01(\\x0b\\x32#.proto.HvBatteryPrecondRequestStateH\\x01\\x12@\\n\\x18hv_battery_precond_state\\x18] \\x01(\\x0b\\x32\\x1c.proto.HvBatteryPrecondStateH\\x01\\x12\\x38\\n\\x14\\x61mg_stage_mode_state\\x18^ \\x01(\\x0e\\x32\\x18.proto.AmgStageModeStateH\\x01\\x12\\x38\\n\\x14\\x61mg_stage_mode_error\\x18_ \\x01(\\x0b\\x32\\x18.proto.AmgStageModeErrorH\\x01\"\\x87\\x01\\n\\x19\\x43ombustionConsumptionUnit\\x12+\\n\\'UNSPECIFIED_COMBUSTION_CONSUMPTION_UNIT\\x10\\x00\\x12\\x13\\n\\x0fLITER_PER_100KM\\x10\\x01\\x12\\x10\\n\\x0cKM_PER_LITER\\x10\\x02\\x12\\n\\n\\x06MPG_UK\\x10\\x03\\x12\\n\\n\\x06MPG_US\\x10\\x04\"\\x99\\x01\\n\\x1a\\x45lectricityConsumptionUnit\\x12,\\n(UNSPECIFIED_ELECTRICITY_CONSUMPTION_UNIT\\x10\\x00\\x12\\x11\\n\\rKWH_PER_100KM\\x10\\x01\\x12\\x0e\\n\\nKM_PER_KWH\\x10\\x02\\x12\\x11\\n\\rKWH_PER_100MI\\x10\\x03\\x12\\r\\n\\tM_PER_KWH\\x10\\x04\\x12\\x08\\n\\x04MPGE\\x10\\x05\"i\\n\\x12GasConsumptionUnit\\x12$\\n UNSPECIFIED_GAS_CONSUMPTION_UNIT\\x10\\x00\\x12\\x10\\n\\x0cKG_PER_100KM\\x10\\x01\\x12\\r\\n\\tKM_PER_KG\\x10\\x02\\x12\\x0c\\n\\x08M_PER_KG\\x10\\x03\"W\\n\\x11SpeedDistanceUnit\\x12#\\n\\x1fUNSPECIFIED_SPEED_DISTANCE_UNIT\\x10\\x00\\x12\\x0c\\n\\x08KM_PER_H\\x10\\x01\\x12\\x0b\\n\\x07M_PER_H\\x10\\x02\\x1a\\x02\\x18\\x01\"H\\n\\tSpeedUnit\\x12\\x1a\\n\\x16UNSPECIFIED_SPEED_UNIT\\x10\\x00\\x12\\x0f\\n\\x0bKM_PER_HOUR\\x10\\x01\\x12\\x0e\\n\\nM_PER_HOUR\\x10\\x02\"H\\n\\x0c\\x44istanceUnit\\x12\\x1d\\n\\x19UNSPECIFIED_DISTANCE_UNIT\\x10\\x00\\x12\\x0e\\n\\nKILOMETERS\\x10\\x01\\x12\\t\\n\\x05MILES\\x10\\x02\"P\\n\\x0fTemperatureUnit\\x12 \\n\\x1cUNSPECIFIED_TEMPERATURE_UNIT\\x10\\x00\\x12\\x0b\\n\\x07\\x43\\x45LSIUS\\x10\\x01\\x12\\x0e\\n\\nFAHRENHEIT\\x10\\x02\"H\\n\\x0cPressureUnit\\x12\\x1d\\n\\x19UNSPECIFIED_PRESSURE_UNIT\\x10\\x00\\x12\\x07\\n\\x03KPA\\x10\\x01\\x12\\x07\\n\\x03\\x42\\x41R\\x10\\x02\\x12\\x07\\n\\x03PSI\\x10\\x03\"4\\n\\tRatioUnit\\x12\\x1a\\n\\x16UNSPECIFIED_RATIO_UNIT\\x10\\x00\\x12\\x0b\\n\\x07PERCENT\\x10\\x01\"D\\n\\rClockHourUnit\\x12\\x1f\\n\\x1bUNSPECIFIED_CLOCK_HOUR_UNIT\\x10\\x00\\x12\\x08\\n\\x04T12H\\x10\\x01\\x12\\x08\\n\\x04T24H\\x10\\x02\"\\x9e\\x01\\n\"TcuConnectionStateLowChannelStatus\\x12 \\n\\x1cUNKNOWN_TCU_CONNECTION_STATE\\x10\\x00\\x12\\x17\\n\\x13INITIALLY_CONNECTED\\x10\\x01\\x12\\x0f\\n\\x0bRECONNECTED\\x10\\x02\\x12\\x10\\n\\x0c\\x44ISCONNECTED\\x10\\x03\\x12\\x1a\\n\\x16UNPLANNED_DISCONNECTED\\x10\\x04\"\\xef\\x02\\n\\x1b\\x43hargingCouplerErrorDetails\\x12:\\n6CHARING_COUPLER_ERROR_DETAILS_NO_INFO_OR_ERROR_MESSAGE\\x10\\x00\\x12\\x42\\n>CHARING_COUPLER_ERROR_DETAILS_RELIEVE_CHARGE_COUPLER_AND_RETRY\\x10\\x01\\x12N\\nJCHARING_COUPLER_ERROR_DETAILS_CONTACT_SERVICE_HOTLINE_FOR_EMERGENCY_UNLOCK\\x10\\x02\\x12\\x42\\n>CHARING_COUPLER_ERROR_DETAILS_UNPLUG_AND_REPLUG_CHARGE_COUPLER\\x10\\x03\\x12<\\n8CHARING_COUPLER_ERROR_DETAILS_CHARGE_COUPLER_LOCK_DEFECT\\x10\\x04\"\\xa7\\x01\\n#ChargingErrorImpossibleChangeTo400V\\x12\\x34\\n0CHARGING_ERROR_IMPOSSIBLE_CHANGE_TO_400V_NO_INFO\\x10\\x00\\x12J\\nFCHARGING_ERROR_IMPOSSIBLE_CHANGE_TO_400V_400V_IMPOSSIBLE_STUCK_TO_800V\\x10\\x01\"\\xa7\\x01\\n#ChargingErrorImpossibleChangeTo800V\\x12\\x34\\n0CHARGING_ERROR_IMPOSSIBLE_CHANGE_TO_800V_NO_INFO\\x10\\x00\\x12J\\nFCHARGING_ERROR_IMPOSSIBLE_CHANGE_TO_800V_800V_IMPOSSIBLE_STUCK_TO_400V\\x10\\x01\"\\x9e\\x01\\n!ChargingErrorVehicleNoSupport400V\\x12\\x32\\n.CHARGING_ERROR_VEHICLE_NO_SUPPORT_400V_NO_INFO\\x10\\x00\\x12\\x45\\nACHARGING_ERROR_VEHICLE_NO_SUPPORT_400V_400V_CHARGING_NOT_POSSIBLE\\x10\\x01\\x42\\x0e\\n\\x0c\\x64isplay_unitB\\x10\\n\\x0e\\x61ttribute_type\"\\xa8\\x01\\n\\x11\\x41mgStageModeError\\x12\\x14\\n\\x0crear_spoiler\\x18\\x01 \\x01(\\x08\\x12\\x10\\n\\x08\\x62ow_wave\\x18\\x02 \\x01(\\x08\\x12\\x10\\n\\x08\\x64iffuser\\x18\\x03 \\x01(\\x08\\x12\\r\\n\\x05light\\x18\\x04 \\x01(\\x08\\x12\\x0e\\n\\x06mirror\\x18\\x05 \\x01(\\x08\\x12\\r\\n\\x05sound\\x18\\x06 \\x01(\\x08\\x12\\x1a\\n\\x12\\x61ir_control_system\\x18\\x07 \\x01(\\x08\\x12\\x0f\\n\\x07venturi\\x18\\x08 \\x01(\\x08\"e\\n\\x1bKeylineActivationStateValue\\x12-\\n\\x05state\\x18\\x01 \\x01(\\x0e\\x32\\x1e.proto.KeylineActivationStates\\x12\\x17\\n\\x0f\\x61\\x63tive_keylines\\x18\\x02 \\x03(\\x03\"6\\n\\x16NextDepartureTimeValue\\x12\\x0c\\n\\x04hour\\x18\\x01 \\x01(\\x03\\x12\\x0e\\n\\x06minute\\x18\\x02 \\x01(\\x03\"\\x8d\\x01\\n\\x17RemoteUpdateStartStatus\\x12\\x1e\\n\\x16\\x64uration_after_runtime\\x18\\x01 \\x01(\\x05\\x12\\x12\\n\\npackage_id\\x18\\x02 \\x01(\\t\\x12*\\n\\rupdate_status\\x18\\x03 \\x01(\\x0e\\x32\\x13.proto.UpdateStatus\\x12\\x12\\n\\nrelease_id\\x18\\x04 \\x01(\\t\"\\xf0\\x15\\n\\x16\\x43hargingScheduleActive\\x12\"\\n\\x16schedule_id_deprecated\\x18\\x01 \\x01(\\x03\\x42\\x02\\x18\\x01\\x12\\x61\\n\\x16use_case_id_deprecated\\x18\\x02 \\x01(\\x0e\\x32=.proto.ChargingScheduleActive.ChargingScheduleActiveUseCaseIdB\\x02\\x18\\x01\\x12.\\n\\nstart_time\\x18\\x03 \\x01(\\x0b\\x32\\x1a.google.protobuf.Timestamp\\x12U\\n\\x0coffline_mode\\x18\\x04 \\x01(\\x0e\\x32?.proto.ChargingScheduleActive.ChargingScheduleActiveOfflineMode\\x12N\\n\\x08schedule\\x18\\x05 \\x03(\\x0b\\x32<.proto.ChargingScheduleActive.ChargingScheduleActiveSchedule\\x12\\x35\\n\\x0buse_case_id\\x18\\x06 \\x01(\\x0e\\x32 .proto.ChargingScheduleUseCaseId\\x12\\x33\\n\\x12schedule_id_status\\x18\\x07 \\x01(\\x0e\\x32\\x17.proto.ScheduleIdStatus\\x1aO\\n\\x1e\\x43hargingScheduleActiveSchedule\\x12\\x14\\n\\x0cpower_values\\x18\\x01 \\x01(\\x01\\x12\\x17\\n\\x0f\\x64uration_values\\x18\\x02 \\x01(\\x03\"\\x84\\x10\\n\\x1f\\x43hargingScheduleActiveUseCaseId\\x12\\x37\\n3CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_SMART_CHARGING\\x10\\x00\\x12\\x46\\nBCHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_MERCEDES_INTELLIGENT_CHARGING\\x10\\x01\\x12@\\n<CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_BETA_COMMUNITY_CHARGING\\x10\\x02\\x12\\x37\\n3CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_SOLAR_CHARGING\\x10\\n\\x12\\x37\\n3CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_GREEN_CHARGING\\x10\\x0b\\x12;\\n7CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_EFFICIENT_CHARGING\\x10\\x0c\\x12>\\n:CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_ECO_FRIENDLY_CHARGING\\x10\\r\\x12=\\n9CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_SUSTAINABLE_CHARGING\\x10\\x0e\\x12=\\n9CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_INTELLIGENT_CHARGING\\x10\\x0f\\x12@\\n<CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_WORKPLACE_CHARGING_PLAN\\x10\\x10\\x12;\\n7CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_HOME_CHARGING_PLAN\\x10\\x11\\x12?\\n;CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_FLEET_MANAGED_CHARGING\\x10\\x12\\x12\\x41\\n=CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_PRICE_OPTIMIZED_CHARGING\\x10\\x13\\x12\\x42\\n>CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_BATTERY_FRIENDLY_CHARGING\\x10\\x14\\x12J\\nFCHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_EXTERNAL_NOISE_OPTIMIZED_CHARGING\\x10\\x15\\x12J\\nFCHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_VIDEO_WATCHING_OPTIMIZED_CHARGING\\x10\\x16\\x12\\x41\\n=CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_TIME_CONTROLLED_CHARGING\\x10\\x17\\x12>\\n:CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_PEAK_SHAVING_CHARGING\\x10\\x18\\x12G\\nCCHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_DYNAMIC_LOAD_BALANCED_CHARGING\\x10\\x19\\x12\\x43\\n?CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_BUSINESS_SPECIFIC_CHARGING\\x10\\x1a\\x12\\x41\\n=CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_PREFERRED_CHARGING_TIMES\\x10\\x1b\\x12.\\n*CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_ENPAL\\x10\\x64\\x12/\\n+CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_TIBBER\\x10\\x65\\x12;\\n7CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_THE_MOBILITY_HOUSE\\x10\\x66\\x12\\x30\\n,CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_AWATTAR\\x10g\\x12\\x30\\n,CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_TRONITY\\x10h\\x12-\\n(CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_DPD\\x10\\xc8\\x01\\x12\\x37\\n2CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_DEUTSCHE_POST\\x10\\xc9\\x01\\x12\\x33\\n.CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_HACKATHON\\x10\\xfa\\x01\\x12\\x36\\n1CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_SANDBOX_MODE\\x10\\xfb\\x01\\x12\\x38\\n3CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_DEVELOPER_MODE\\x10\\xfc\\x01\\x12\\x33\\n.CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_TEST_MODE\\x10\\xfd\\x01\\x12\\x34\\n/CHARGING_SCHEDULE_ACTIVE_USE_CASE_ID_DEBUG_MODE\\x10\\xfe\\x01\\x1a\\x02\\x18\\x01\"\\xb3\\x01\\n!ChargingScheduleActiveOfflineMode\\x12\\x31\\n-CHARGING_SCHEDULE_ACTIVE_OFFLINE_MODE_UNKNOWN\\x10\\x00\\x12-\\n)CHARGING_SCHEDULE_ACTIVE_OFFLINE_MODE_OFF\\x10\\x01\\x12,\\n(CHARGING_SCHEDULE_ACTIVE_OFFLINE_MODE_ON\\x10\\x02\"\\x8f\\x01\\n\\x15HvBatteryPrecondState\\x12\\x37\\n\\x08\\x63harging\\x18\\x01 \\x01(\\x0e\\x32%.proto.HvBatteryPrecondStatesCharging\\x12=\\n\\x0b\\x64ischarging\\x18\\x02 \\x01(\\x0e\\x32(.proto.HvBatteryPrecondStatesDischarging\"\\xe6\\x01\\n\\x1cHvBatteryPrecondRequestState\\x12*\\n\\rmain_category\\x18\\x01 \\x01(\\x0e\\x32\\x13.proto.MainCategory\\x12(\\n\\x0csub_category\\x18\\x02 \\x01(\\x0e\\x32\\x12.proto.SubCategory\\x12\\x32\\n\\x11specific_category\\x18\\x03 \\x01(\\x0e\\x32\\x17.proto.SpecificCategory\\x12\\x1d\\n\\x06method\\x18\\x04 \\x01(\\x0e\\x32\\r.proto.Method\\x12\\x1d\\n\\x06status\\x18\\x05 \\x01(\\x0e\\x32\\r.proto.Status\"\\xd1\\x03\\n\\x17PrecondOperabilityState\\x12\\x19\\n\\x11precond_available\\x18\\x01 \\x01(\\x08\\x12M\\n\\x13precond_error_state\\x18\\x02 \\x01(\\x0e\\x32\\x30.proto.PrecondOperabilityState.PrecondErrorState\"\\xcb\\x02\\n\\x11PrecondErrorState\\x12 \\n\\x1cPRECOND_ERROR_STATE_NO_ERROR\\x10\\x00\\x12\\'\\n#PRECOND_ERROR_STATE_PLAY_PROTECTION\\x10\\x01\\x12\\x32\\n.PRECOND_ERROR_STATE_NO_ENERGY_BUDGET_AVAILABLE\\x10\\x02\\x12\"\\n\\x1ePRECOND_ERROR_STATE_LOW_BUDGET\\x10\\x03\\x12,\\n(PRECOND_ERROR_STATE_SYSTEM_NOT_AVAILABLE\\x10\\x04\\x12/\\n+PRECOND_ERROR_STATE_PRECONDITIONING_ABORTED\\x10\\x05\\x12\\x34\\n0PRECOND_ERROR_STATE_REGULAR_CLIMATIZATION_ACTIVE\\x10\\x06\"\\x9e\\x10\\n\\x19\\x43hargingScheduleRequested\\x12M\\n\\x12schedule_id_status\\x18\\x01 \\x01(\\x0e\\x32\\x31.proto.ChargingScheduleRequested.ScheduleIdStatus\\x12O\\n\\x0buse_case_id\\x18\\x02 \\x01(\\x0e\\x32:.proto.ChargingScheduleRequested.ChargingScheduleUseCaseId\"R\\n\\x10ScheduleIdStatus\\x12\\x1e\\n\\x1aSCHEDULE_ID_STATUS_DELETED\\x10\\x00\\x12\\x1e\\n\\x1aSCHEDULE_ID_STATUS_INITIAL\\x10\\x01\"\\x8c\\x0e\\n\\x19\\x43hargingScheduleUseCaseId\\x12\\x30\\n,CHARGING_SCHEDULE_USE_CASE_ID_SMART_CHARGING\\x10\\x00\\x12?\\n;CHARGING_SCHEDULE_USE_CASE_ID_MERCEDES_INTELLIGENT_CHARGING\\x10\\x01\\x12\\x39\\n5CHARGING_SCHEDULE_USE_CASE_ID_BETA_COMMUNITY_CHARGING\\x10\\x02\\x12\\x30\\n,CHARGING_SCHEDULE_USE_CASE_ID_SOLAR_CHARGING\\x10\\x03\\x12\\x30\\n,CHARGING_SCHEDULE_USE_CASE_ID_GREEN_CHARGING\\x10\\x04\\x12\\x34\\n0CHARGING_SCHEDULE_USE_CASE_ID_EFFICIENT_CHARGING\\x10\\x05\\x12\\x37\\n3CHARGING_SCHEDULE_USE_CASE_ID_ECO_FRIENDLY_CHARGING\\x10\\x06\\x12\\x36\\n2CHARGING_SCHEDULE_USE_CASE_ID_SUSTAINABLE_CHARGING\\x10\\x07\\x12\\x36\\n2CHARGING_SCHEDULE_USE_CASE_ID_INTELLIGENT_CHARGING\\x10\\x08\\x12\\x39\\n5CHARGING_SCHEDULE_USE_CASE_ID_WORKPLACE_CHARGING_PLAN\\x10\\t\\x12\\x34\\n0CHARGING_SCHEDULE_USE_CASE_ID_HOME_CHARGING_PLAN\\x10\\n\\x12\\x38\\n4CHARGING_SCHEDULE_USE_CASE_ID_FLEET_MANAGED_CHARGING\\x10\\x0b\\x12:\\n6CHARGING_SCHEDULE_USE_CASE_ID_PRICE_OPTIMIZED_CHARGING\\x10\\x0c\\x12;\\n7CHARGING_SCHEDULE_USE_CASE_ID_BATTERY_FRIENDLY_CHARGING\\x10\\r\\x12\\x43\\n?CHARGING_SCHEDULE_USE_CASE_ID_EXTERNAL_NOISE_OPTIMIZED_CHARGING\\x10\\x0e\\x12\\x43\\n?CHARGING_SCHEDULE_USE_CASE_ID_VIDEO_WATCHING_OPTIMIZED_CHARGING\\x10\\x0f\\x12:\\n6CHARGING_SCHEDULE_USE_CASE_ID_TIME_CONTROLLED_CHARGING\\x10\\x10\\x12\\x37\\n3CHARGING_SCHEDULE_USE_CASE_ID_PEAK_SHAVING_CHARGING\\x10\\x11\\x12@\\n<CHARGING_SCHEDULE_USE_CASE_ID_DYNAMIC_LOAD_BALANCED_CHARGING\\x10\\x12\\x12<\\n8CHARGING_SCHEDULE_USE_CASE_ID_BUSINESS_SPECIFIC_CHARGING\\x10\\x13\\x12:\\n6CHARGING_SCHEDULE_USE_CASE_ID_PREFERRED_CHARGING_TIMES\\x10\\x14\\x12\\'\\n#CHARGING_SCHEDULE_USE_CASE_ID_ENPAL\\x10\\x15\\x12(\\n$CHARGING_SCHEDULE_USE_CASE_ID_TIBBER\\x10\\x16\\x12\\x34\\n0CHARGING_SCHEDULE_USE_CASE_ID_THE_MOBILITY_HOUSE\\x10\\x17\\x12)\\n%CHARGING_SCHEDULE_USE_CASE_ID_AWATTAR\\x10\\x18\\x12)\\n%CHARGING_SCHEDULE_USE_CASE_ID_TRONITY\\x10\\x19\\x12%\\n!CHARGING_SCHEDULE_USE_CASE_ID_DPD\\x10\\x1a\\x12/\\n+CHARGING_SCHEDULE_USE_CASE_ID_DEUTSCHE_POST\\x10\\x1b\\x12+\\n\\'CHARGING_SCHEDULE_USE_CASE_ID_HACKATHON\\x10\\x1c\\x12.\\n*CHARGING_SCHEDULE_USE_CASE_ID_SANDBOX_MODE\\x10\\x1d\\x12\\x30\\n,CHARGING_SCHEDULE_USE_CASE_ID_DEVELOPER_MODE\\x10\\x1e\\x12+\\n\\'CHARGING_SCHEDULE_USE_CASE_ID_TEST_MODE\\x10\\x1f\\x12,\\n(CHARGING_SCHEDULE_USE_CASE_ID_DEBUG_MODE\\x10 \";\\n\\rChargingTimer\\x12*\\n\\x07\\x65ntries\\x18\\x01 \\x03(\\x0b\\x32\\x19.proto.ChargingTimerEntry\"\\x8d\\x03\\n\\x12\\x43hargingTimerEntry\\x12\\x0f\\n\\x07timerId\\x18\\x01 \\x01(\\x03\\x12=\\n\\x06\\x61\\x63tion\\x18\\x02 \\x01(\\x0e\\x32-.proto.ChargingTimerEntry.ChargingTimerAction\\x12\\x17\\n\\x0fstart_time_hour\\x18\\x03 \\x01(\\x05\\x12\\x16\\n\\x0estart_time_min\\x18\\x04 \\x01(\\x05\\x12\\x15\\n\\rend_time_hour\\x18\\x05 \\x01(\\x05\\x12\\x14\\n\\x0c\\x65nd_time_min\\x18\\x06 \\x01(\\x05\\x12\"\\n\\x03\\x64\\x61y\\x18\\x07 \\x03(\\x0e\\x32\\x15.proto.TimeProfileDay\"\\xa4\\x01\\n\\x13\\x43hargingTimerAction\\x12!\\n\\x1d\\x43HARGING_TIMER_ACTION_UNKNOWN\\x10\\x00\\x12%\\n!CHARGING_TIMER_ACTION_DEACTIVATED\\x10\\x01\\x12 \\n\\x1c\\x43HARGING_TIMER_ACTION_ACTIVE\\x10\\x02\\x12!\\n\\x1d\\x43HARGING_TIMER_ACTION_DELETED\\x10\\x03\"z\\n\\x15\\x43hargingPredictionSoc\\x12\\x36\\n\\x12predicted_end_time\\x18\\x01 \\x01(\\x0b\\x32\\x1a.google.protobuf.Timestamp\\x12)\\n!predicted_electrical_energy_range\\x18\\x02 \\x01(\\x03\"c\\n\\x1f\\x43hargingPredictionDepartureTime\\x12\\x15\\n\\rpredicted_soc\\x18\\x01 \\x01(\\x05\\x12)\\n!predicted_electrical_energy_range\\x18\\x02 \\x01(\\x03\"\\x95\\x05\\n\\x11\\x43hargeInletsEntry\\x12\\n\\n\\x02id\\x18\\x01 \\x01(\\x03\\x12H\\n\\rcoupler_state\\x18\\x02 \\x01(\\x0e\\x32\\x31.proto.ChargeInletsEntry.ChargeInletsCouplerState\\x12\\x42\\n\\nlock_state\\x18\\x03 \\x01(\\x0e\\x32..proto.ChargeInletsEntry.ChargeInletsLockState\"\\xfa\\x01\\n\\x18\\x43hargeInletsCouplerState\\x12\\'\\n#CHARGE_INLETS_COUPLER_STATE_UNKNOWN\\x10\\x00\\x12\\'\\n#CHARGE_INLETS_COUPLER_STATE_PLUGGED\\x10\\x01\\x12/\\n+CHARGE_INLETS_COUPLER_STATE_VEHICLE_PLUGGED\\x10\\x02\\x12\\x33\\n/CHARGE_INLETS_COUPLER_STATE_VEHICLE_NOT_PLUGGED\\x10\\x03\\x12&\\n\"CHARGE_INLETS_COUPLER_STATE_DEFECT\\x10\\x04\"\\xe8\\x01\\n\\x15\\x43hargeInletsLockState\\x12$\\n CHARGE_INLETS_LOCK_STATE_UNKNOWN\\x10\\x00\\x12%\\n!CHARGE_INLETS_LOCK_STATE_UNLOCKED\\x10\\x01\\x12#\\n\\x1f\\x43HARGE_INLETS_LOCK_STATE_LOCKED\\x10\\x02\\x12\\x31\\n-CHARGE_INLETS_LOCK_STATE_LOCK_STATE_NOT_CLEAR\\x10\\x03\\x12*\\n&CHARGE_INLETS_LOCK_STATE_NOT_AVAILABLE\\x10\\x04\"9\\n\\x0c\\x43hargeInlets\\x12)\\n\\x07\\x65ntries\\x18\\x01 \\x03(\\x0b\\x32\\x18.proto.ChargeInletsEntry\"W\\n\\x10\\x43hargeFlapsEntry\\x12\\n\\n\\x02id\\x18\\x01 \\x01(\\x03\\x12\\x37\\n\\x0eposition_state\\x18\\x02 \\x01(\\x0e\\x32\\x1f.proto.ChargeFlapsPositionState\"7\\n\\x0b\\x43hargeFlaps\\x12(\\n\\x07\\x65ntries\\x18\\x01 \\x03(\\x0b\\x32\\x17.proto.ChargeFlapsEntry\"`\\n\\x19\\x43hargingPowerRestrictions\\x12\\x43\\n\\x1a\\x63harging_power_restriction\\x18\\x01 \\x03(\\x0e\\x32\\x1f.proto.ChargingPowerRestriction\"k\\n\\x1c\\x43hargingBreakClockTimerValue\\x12K\\n\\x1e\\x63hargingbreak_clocktimer_entry\\x18\\x01 \\x03(\\x0b\\x32#.proto.ChargingBreakClockTimerEntry\"\\x81\\x01\\n\\x0cPrecondState\\x12\\x18\\n\\x10\\x61\\x63tivation_state\\x18\\x01 \\x01(\\x08\\x12!\\n\\x19precond_immediate_support\\x18\\x02 \\x01(\\x08\\x12\\x34\\n\\x13precond_state_types\\x18\\x03 \\x03(\\x0e\\x32\\x17.proto.PrecondStateType\"\\xb3\\x02\\n\\x14\\x43hargingPowerControl\\x12P\\n\\rcharge_status\\x18\\x01 \\x01(\\x0e\\x32\\x39.proto.ChargingPowerControl.ChargingStatusForPowerControl\\x12\\x15\\n\\rctrl_duration\\x18\\x02 \\x01(\\x05\\x12\\x11\\n\\tctrl_info\\x18\\x03 \\x01(\\x05\\x12\\x14\\n\\x0c\\x63harge_power\\x18\\x04 \\x01(\\x05\\x12\\x11\\n\\tserv_stat\\x18\\x05 \\x01(\\x05\\x12\\x12\\n\\nserv_avail\\x18\\x06 \\x01(\\x05\\x12\\x10\\n\\x08use_case\\x18\\x07 \\x01(\\x05\"P\\n\\x1d\\x43hargingStatusForPowerControl\\x12\\x0f\\n\\x0bNOT_DEFINED\\x10\\x00\\x12\\x0f\\n\\x0b\\x44\\x45\\x41\\x43TIVATED\\x10\\x01\\x12\\r\\n\\tACTIVATED\\x10\\x02\"\\xc6\\x01\\n\\x1c\\x43hargingBreakClockTimerEntry\\x12\\x39\\n\\x06status\\x18\\x01 \\x01(\\x0e\\x32).proto.ChargingBreakClockTimerEntryStatus\\x12\\x13\\n\\x0b\\x65ndTimeHour\\x18\\x02 \\x01(\\x05\\x12\\x15\\n\\rendTimeMinute\\x18\\x03 \\x01(\\x05\\x12\\x15\\n\\rstartTimeHour\\x18\\x04 \\x01(\\x05\\x12\\x17\\n\\x0fstartTimeMinute\\x18\\x05 \\x01(\\x05\\x12\\x0f\\n\\x07timerId\\x18\\x06 \\x01(\\x05\"X\\n\\x13\\x43hargeProgramsValue\\x12\\x41\\n\\x19\\x63harge_program_parameters\\x18\\x01 \\x03(\\x0b\\x32\\x1e.proto.ChargeProgramParameters\"\\xe4\\x02\\n\\x17\\x43hargeProgramParameters\\x12;\\n\\x0e\\x63harge_program\\x18\\x01 \\x01(\\x0e\\x32\\x14.proto.ChargeProgramR\\rchargeprogram\\x12\\x17\\n\\x07max_soc\\x18\\x02 \\x01(\\x05R\\x06maxSoc\\x12\\x1f\\n\\x0b\\x61uto_unlock\\x18\\x03 \\x01(\\x08R\\nautounlock\\x12\\x36\\n\\x17location_based_charging\\x18\\x04 \\x01(\\x08R\\x15locationbasedcharging\\x12%\\n\\x0eweekly_profile\\x18\\x05 \\x01(\\x08R\\rweeklyprofile\\x12\\x1e\\n\\nclockTimer\\x18\\x06 \\x01(\\x08R\\nclockTimer\\x12\\x30\\n\\x14max_charging_current\\x18\\x07 \\x01(\\x05R\\x12MaxChargingCurrent\\x12!\\n\\x0c\\x65\\x63o_charging\\x18\\x08 \\x01(\\x08R\\x0b\\x45\\x63oCharging\"\\xcd\\x03\\n\\x12WeeklyProfileValue\\x12T\\n\\'single_time_profile_entries_activatable\\x18\\x01 \\x01(\\x08R#singleTimeProfileEntriesActivatable\\x12R\\n\\'max_number_of_weekly_time_profile_slots\\x18\\x02 \\x01(\\x05R!maxNumberOfWeeklyTimeProfileSlots\\x12<\\n\\x1bmax_number_of_time_profiles\\x18\\x03 \\x01(\\x05R\\x17maxNumberOfTimeProfiles\\x12M\\n$current_number_of_time_profile_slots\\x18\\x04 \\x01(\\x05R\\x1f\\x63urrentNumberOfTimeProfileSlots\\x12\\x44\\n\\x1f\\x63urrent_number_of_time_profiles\\x18\\x05 \\x01(\\x05R\\x1b\\x63urrentNumberOfTimeProfiles\\x12:\\n\\rtime_profiles\\x18\\x06 \\x03(\\x0b\\x32\\x15.proto.VVRTimeProfileR\\x0ctimeProfiles\"\\xc2\\x01\\n\\x0eVVRTimeProfile\\x12\\x16\\n\\nidentifier\\x18\\x01 \\x01(\\x05R\\x02id\\x12\\x12\\n\\x04hour\\x18\\x02 \\x01(\\x05R\\x04hour\\x12\\x13\\n\\x06minute\\x18\\x03 \\x01(\\x05R\\x03min\\x12(\\n\\x04\\x64\\x61ys\\x18\\x04 \\x03(\\x0e\\x32\\x15.proto.TimeProfileDayR\\x03\\x64\\x61y\\x12\\x16\\n\\x06\\x61\\x63tive\\x18\\x05 \\x01(\\x08R\\x06\\x61\\x63tive\\x12-\\n\\x16\\x61pplication_identifier\\x18\\x06 \\x01(\\x05R\\rapplicationId\"G\\n\\x11\\x45\\x63oHistogramValue\\x12\\x32\\n\\x12\\x65\\x63o_histogram_bins\\x18\\x01 \\x03(\\x0b\\x32\\x16.proto.EcoHistogramBin\"2\\n\\x0f\\x45\\x63oHistogramBin\\x12\\x10\\n\\x08interval\\x18\\x01 \\x01(\\x01\\x12\\r\\n\\x05value\\x18\\x02 \\x01(\\x01\"b\\n\\x1cSpeedAlertConfigurationValue\\x12\\x42\\n\\x1aspeed_alert_configurations\\x18\\x01 \\x03(\\x0b\\x32\\x1e.proto.SpeedAlertConfiguration\"p\\n\\x17SpeedAlertConfiguration\\x12\\x1a\\n\\x12\\x65nd_timestamp_in_s\\x18\\x01 \\x01(\\x03\\x12\\x18\\n\\x10threshold_in_kph\\x18\\x02 \\x01(\\x05\\x12\\x1f\\n\\x17threshold_display_value\\x18\\x03 \\x01(\\t\"L\\n\\x1bWeeklySettingsHeadUnitValue\\x12-\\n\\x0fweekly_settings\\x18\\x01 \\x03(\\x0b\\x32\\x14.proto.WeeklySetting\"<\\n\\rWeeklySetting\\x12\\x0b\\n\\x03\\x64\\x61y\\x18\\x01 \\x01(\\x05\\x12\\x1e\\n\\x16minutes_since_midnight\\x18\\x02 \\x01(\\x05\"M\\n\\x16TemperaturePointsValue\\x12\\x33\\n\\x12temperature_points\\x18\\x01 \\x03(\\x0b\\x32\\x17.proto.TemperaturePoint\"X\\n\\x10TemperaturePoint\\x12\\x0c\\n\\x04zone\\x18\\x01 \\x01(\\t\\x12\\x13\\n\\x0btemperature\\x18\\x02 \\x01(\\x01\\x12!\\n\\x19temperature_display_value\\x18\\x03 \\x01(\\t\"4\\n\\x12WeekdayTariffValue\\x12\\x1e\\n\\x07tariffs\\x18\\x01 \\x03(\\x0b\\x32\\r.proto.Tariff\"4\\n\\x12WeekendTariffValue\\x12\\x1e\\n\\x07tariffs\\x18\\x01 \\x03(\\x0b\\x32\\r.proto.Tariff\"$\\n\\x06Tariff\\x12\\x0c\\n\\x04rate\\x18\\x01 \\x01(\\x05\\x12\\x0c\\n\\x04time\\x18\\x02 \\x01(\\x05\"K\\n\\x19StateOfChargeProfileValue\\x12.\\n\\x10states_of_charge\\x18\\x01 \\x03(\\x0b\\x32\\x14.proto.StateOfCharge\"@\\n\\rStateOfCharge\\x12\\x16\\n\\x0etimestamp_in_s\\x18\\x01 \\x01(\\x03\\x12\\x17\\n\\x0fstate_of_charge\\x18\\x02 \\x01(\\x05\"\\xa2\\x01\\n\\x0fVEPUpdatesByVIN\\x12\\x17\\n\\x0fsequence_number\\x18\\x02 \\x01(\\x05\\x12\\x34\\n\\x07updates\\x18\\x01 \\x03(\\x0b\\x32#.proto.VEPUpdatesByVIN.UpdatesEntry\\x1a@\\n\\x0cUpdatesEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\t\\x12\\x1f\\n\\x05value\\x18\\x02 \\x01(\\x0b\\x32\\x10.proto.VEPUpdate:\\x02\\x38\\x01\"\\x1f\\n\\x0c\\x44\\x65\\x62ugMessage\\x12\\x0f\\n\\x07message\\x18\\x01 \\x01(\\t\"\\xa8\\x01\\n\\rVehicleStatus\\x12\\x0b\\n\\x03vin\\x18\\x01 \\x01(\\t\\x12\\x38\\n\\nattributes\\x18\\x02 \\x03(\\x0b\\x32$.proto.VehicleStatus.AttributesEntry\\x1aP\\n\\x0f\\x41ttributesEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\t\\x12,\\n\\x05value\\x18\\x02 \\x01(\\x0b\\x32\\x1d.proto.VehicleAttributeStatus:\\x02\\x38\\x01\"\\xee\\x07\\n\\x0bPushMessage\\x12\\x13\\n\\x0btracking_id\\x18\\x05 \\x01(\\t\\x12%\\n\\tvepUpdate\\x18\\x01 \\x01(\\x0b\\x32\\x10.proto.VEPUpdateH\\x00\\x12,\\n\\nvepUpdates\\x18\\x02 \\x01(\\x0b\\x32\\x16.proto.VEPUpdatesByVINH\\x00\\x12+\\n\\x0c\\x64\\x65\\x62ugMessage\\x18\\x03 \\x01(\\x0b\\x32\\x13.proto.DebugMessageH\\x00\\x12\\x42\\n\\x16service_status_updates\\x18\\t \\x01(\\x0b\\x32 .proto.ServiceStatusUpdatesByVINH\\x00\\x12;\\n\\x15service_status_update\\x18\\r \\x01(\\x0b\\x32\\x1a.proto.ServiceStatusUpdateH\\x00\\x12\\x31\\n\\x10user_data_update\\x18\\n \\x01(\\x0b\\x32\\x15.proto.UserDataUpdateH\\x00\\x12O\\n user_vehicle_auth_changed_update\\x18\\x0e \\x01(\\x0b\\x32#.proto.UserVehicleAuthChangedUpdateH\\x00\\x12\\x37\\n\\x13user_picture_update\\x18\\x0b \\x01(\\x0b\\x32\\x18.proto.UserPictureUpdateH\\x00\\x12/\\n\\x0fuser_pin_update\\x18\\x0c \\x01(\\x0b\\x32\\x14.proto.UserPINUpdateH\\x00\\x12\\x30\\n\\x0fvehicle_updated\\x18\\x0f \\x01(\\x0b\\x32\\x15.proto.VehicleUpdatedH\\x00\\x12?\\n\\x17preferred_dealer_change\\x18\\x10 \\x01(\\x0b\\x32\\x1c.proto.PreferredDealerChangeH\\x00\\x12X\\n%apptwin_command_status_updates_by_vin\\x18\\x11 \\x01(\\x0b\\x32\\'.proto.AppTwinCommandStatusUpdatesByVINH\\x00\\x12O\\n\\x1f\\x61pptwin_pending_command_request\\x18\\x12 \\x01(\\x0b\\x32$.proto.AppTwinPendingCommandsRequestH\\x00\\x12\\x34\\n\\x11\\x61ssigned_vehicles\\x18\\x13 \\x01(\\x0b\\x32\\x17.proto.AssignedVehiclesH\\x00\\x12\\x33\\n\\x11\\x64\\x61ta_change_event\\x18\\x15 \\x01(\\x0b\\x32\\x16.proto.DataChangeEventH\\x00\\x12=\\n\\x16vehicle_status_updates\\x18\\x18 \\x01(\\x0b\\x32\\x1b.proto.VehicleStatusUpdatesH\\x00\\x42\\x05\\n\\x03msgJ\\x04\\x08\\x07\\x10\\x08J\\x04\\x08\\x08\\x10\\t\"\\xc4\\x01\\n\\rTrackingEvent\\x12\\x13\\n\\x0btracking_id\\x18\\x01 \\x01(\\t\\x12\\x11\\n\\ttimestamp\\x18\\x02 \\x01(\\x03\\x12\\x12\\n\\nevent_type\\x18\\x03 \\x01(\\t\\x12\\x32\\n\\x07payload\\x18\\x04 \\x03(\\x0b\\x32!.proto.TrackingEvent.PayloadEntry\\x1a\\x43\\n\\x0cPayloadEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\t\\x12\"\\n\\x05value\\x18\\x02 \\x01(\\x0b\\x32\\x13.proto.PayloadValue:\\x02\\x38\\x01\"p\\n\\x0cPayloadValue\\x12\\x16\\n\\x0cstring_value\\x18\\x01 \\x01(\\tH\\x00\\x12\\x13\\n\\tint_value\\x18\\x02 \\x01(\\x05H\\x00\\x12\\x14\\n\\nbool_value\\x18\\x03 \\x01(\\x08H\\x00\\x12\\x16\\n\\x0c\\x64ouble_value\\x18\\x04 \\x01(\\x01H\\x00\\x42\\x05\\n\\x03msg\"4\\n\\x15\\x41\\x63knowledgeVEPRequest\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05:\\x02\\x18\\x01\"5\\n\\x1a\\x41\\x63knowledgeVEPUpdatesByVIN\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\"1\\n\\x15\\x43onfigurePingInterval\\x12\\x18\\n\\x10ping_time_millis\\x18\\x01 \\x01(\\x05\"4\\n\\x19\\x41\\x63knowledgeVehicleUpdated\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\";\\n AcknowledgePreferredDealerChange\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\"e\\n\\x0eVehicleUpdated\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\\x12\\x0f\\n\\x07\\x63iam_id\\x18\\x02 \\x01(\\t\\x12\\x0b\\n\\x03vin\\x18\\x03 \\x01(\\t\\x12\\x1c\\n\\x14\\x65mit_timestamp_in_ms\\x18\\n \\x01(\\x03\"l\\n\\x15PreferredDealerChange\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\\x12\\x0f\\n\\x07\\x63iam_id\\x18\\x02 \\x01(\\t\\x12\\x0b\\n\\x03vin\\x18\\x03 \\x01(\\t\\x12\\x1c\\n\\x14\\x65mit_timestamp_in_ms\\x18\\n \\x01(\\x03\"5\\n\\x1a\\x41\\x63knowledgeDataChangeEvent\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\"\\xf4\\x01\\n\\x06Scopes\\x12\\x1b\\n\\x05scope\\x18\\x01 \\x01(\\x0e\\x32\\x0c.proto.Scope\\x12\\x0e\\n\\x06\\x63iamId\\x18\\x02 \\x01(\\t\\x12\\x0b\\n\\x03vin\\x18\\x03 \\x01(\\t\\x12\\x44\\n\\x14\\x61\\x64\\x64itional_resources\\x18\\x04 \\x03(\\x0b\\x32&.proto.Scopes.AdditionalResourcesEntry\\x12\\x18\\n\\x10resource_ciam_id\\x18\\x05 \\x01(\\t\\x12\\x14\\n\\x0cresource_vin\\x18\\x06 \\x01(\\t\\x1a:\\n\\x18\\x41\\x64\\x64itionalResourcesEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\t\\x12\\r\\n\\x05value\\x18\\x02 \\x01(\\t:\\x02\\x38\\x01\"^\\n\\x0f\\x44\\x61taChangeEvent\\x12\\x1d\\n\\x06scopes\\x18\\x01 \\x03(\\x0b\\x32\\r.proto.Scopes\\x12\\x13\\n\\x0btracking_id\\x18\\x02 \\x01(\\t\\x12\\x17\\n\\x0fsequence_number\\x18\\x03 \\x01(\\x05\"\\xdf\\x01\\n\\x14VehicleStatusUpdates\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x03\\x12U\\n\\x16vehicle_status_updates\\x18\\x02 \\x03(\\x0b\\x32\\x35.proto.VehicleStatusUpdates.VehicleStatusUpdatesEntry\\x1aW\\n\\x19VehicleStatusUpdatesEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\t\\x12)\\n\\x05value\\x18\\x02 \\x01(\\x0b\\x32\\x1a.proto.VehicleStatusUpdate:\\x02\\x38\\x01\":\\n\\x1f\\x41\\x63knowledgeVehicleStatusUpdates\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x03\"d\\n\\x0bVSUMetadata\\x12-\\n\\ttimestamp\\x18\\x01 \\x01(\\x0b\\x32\\x1a.google.protobuf.Timestamp\\x12&\\n\\x06status\\x18\\x02 \\x01(\\x0e\\x32\\x16.proto.AttributeStatus\"D\\n\\rBoolAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x08\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"E\\n\\x0eInt64Attribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x03\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"F\\n\\x0f\\x44oubleAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x01\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"I\\n\\x12TimestampAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x03\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x9e\\x01\\n\\x16Int64DistanceAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x03\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\\x12\\x38\\n\\x04unit\\x18\\x03 \\x01(\\x0e\\x32*.proto.VehicleAttributeStatus.DistanceUnit\\x12\\x15\\n\\rdisplay_value\\x18\\x04 \\x01(\\t\"\\x9f\\x01\\n\\x17\\x44oubleDistanceAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x01\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\\x12\\x38\\n\\x04unit\\x18\\x03 \\x01(\\x0e\\x32*.proto.VehicleAttributeStatus.DistanceUnit\\x12\\x15\\n\\rdisplay_value\\x18\\x04 \\x01(\\t\"\\x9f\\x01\\n\\x17\\x44oublePressureAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x01\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\\x12\\x38\\n\\x04unit\\x18\\x03 \\x01(\\x0e\\x32*.proto.VehicleAttributeStatus.PressureUnit\\x12\\x15\\n\\rdisplay_value\\x18\\x04 \\x01(\\t\"\\x99\\x01\\n\\x14\\x44oubleSpeedAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x01\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\\x12\\x35\\n\\x04unit\\x18\\x03 \\x01(\\x0e\\x32\\'.proto.VehicleAttributeStatus.SpeedUnit\\x12\\x15\\n\\rdisplay_value\\x18\\x04 \\x01(\\t\"\\xb9\\x01\\n$DoubleCombustionConsumptionAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x01\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\\x12\\x45\\n\\x04unit\\x18\\x03 \\x01(\\x0e\\x32\\x37.proto.VehicleAttributeStatus.CombustionConsumptionUnit\\x12\\x15\\n\\rdisplay_value\\x18\\x04 \\x01(\\t\"\\xbb\\x01\\n%DoubleElectricityConsumptionAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x01\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\\x12\\x46\\n\\x04unit\\x18\\x03 \\x01(\\x0e\\x32\\x38.proto.VehicleAttributeStatus.ElectricityConsumptionUnit\\x12\\x15\\n\\rdisplay_value\\x18\\x04 \\x01(\\t\"\\xab\\x01\\n\\x1d\\x44oubleGasConsumptionAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x01\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\\x12>\\n\\x04unit\\x18\\x03 \\x01(\\x0e\\x32\\x30.proto.VehicleAttributeStatus.GasConsumptionUnit\\x12\\x15\\n\\rdisplay_value\\x18\\x04 \\x01(\\t\"\\x98\\x01\\n\\x13Int64RatioAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x03\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\\x12\\x35\\n\\x04unit\\x18\\x03 \\x01(\\x0e\\x32\\'.proto.VehicleAttributeStatus.RatioUnit\\x12\\x15\\n\\rdisplay_value\\x18\\x04 \\x01(\\t\"\\x99\\x01\\n\\x14\\x44oubleRatioAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x01\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\\x12\\x35\\n\\x04unit\\x18\\x03 \\x01(\\x0e\\x32\\'.proto.VehicleAttributeStatus.RatioUnit\\x12\\x15\\n\\rdisplay_value\\x18\\x04 \\x01(\\t\"\\xa5\\x01\\n\\x1a\\x44oubleTemperatureAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x01\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\\x12;\\n\\x04unit\\x18\\x03 \\x01(\\x0e\\x32-.proto.VehicleAttributeStatus.TemperatureUnit\\x12\\x15\\n\\rdisplay_value\\x18\\x04 \\x01(\\t\"\\xa0\\x01\\n\\x17Int64ClockHourAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x03\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\\x12\\x39\\n\\x04unit\\x18\\x03 \\x01(\\x0e\\x32+.proto.VehicleAttributeStatus.ClockHourUnit\\x12\\x15\\n\\rdisplay_value\\x18\\x04 \\x01(\\t\"\\xa4\\x01\\n\\x1bTimestampClockHourAttribute\\x12\\r\\n\\x05value\\x18\\x01 \\x01(\\x03\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\\x12\\x39\\n\\x04unit\\x18\\x03 \\x01(\\x0e\\x32+.proto.VehicleAttributeStatus.ClockHourUnit\\x12\\x15\\n\\rdisplay_value\\x18\\x04 \\x01(\\t\"o\\n\\x1e\\x41mgStageModeStateEnumAttribute\\x12\\'\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x18.proto.AmgStageModeState\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"o\\n\\x1e\\x41ssystOilQuantityEnumAttribute\\x12\\'\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x18.proto.AssystOilQuantity\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"m\\n\\x1d\\x41ssystOilWarningEnumAttribute\\x12&\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x17.proto.AssystOilWarning\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"g\\n\\x1a\\x41uxheatstatusEnumAttribute\\x12#\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x14.proto.Auxheatstatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"u\\n!AuxheattimeselectionEnumAttribute\\x12*\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1b.proto.Auxheattimeselection\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"g\\n\\x1a\\x42\\x61tteryHealthEnumAttribute\\x12#\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x14.proto.BatteryHealth\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"q\\n\\x1f\\x43\\x61librationRequestEnumAttribute\\x12(\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x19.proto.CalibrationRequest\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"{\\n$ChargeCouplerLockStatusEnumAttribute\\x12-\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1e.proto.ChargeCouplerLockStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"s\\n ChargeCouplerStatusEnumAttribute\\x12)\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1a.proto.ChargeCouplerStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"m\\n\\x1d\\x43hargeFlapStatusEnumAttribute\\x12&\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x17.proto.ChargeFlapStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x81\\x01\\n\\'ChargingCompatibilityErrorEnumAttribute\\x12\\x30\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32!.proto.ChargingCompatibilityError\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x9a\\x01\\n(ChargingCouplerErrorDetailsEnumAttribute\\x12H\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x39.proto.VehicleAttributeStatus.ChargingCouplerErrorDetails\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"u\\n!ChargingErrorDetailsEnumAttribute\\x12*\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1b.proto.ChargingErrorDetails\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\xaa\\x01\\n0ChargingErrorImpossibleChangeTo400VEnumAttribute\\x12P\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x41.proto.VehicleAttributeStatus.ChargingErrorImpossibleChangeTo400V\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\xaa\\x01\\n0ChargingErrorImpossibleChangeTo800VEnumAttribute\\x12P\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x41.proto.VehicleAttributeStatus.ChargingErrorImpossibleChangeTo800V\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\xa6\\x01\\n.ChargingErrorVehicleNoSupport400VEnumAttribute\\x12N\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32?.proto.VehicleAttributeStatus.ChargingErrorVehicleNoSupport400V\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"}\\n%ChargingFlapErrorDetailsEnumAttribute\\x12.\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1f.proto.ChargingFlapErrorDetails\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"e\\n\\x19\\x43hargingModeEnumAttribute\\x12\"\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x13.proto.ChargingMode\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"i\\n\\x1b\\x43hargingstatusEnumAttribute\\x12$\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x15.proto.Chargingstatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"}\\n%ChargingStopErrorDetailsEnumAttribute\\x12.\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1f.proto.ChargingStopErrorDetails\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x99\\x01\\n3ChildPresenceDetectionWarningLastEventEnumAttribute\\x12<\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32-.proto.ChildPresenceDetectionWarningLastEvent\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x91\\x01\\n/ChildPresenceDetectionWarningLevelEnumAttribute\\x12\\x38\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32).proto.ChildPresenceDetectionWarningLevel\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"o\\n\\x1e\\x44\\x63\\x43hargingProfileEnumAttribute\\x12\\'\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x18.proto.DcChargingProfile\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"o\\n\\x1e\\x44\\x65partureTimeModeEnumAttribute\\x12\\'\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x18.proto.DepartureTimeMode\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"i\\n\\x1b\\x44oorlockstatusEnumAttribute\\x12$\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x15.proto.Doorlockstatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"w\\n\"DoorlockstatusvehicleEnumAttribute\\x12+\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1c.proto.Doorlockstatusvehicle\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"a\\n\\x17\\x44oorstatusEnumAttribute\\x12 \\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x11.proto.Doorstatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"o\\n\\x1e\\x44oorStatusOverallEnumAttribute\\x12\\'\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x18.proto.DoorStatusOverall\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"g\\n\\x1a\\x44oorstatusgasEnumAttribute\\x12#\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x14.proto.Doorstatusgas\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"c\\n\\x18\\x44rivingModeEnumAttribute\\x12!\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x12.proto.DrivingMode\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"u\\n!EmergencyPowerSupplyEnumAttribute\\x12*\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1b.proto.EmergencyPowerSupply\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"m\\n\\x1d\\x45ngineHoodStatusEnumAttribute\\x12&\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x17.proto.EngineHoodStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"c\\n\\x18\\x45ngineStateEnumAttribute\\x12!\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x12.proto.EngineState\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"m\\n\\x1d\\x45vsePairingStateEnumAttribute\\x12&\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x17.proto.EvsePairingState\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"}\\n%ExteriorMonitoringStatusEnumAttribute\\x12.\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1f.proto.ExteriorMonitoringStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"w\\n\"FilterParticleLoadingEnumAttribute\\x12+\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1c.proto.FilterParticleLoading\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"m\\n\\x1d\\x46lipWindowStatusEnumAttribute\\x12&\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x17.proto.FlipWindowStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x85\\x01\\n)HvBatteryPrecondAvailabilityEnumAttribute\\x12\\x32\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32#.proto.HvBatteryPrecondAvailability\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x8d\\x01\\n-HvBatteryThermalPropagationEventEnumAttribute\\x12\\x36\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\'.proto.HvBatteryThermalPropagationEvent\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"i\\n\\x1bHybridWarningsEnumAttribute\\x12$\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x15.proto.HybridWarnings\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"g\\n\\x1aIgnitionstateEnumAttribute\\x12#\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x14.proto.Ignitionstate\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"}\\n%InteriorMonitoringStatusEnumAttribute\\x12.\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1f.proto.InteriorMonitoringStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x8f\\x01\\n.InteriorProtectionSelectionStatusEnumAttribute\\x12\\x37\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32(.proto.InteriorProtectionSelectionStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"q\\n\\x1fKeyActivationStateEnumAttribute\\x12(\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x19.proto.KeyActivationState\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"a\\n\\x17LanguageHUEnumAttribute\\x12 \\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x11.proto.LanguageHU\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"y\\n#LastTheftWarningReasonEnumAttribute\\x12,\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1d.proto.LastTheftWarningReason\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"k\\n\\x1cOilWarningLevelEnumAttribute\\x12%\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x16.proto.OilWarningLevel\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"k\\n\\x1cParkbrakestatusEnumAttribute\\x12%\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x16.proto.Parkbrakestatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x87\\x01\\n*ParkCollisionActivationStatusEnumAttribute\\x12\\x33\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32$.proto.ParkCollisionActivationStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x83\\x01\\n(ParkCollisionInactiveReasonEnumAttribute\\x12\\x31\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\".proto.ParkCollisionInactiveReason\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x91\\x01\\n/ParkCollisionPictureTransferStatusEnumAttribute\\x12\\x38\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32).proto.ParkCollisionPictureTransferStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x85\\x01\\n)ParkCollisionSelectionStatusEnumAttribute\\x12\\x32\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32#.proto.ParkCollisionSelectionStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"i\\n\\x1bParkEventLevelEnumAttribute\\x12$\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x15.proto.ParkEventLevel\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x8b\\x01\\n,ParkEventPictureSelectionStatusEnumAttribute\\x12\\x35\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32&.proto.ParkEventPictureSelectionStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x91\\x01\\n/ParkEventPictureTransmissionStatusEnumAttribute\\x12\\x38\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32).proto.ParkEventPictureTransmissionStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"w\\n\"ParkEventSensorStatusEnumAttribute\\x12+\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1c.proto.ParkEventSensorStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"g\\n\\x1aParkEventTypeEnumAttribute\\x12#\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x14.proto.ParkEventType\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x8b\\x01\\n,PerformanceLimitationModeStatusEnumAttribute\\x12\\x35\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32&.proto.PerformanceLimitationModeStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"y\\n#PictureRecordingStatusEnumAttribute\\x12,\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1d.proto.PictureRecordingStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x89\\x01\\n+PictureTransferSelectionStatusEnumAttribute\\x12\\x34\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32%.proto.PictureTransferSelectionStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"q\\n\\x1fPrecondatdepartureEnumAttribute\\x12(\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x19.proto.Precondatdeparture\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"e\\n\\x19PrecondErrorEnumAttribute\\x12\"\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x13.proto.PrecondError\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"a\\n\\x17PrecondNowEnumAttribute\\x12 \\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x11.proto.PrecondNow\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"u\\n!PrecondOperatingModeEnumAttribute\\x12*\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1b.proto.PrecondOperatingMode\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"c\\n\\x18PrecondSeatEnumAttribute\\x12!\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x12.proto.PrecondSeat\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x81\\x01\\n\\'ProtectionActivationStatusEnumAttribute\\x12\\x30\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32!.proto.ProtectionActivationStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"y\\n#ProtectionSensorStatusEnumAttribute\\x12,\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1d.proto.ProtectionSensorStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"s\\n RangeSkipIndicationEnumAttribute\\x12)\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1a.proto.RangeSkipIndication\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"g\\n\\x1aRooftopstatusEnumAttribute\\x12#\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x14.proto.Rooftopstatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"w\\n\"SelectedChargeProgramEnumAttribute\\x12+\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1c.proto.SelectedChargeProgram\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"g\\n\\x1aSmartChargingEnumAttribute\\x12#\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x14.proto.SmartCharging\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"}\\n%SmartChargingAtDepartureEnumAttribute\\x12.\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1f.proto.SmartChargingAtDeparture\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x83\\x01\\n(SohCalibrationNotificationsEnumAttribute\\x12\\x31\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\".proto.SohCalibrationNotifications\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"w\\n\"SohCalibrationPlannedEnumAttribute\\x12+\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1c.proto.SohCalibrationPlanned\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"y\\n#SohCalibrationRequiredEnumAttribute\\x12,\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1d.proto.SohCalibrationRequired\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"s\\n SohCalibrationStateEnumAttribute\\x12)\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1a.proto.SohCalibrationState\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"y\\n#SohFavorableConditionsEnumAttribute\\x12,\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1d.proto.SohFavorableConditions\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"k\\n\\x1cSpeedUnitFromICEnumAttribute\\x12%\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x16.proto.SpeedUnitFromIC\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"s\\n StarterBatteryStateEnumAttribute\\x12)\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1a.proto.StarterBatteryState\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"e\\n\\x19SunroofEventEnumAttribute\\x12\"\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x13.proto.SunroofEvent\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"g\\n\\x1aSunroofstatusEnumAttribute\\x12#\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x14.proto.Sunroofstatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"q\\n\\x1fSunroofStatusBlindEnumAttribute\\x12(\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x19.proto.SunroofStatusBlind\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x85\\x01\\n)TcuConnectionStateLowChannelEnumAttribute\\x12\\x32\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32#.proto.TcuConnectionStateLowChannel\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"o\\n\\x1eTcuThermoShutDownEnumAttribute\\x12\\'\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x18.proto.TcuThermoShutDown\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"o\\n\\x1eTemperatureUnitHUEnumAttribute\\x12\\'\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x18.proto.TemperatureUnitHU\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"e\\n\\x19TimeFormatHUEnumAttribute\\x12\"\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x13.proto.TimeFormatHU\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"a\\n\\x17TireMarkerEnumAttribute\\x12 \\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x11.proto.TireMarker\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"s\\n TireSensorAvailableEnumAttribute\\x12)\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1a.proto.TireSensorAvailable\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"s\\n TireWarningLevelPrwEnumAttribute\\x12)\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1a.proto.TireWarningLevelPrw\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"k\\n\\x1cTirewarninglampEnumAttribute\\x12%\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x16.proto.Tirewarninglamp\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"k\\n\\x1cTirewarningsprwEnumAttribute\\x12%\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x16.proto.Tirewarningsprw\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"k\\n\\x1cTirewarningsrdkEnumAttribute\\x12%\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x16.proto.Tirewarningsrdk\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x85\\x01\\n)TowProtectionSelectionStatusEnumAttribute\\x12\\x32\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32#.proto.TowProtectionSelectionStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"k\\n\\x1cTrackingStateHuEnumAttribute\\x12%\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x16.proto.TrackingStateHu\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"{\\n$TurnOffEnginePreWarningEnumAttribute\\x12-\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1e.proto.TurnOffEnginePreWarning\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x81\\x01\\n\\'VehicleDataConnectionStateEnumAttribute\\x12\\x30\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32!.proto.VehicleDataConnectionState\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"s\\n VehicleHealthStatusEnumAttribute\\x12)\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1a.proto.VehicleHealthStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"}\\n%VehiclePositionErrorCodeEnumAttribute\\x12.\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1f.proto.VehiclePositionErrorCode\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x8b\\x01\\n,VehicleTheftAlarmInactiveReasonEnumAttribute\\x12\\x35\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32&.proto.VehicleTheftAlarmInactiveReason\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"m\\n\\x1dWarningwashwaterEnumAttribute\\x12&\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x17.proto.Warningwashwater\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"[\\n\\x14WeekdayEnumAttribute\\x12\\x1d\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x0e.proto.Weekday\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"e\\n\\x19WindowstatusEnumAttribute\\x12\"\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x13.proto.Windowstatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"o\\n\\x1eWindowStatusBlindEnumAttribute\\x12\\'\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x18.proto.WindowStatusBlind\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"s\\n WindowStatusOverallEnumAttribute\\x12)\\n\\x05value\\x18\\x01 \\x01(\\x0e\\x32\\x1a.proto.WindowStatusOverall\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"q\\n AmgStageModeErrorObjectAttribute\\x12\\'\\n\\x05value\\x18\\x01 \\x01(\\x0b\\x32\\x18.proto.AmgStageModeError\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x82\\x01\\n&ChargingBreakClockTimerObjectAttribute\\x12\\x32\\n\\x05value\\x18\\x01 \\x01(\\x0b\\x32#.proto.ChargingBreakClockTimerValue\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x8d\\x01\\n.ChargingPredictionDepartureTimeObjectAttribute\\x12\\x35\\n\\x05value\\x18\\x01 \\x01(\\x0b\\x32&.proto.ChargingPredictionDepartureTime\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"y\\n$ChargingPredictionSocObjectAttribute\\x12+\\n\\x05value\\x18\\x01 \\x01(\\x0b\\x32\\x1c.proto.ChargingPredictionSoc\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"{\\n%ChargingScheduleActiveObjectAttribute\\x12,\\n\\x05value\\x18\\x01 \\x01(\\x0b\\x32\\x1d.proto.ChargingScheduleActive\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x81\\x01\\n(ChargingScheduleRequestedObjectAttribute\\x12/\\n\\x05value\\x18\\x01 \\x01(\\x0b\\x32 .proto.ChargingScheduleRequested\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x87\\x01\\n+HvBatteryPrecondRequestStateObjectAttribute\\x12\\x32\\n\\x05value\\x18\\x01 \\x01(\\x0b\\x32#.proto.HvBatteryPrecondRequestState\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"y\\n$HvBatteryPrecondStateObjectAttribute\\x12+\\n\\x05value\\x18\\x01 \\x01(\\x0b\\x32\\x1c.proto.HvBatteryPrecondState\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\x80\\x01\\n%KeylineActivationStateObjectAttribute\\x12\\x31\\n\\x05value\\x18\\x01 \\x01(\\x0b\\x32\".proto.KeylineActivationStateValue\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\xc8\\x01\\n NextDepartureTimeObjectAttribute\\x12,\\n\\x05value\\x18\\x01 \\x01(\\x0b\\x32\\x1d.proto.NextDepartureTimeValue\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\\x12\\x39\\n\\x04unit\\x18\\x03 \\x01(\\x0e\\x32+.proto.VehicleAttributeStatus.ClockHourUnit\\x12\\x15\\n\\rdisplay_value\\x18\\x04 \\x01(\\t\"}\\n&PrecondOperabilityStateObjectAttribute\\x12-\\n\\x05value\\x18\\x01 \\x01(\\x0b\\x32\\x1e.proto.PrecondOperabilityState\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"g\\n\\x1bPrecondStateObjectAttribute\\x12\"\\n\\x05value\\x18\\x01 \\x01(\\x0b\\x32\\x13.proto.PrecondState\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"}\\n&RemoteUpdateStartStatusObjectAttribute\\x12-\\n\\x05value\\x18\\x01 \\x01(\\x0b\\x32\\x1e.proto.RemoteUpdateStartStatus\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"n\\n\\x1cWeeklyProfileObjectAttribute\\x12(\\n\\x05value\\x18\\x01 \\x01(\\x0b\\x32\\x19.proto.WeeklyProfileValue\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"k\\n\\x1d\\x41uxheatwarningsArrayAttribute\\x12$\\n\\x05value\\x18\\x01 \\x03(\\x0e\\x32\\x15.proto.Auxheatwarning\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"i\\n\\x19\\x43hargeFlapsArrayAttribute\\x12&\\n\\x05value\\x18\\x01 \\x03(\\x0b\\x32\\x17.proto.ChargeFlapsEntry\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"k\\n\\x1a\\x43hargeInletsArrayAttribute\\x12\\'\\n\\x05value\\x18\\x01 \\x03(\\x0b\\x32\\x18.proto.ChargeInletsEntry\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"s\\n\\x1c\\x43hargeProgramsArrayAttribute\\x12-\\n\\x05value\\x18\\x01 \\x03(\\x0b\\x32\\x1e.proto.ChargeProgramParameters\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"~\\n&ChargingPowerRestrictionArrayAttribute\\x12.\\n\\x05value\\x18\\x01 \\x03(\\x0e\\x32\\x1f.proto.ChargingPowerRestriction\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"m\\n\\x1b\\x43hargingTimerArrayAttribute\\x12(\\n\\x05value\\x18\\x01 \\x03(\\x0b\\x32\\x19.proto.ChargingTimerEntry\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"e\\n\\x18SocprofileArrayAttribute\\x12#\\n\\x05value\\x18\\x01 \\x03(\\x0b\\x32\\x14.proto.StateOfCharge\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"s\\n\\x1cSpeedAlertConfArrayAttribute\\x12-\\n\\x05value\\x18\\x01 \\x03(\\x0b\\x32\\x1e.proto.SpeedAlertConfiguration\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"o\\n\\x1fTemperaturePointsArrayAttribute\\x12&\\n\\x05value\\x18\\x01 \\x03(\\x0b\\x32\\x17.proto.TemperaturePoint\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"f\\n\\x19WeeklySetHUArrayAttribute\\x12#\\n\\x05value\\x18\\x01 \\x03(\\x0b\\x32\\x14.proto.WeeklySetting\\x12$\\n\\x08metadata\\x18\\x02 \\x01(\\x0b\\x32\\x12.proto.VSUMetadata\"\\xf5\\x8f\\x01\\n\\x13VehicleStatusUpdate\\x12\\x12\\n\\nfin_or_vin\\x18\\x01 \\x01(\\t\\x12\\x13\\n\\x0b\\x66ull_update\\x18\\x02 \\x01(\\x08\\x12\\x45\\n\\x14\\x61mg_stage_mode_error\\x18\\x03 \\x01(\\x0b\\x32\\'.proto.AmgStageModeErrorObjectAttribute\\x12\\x43\\n\\x14\\x61mg_stage_mode_state\\x18\\x04 \\x01(\\x0b\\x32%.proto.AmgStageModeStateEnumAttribute\\x12\\x42\\n\\x13\\x61ssyst_oil_quantity\\x18\\x05 \\x01(\\x0b\\x32%.proto.AssystOilQuantityEnumAttribute\\x12@\\n\\x12\\x61ssyst_oil_warning\\x18\\x06 \\x01(\\x0b\\x32$.proto.AssystOilWarningEnumAttribute\\x12,\\n\\x0e\\x61uxheat_active\\x18\\x07 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12-\\n\\x0e\\x61uxheatruntime\\x18\\x08 \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12\\x38\\n\\rauxheatstatus\\x18\\t \\x01(\\x0b\\x32!.proto.AuxheatstatusEnumAttribute\\x12\\x34\\n\\x0c\\x61uxheattime1\\x18\\n \\x01(\\x0b\\x32\\x1e.proto.Int64ClockHourAttribute\\x12\\x34\\n\\x0c\\x61uxheattime2\\x18\\x0b \\x01(\\x0b\\x32\\x1e.proto.Int64ClockHourAttribute\\x12\\x34\\n\\x0c\\x61uxheattime3\\x18\\x0c \\x01(\\x0b\\x32\\x1e.proto.Int64ClockHourAttribute\\x12\\x46\\n\\x14\\x61uxheattimeselection\\x18\\r \\x01(\\x0b\\x32(.proto.AuxheattimeselectionEnumAttribute\\x12=\\n\\x0f\\x61uxheatwarnings\\x18\\x0e \\x01(\\x0b\\x32$.proto.AuxheatwarningsArrayAttribute\\x12\\x38\\n\\x13\\x61verage_speed_reset\\x18\\x0f \\x01(\\x0b\\x32\\x1b.proto.DoubleSpeedAttribute\\x12\\x38\\n\\x13\\x61verage_speed_start\\x18\\x10 \\x01(\\x0b\\x32\\x1b.proto.DoubleSpeedAttribute\\x12\\x39\\n\\x0e\\x62\\x61ttery_health\\x18\\x11 \\x01(\\x0b\\x32!.proto.BatteryHealthEnumAttribute\\x12;\\n\\x1d\\x62idirectional_charging_active\\x18\\x12 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12S\\n\\x1e\\x63harge_coupler_a_c_lock_status\\x18\\x13 \\x01(\\x0b\\x32+.proto.ChargeCouplerLockStatusEnumAttribute\\x12J\\n\\x19\\x63harge_coupler_a_c_status\\x18\\x14 \\x01(\\x0b\\x32\\'.proto.ChargeCouplerStatusEnumAttribute\\x12S\\n\\x1e\\x63harge_coupler_d_c_lock_status\\x18\\x15 \\x01(\\x0b\\x32+.proto.ChargeCouplerLockStatusEnumAttribute\\x12J\\n\\x19\\x63harge_coupler_d_c_status\\x18\\x16 \\x01(\\x0b\\x32\\'.proto.ChargeCouplerStatusEnumAttribute\\x12\\x44\\n\\x16\\x63harge_flap_a_c_status\\x18\\x17 \\x01(\\x0b\\x32$.proto.ChargeFlapStatusEnumAttribute\\x12\\x44\\n\\x16\\x63harge_flap_d_c_status\\x18\\x18 \\x01(\\x0b\\x32$.proto.ChargeFlapStatusEnumAttribute\\x12\\x36\\n\\x0c\\x63harge_flaps\\x18\\x19 \\x01(\\x0b\\x32 .proto.ChargeFlapsArrayAttribute\\x12\\x38\\n\\rcharge_inlets\\x18\\x1a \\x01(\\x0b\\x32!.proto.ChargeInletsArrayAttribute\\x12<\\n\\x0f\\x63harge_programs\\x18\\x1b \\x01(\\x0b\\x32#.proto.ChargeProgramsArrayAttribute\\x12Q\\n\\x1a\\x63harging_break_clock_timer\\x18\\x1c \\x01(\\x0b\\x32-.proto.ChargingBreakClockTimerObjectAttribute\\x12T\\n\\x1c\\x63harging_compatibility_error\\x18\\x1d \\x01(\\x0b\\x32..proto.ChargingCompatibilityErrorEnumAttribute\\x12W\\n\\x1e\\x63harging_coupler_error_details\\x18\\x1e \\x01(\\x0b\\x32/.proto.ChargingCouplerErrorDetailsEnumAttribute\\x12H\\n\\x16\\x63harging_error_details\\x18\\x1f \\x01(\\x0b\\x32(.proto.ChargingErrorDetailsEnumAttribute\\x12i\\n(charging_error_impossible_change_to400_v\\x18  \\x01(\\x0b\\x32\\x37.proto.ChargingErrorImpossibleChangeTo400VEnumAttribute\\x12i\\n(charging_error_impossible_change_to800_v\\x18! \\x01(\\x0b\\x32\\x37.proto.ChargingErrorImpossibleChangeTo800VEnumAttribute\\x12\\x65\\n&charging_error_vehicle_no_support400_v\\x18\" \\x01(\\x0b\\x32\\x35.proto.ChargingErrorVehicleNoSupport400VEnumAttribute\\x12Q\\n\\x1b\\x63harging_flap_error_details\\x18# \\x01(\\x0b\\x32,.proto.ChargingFlapErrorDetailsEnumAttribute\\x12\\x37\\n\\rcharging_mode\\x18$ \\x01(\\x0b\\x32 .proto.ChargingModeEnumAttribute\\x12.\\n\\x0e\\x63harging_power\\x18% \\x01(\\x0b\\x32\\x16.proto.DoubleAttribute\\x12\\x37\\n\\x18\\x63harging_power_eco_limit\\x18& \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12Q\\n\\x1a\\x63harging_power_restriction\\x18\\' \\x01(\\x0b\\x32-.proto.ChargingPowerRestrictionArrayAttribute\\x12\\x61\\n\"charging_prediction_departure_time\\x18( \\x01(\\x0b\\x32\\x35.proto.ChargingPredictionDepartureTimeObjectAttribute\\x12Q\\n\\x1c\\x63harging_prediction_full_soc\\x18) \\x01(\\x0b\\x32+.proto.ChargingPredictionSocObjectAttribute\\x12P\\n\\x1b\\x63harging_prediction_max_soc\\x18* \\x01(\\x0b\\x32+.proto.ChargingPredictionSocObjectAttribute\\x12P\\n\\x1b\\x63harging_prediction_min_soc\\x18+ \\x01(\\x0b\\x32+.proto.ChargingPredictionSocObjectAttribute\\x12S\\n\\x1e\\x63harging_prediction_target_soc\\x18, \\x01(\\x0b\\x32+.proto.ChargingPredictionSocObjectAttribute\\x12N\\n\\x18\\x63harging_schedule_active\\x18- \\x01(\\x0b\\x32,.proto.ChargingScheduleActiveObjectAttribute\\x12T\\n\\x1b\\x63harging_schedule_requested\\x18. \\x01(\\x0b\\x32/.proto.ChargingScheduleRequestedObjectAttribute\\x12Q\\n\\x1b\\x63harging_stop_error_details\\x18/ \\x01(\\x0b\\x32,.proto.ChargingStopErrorDetailsEnumAttribute\\x12:\\n\\x0e\\x63harging_timer\\x18\\x30 \\x01(\\x0b\\x32\".proto.ChargingTimerArrayAttribute\\x12,\\n\\x0e\\x63hargingactive\\x18\\x31 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12:\\n\\x0e\\x63hargingstatus\\x18\\x32 \\x01(\\x0b\\x32\".proto.ChargingstatusEnumAttribute\\x12G\\n(child_presence_detection_warning_counter\\x18\\x33 \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12o\\n+child_presence_detection_warning_last_event\\x18\\x34 \\x01(\\x0b\\x32:.proto.ChildPresenceDetectionWarningLastEventEnumAttribute\\x12\\x66\\n&child_presence_detection_warning_level\\x18\\x35 \\x01(\\x0b\\x32\\x36.proto.ChildPresenceDetectionWarningLevelEnumAttribute\\x12\\x42\\n\\x13\\x64\\x63_charging_profile\\x18\\x36 \\x01(\\x0b\\x32%.proto.DcChargingProfileEnumAttribute\\x12\\x35\\n\\rdecklidstatus\\x18\\x37 \\x01(\\x0b\\x32\\x1e.proto.DoorstatusEnumAttribute\\x12\\x42\\n\\x13\\x64\\x65parture_time_mode\\x18\\x38 \\x01(\\x0b\\x32%.proto.DepartureTimeModeEnumAttribute\\x12;\\n\\x16\\x64\\x65parture_time_weekday\\x18\\x39 \\x01(\\x0b\\x32\\x1b.proto.WeekdayEnumAttribute\\x12\\x35\\n\\rdeparturetime\\x18: \\x01(\\x0b\\x32\\x1e.proto.Int64ClockHourAttribute\\x12\\x34\\n\\x10\\x64\\x65parturetimesoc\\x18; \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12\\x41\\n\\x19\\x64istance_electrical_reset\\x18< \\x01(\\x0b\\x32\\x1e.proto.DoubleDistanceAttribute\\x12\\x41\\n\\x19\\x64istance_electrical_start\\x18= \\x01(\\x0b\\x32\\x1e.proto.DoubleDistanceAttribute\\x12:\\n\\x12\\x64istance_gas_reset\\x18> \\x01(\\x0b\\x32\\x1e.proto.DoubleDistanceAttribute\\x12:\\n\\x12\\x64istance_gas_start\\x18? \\x01(\\x0b\\x32\\x1e.proto.DoubleDistanceAttribute\\x12\\x36\\n\\x0e\\x64istance_reset\\x18@ \\x01(\\x0b\\x32\\x1e.proto.DoubleDistanceAttribute\\x12\\x36\\n\\x0e\\x64istance_start\\x18\\x41 \\x01(\\x0b\\x32\\x1e.proto.DoubleDistanceAttribute\\x12:\\n\\x12\\x64istance_z_e_reset\\x18\\x42 \\x01(\\x0b\\x32\\x1e.proto.DoubleDistanceAttribute\\x12:\\n\\x12\\x64istance_z_e_start\\x18\\x43 \\x01(\\x0b\\x32\\x1e.proto.DoubleDistanceAttribute\\x12\\x41\\n\\x15\\x64oorlockstatusdecklid\\x18\\x44 \\x01(\\x0b\\x32\".proto.DoorlockstatusEnumAttribute\\x12\\x43\\n\\x17\\x64oorlockstatusfrontleft\\x18\\x45 \\x01(\\x0b\\x32\".proto.DoorlockstatusEnumAttribute\\x12\\x44\\n\\x18\\x64oorlockstatusfrontright\\x18\\x46 \\x01(\\x0b\\x32\".proto.DoorlockstatusEnumAttribute\\x12=\\n\\x11\\x64oorlockstatusgas\\x18G \\x01(\\x0b\\x32\".proto.DoorlockstatusEnumAttribute\\x12\\x42\\n\\x16\\x64oorlockstatusrearleft\\x18H \\x01(\\x0b\\x32\".proto.DoorlockstatusEnumAttribute\\x12\\x43\\n\\x17\\x64oorlockstatusrearright\\x18I \\x01(\\x0b\\x32\".proto.DoorlockstatusEnumAttribute\\x12H\\n\\x15\\x64oorlockstatusvehicle\\x18J \\x01(\\x0b\\x32).proto.DoorlockstatusvehicleEnumAttribute\\x12;\\n\\x13\\x64oorstatusfrontleft\\x18K \\x01(\\x0b\\x32\\x1e.proto.DoorstatusEnumAttribute\\x12<\\n\\x14\\x64oorstatusfrontright\\x18L \\x01(\\x0b\\x32\\x1e.proto.DoorstatusEnumAttribute\\x12\\x38\\n\\rdoorstatusgas\\x18M \\x01(\\x0b\\x32!.proto.DoorstatusgasEnumAttribute\\x12:\\n\\x12\\x64oorstatusrearleft\\x18N \\x01(\\x0b\\x32\\x1e.proto.DoorstatusEnumAttribute\\x12;\\n\\x13\\x64oorstatusrearright\\x18O \\x01(\\x0b\\x32\\x1e.proto.DoorstatusEnumAttribute\\x12\\x30\\n\\x11\\x64riven_time_reset\\x18P \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12\\x30\\n\\x11\\x64riven_time_start\\x18Q \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12\\x34\\n\\x15\\x64riven_time_z_e_reset\\x18R \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12\\x34\\n\\x15\\x64riven_time_z_e_start\\x18S \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12\\x31\\n\\recoscoreaccel\\x18T \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12:\\n\\x12\\x65\\x63oscorebonusrange\\x18U \\x01(\\x0b\\x32\\x1e.proto.DoubleDistanceAttribute\\x12\\x31\\n\\recoscoreconst\\x18V \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12\\x33\\n\\x0f\\x65\\x63oscorefreewhl\\x18W \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12\\x31\\n\\recoscoretotal\\x18X \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12\\x39\\n\\x14\\x65lectric_ratio_reset\\x18Y \\x01(\\x0b\\x32\\x1b.proto.DoubleRatioAttribute\\x12\\x39\\n\\x14\\x65lectric_ratio_start\\x18Z \\x01(\\x0b\\x32\\x1b.proto.DoubleRatioAttribute\\x12Q\\n electrical_range_skip_indication\\x18[ \\x01(\\x0b\\x32\\'.proto.RangeSkipIndicationEnumAttribute\\x12N\\n\\x18\\x65lectricconsumptionreset\\x18\\\\ \\x01(\\x0b\\x32,.proto.DoubleElectricityConsumptionAttribute\\x12N\\n\\x18\\x65lectricconsumptionstart\\x18] \\x01(\\x0b\\x32,.proto.DoubleElectricityConsumptionAttribute\\x12H\\n\\x16\\x65mergency_power_supply\\x18^ \\x01(\\x0b\\x32(.proto.EmergencyPowerSupplyEnumAttribute\\x12>\\n\\x19\\x65ndof_charge_time_weekday\\x18_ \\x01(\\x0b\\x32\\x1b.proto.WeekdayEnumAttribute\\x12\\x37\\n\\x0f\\x65ndofchargetime\\x18` \\x01(\\x0b\\x32\\x1e.proto.Int64ClockHourAttribute\\x12@\\n\\x12\\x65ngine_hood_status\\x18\\x61 \\x01(\\x0b\\x32$.proto.EngineHoodStatusEnumAttribute\\x12\\x35\\n\\x0c\\x65ngine_state\\x18\\x62 \\x01(\\x0b\\x32\\x1f.proto.EngineStateEnumAttribute\\x12\\x42\\n\\x1e\\x65v_range_assist_drive_on_s_o_c\\x18\\x63 \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12<\\n\\x1d\\x65v_range_assist_drive_on_time\\x18\\x64 \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12@\\n\\x12\\x65vse_pairing_state\\x18\\x65 \\x01(\\x0b\\x32$.proto.EvsePairingStateEnumAttribute\\x12\\x41\\n\\x1e\\x65xterior_monitoring_last_event\\x18\\x66 \\x01(\\x0b\\x32\\x19.proto.TimestampAttribute\\x12P\\n\\x1a\\x65xterior_monitoring_status\\x18g \\x01(\\x0b\\x32,.proto.ExteriorMonitoringStatusEnumAttribute\\x12J\\n\\x17\\x66ilter_particle_loading\\x18h \\x01(\\x0b\\x32).proto.FilterParticleLoadingEnumAttribute\\x12@\\n\\x12\\x66lip_window_status\\x18i \\x01(\\x0b\\x32$.proto.FlipWindowStatusEnumAttribute\\x12K\\n$gained_range_since_start_of_charging\\x18j \\x01(\\x0b\\x32\\x1d.proto.Int64DistanceAttribute\\x12.\\n\\x0egas_tank_level\\x18k \\x01(\\x0b\\x32\\x16.proto.DoubleAttribute\\x12;\\n\\x16gas_tank_level_percent\\x18l \\x01(\\x0b\\x32\\x1b.proto.DoubleRatioAttribute\\x12\\x36\\n\\x0egas_tank_range\\x18m \\x01(\\x0b\\x32\\x1e.proto.DoubleDistanceAttribute\\x12\\x41\\n\\x13gasconsumptionreset\\x18n \\x01(\\x0b\\x32$.proto.DoubleGasConsumptionAttribute\\x12\\x41\\n\\x13gasconsumptionstart\\x18o \\x01(\\x0b\\x32$.proto.DoubleGasConsumptionAttribute\\x12Y\\n\\x1fhv_battery_precond_availability\\x18p \\x01(\\x0b\\x32\\x30.proto.HvBatteryPrecondAvailabilityEnumAttribute\\x12:\\n\\x1bhv_battery_precond_duration\\x18q \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12\\\\\\n hv_battery_precond_request_state\\x18r \\x01(\\x0b\\x32\\x32.proto.HvBatteryPrecondRequestStateObjectAttribute\\x12M\\n\\x18hv_battery_precond_state\\x18s \\x01(\\x0b\\x32+.proto.HvBatteryPrecondStateObjectAttribute\\x12\\x39\\n\\x1ahv_battery_state_of_health\\x18t \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12I\\n*hv_battery_state_of_health_distance_update\\x18u \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12K\\n+hv_battery_state_of_health_reserve_capacity\\x18v \\x01(\\x0b\\x32\\x16.proto.DoubleAttribute\\x12\\x62\\n$hv_battery_thermal_propagation_event\\x18w \\x01(\\x0b\\x32\\x34.proto.HvBatteryThermalPropagationEventEnumAttribute\\x12;\\n\\x0fhybrid_warnings\\x18x \\x01(\\x0b\\x32\".proto.HybridWarningsEnumAttribute\\x12\\x38\\n\\rignitionstate\\x18y \\x01(\\x0b\\x32!.proto.IgnitionstateEnumAttribute\\x12\\x41\\n\\x1einterior_monitoring_last_event\\x18z \\x01(\\x0b\\x32\\x19.proto.TimestampAttribute\\x12P\\n\\x1ainterior_monitoring_status\\x18{ \\x01(\\x0b\\x32,.proto.InteriorMonitoringStatusEnumAttribute\\x12]\\n%interior_protection_activation_status\\x18| \\x01(\\x0b\\x32..proto.ProtectionActivationStatusEnumAttribute\\x12\\x63\\n$interior_protection_selection_status\\x18} \\x01(\\x0b\\x32\\x35.proto.InteriorProtectionSelectionStatusEnumAttribute\\x12U\\n!interior_protection_sensor_status\\x18~ \\x01(\\x0b\\x32*.proto.ProtectionSensorStatusEnumAttribute\\x12\\x44\\n\\x14key_activation_state\\x18\\x7f \\x01(\\x0b\\x32&.proto.KeyActivationStateEnumAttribute\\x12O\\n\\x18keyline_activation_state\\x18\\x80\\x01 \\x01(\\x0b\\x32,.proto.KeylineActivationStateObjectAttribute\\x12\\x35\\n\\x0clanguage_h_u\\x18\\x81\\x01 \\x01(\\x0b\\x32\\x1e.proto.LanguageHUEnumAttribute\\x12<\\n\\x0flast_park_event\\x18\\x82\\x01 \\x01(\\x0b\\x32\".proto.TimestampClockHourAttribute\\x12\\x32\\n\\x12last_park_event_id\\x18\\x83\\x01 \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12<\\n\\x1dlast_park_event_not_confirmed\\x18\\x84\\x01 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12\\x36\\n\\x12last_theft_warning\\x18\\x85\\x01 \\x01(\\x0b\\x32\\x19.proto.TimestampAttribute\\x12N\\n\\x19last_theft_warning_reason\\x18\\x86\\x01 \\x01(\\x0b\\x32*.proto.LastTheftWarningReasonEnumAttribute\\x12N\\n\\x1cliquid_range_skip_indication\\x18\\x87\\x01 \\x01(\\x0b\\x32\\'.proto.RangeSkipIndicationEnumAttribute\\x12L\\n\\x16liquidconsumptionreset\\x18\\x88\\x01 \\x01(\\x0b\\x32+.proto.DoubleCombustionConsumptionAttribute\\x12L\\n\\x16liquidconsumptionstart\\x18\\x89\\x01 \\x01(\\x0b\\x32+.proto.DoubleCombustionConsumptionAttribute\\x12,\\n\\x07max_soc\\x18\\x8a\\x01 \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12\\x38\\n\\x13max_soc_lower_limit\\x18\\x8b\\x01 \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12\\x38\\n\\x13max_soc_upper_limit\\x18\\x8c\\x01 \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12\\x30\\n\\x08maxrange\\x18\\x8d\\x01 \\x01(\\x0b\\x32\\x1d.proto.Int64DistanceAttribute\\x12,\\n\\x07min_soc\\x18\\x8e\\x01 \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12\\x38\\n\\x13min_soc_lower_limit\\x18\\x8f\\x01 \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12\\x38\\n\\x13min_soc_upper_limit\\x18\\x90\\x01 \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12\\x45\\n\\x13next_departure_time\\x18\\x91\\x01 \\x01(\\x0b\\x32\\'.proto.NextDepartureTimeObjectAttribute\\x12\\x41\\n\\x1bnext_departure_time_weekday\\x18\\x92\\x01 \\x01(\\x0b\\x32\\x1b.proto.WeekdayEnumAttribute\\x12+\\n\\x03odo\\x18\\x93\\x01 \\x01(\\x0b\\x32\\x1d.proto.Int64DistanceAttribute\\x12.\\n\\toil_level\\x18\\x94\\x01 \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12?\\n\\x11oil_warning_level\\x18\\x95\\x01 \\x01(\\x0b\\x32#.proto.OilWarningLevelEnumAttribute\\x12\\x31\\n\\x12panic_alarm_active\\x18\\x96\\x01 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12\\\\\\n park_collision_activation_status\\x18\\x97\\x01 \\x01(\\x0b\\x32\\x31.proto.ParkCollisionActivationStatusEnumAttribute\\x12X\\n\\x1epark_collision_inactive_reason\\x18\\x98\\x01 \\x01(\\x0b\\x32/.proto.ParkCollisionInactiveReasonEnumAttribute\\x12g\\n&park_collision_picture_transfer_status\\x18\\x99\\x01 \\x01(\\x0b\\x32\\x36.proto.ParkCollisionPictureTransferStatusEnumAttribute\\x12Z\\n\\x1fpark_collision_selection_status\\x18\\x9a\\x01 \\x01(\\x0b\\x32\\x30.proto.ParkCollisionSelectionStatusEnumAttribute\\x12=\\n\\x10park_event_level\\x18\\x9b\\x01 \\x01(\\x0b\\x32\".proto.ParkEventLevelEnumAttribute\\x12\\x61\\n#park_event_picture_selection_status\\x18\\x9c\\x01 \\x01(\\x0b\\x32\\x33.proto.ParkEventPictureSelectionStatusEnumAttribute\\x12g\\n&park_event_picture_transmission_status\\x18\\x9d\\x01 \\x01(\\x0b\\x32\\x36.proto.ParkEventPictureTransmissionStatusEnumAttribute\\x12L\\n\\x18park_event_sensor_status\\x18\\x9e\\x01 \\x01(\\x0b\\x32).proto.ParkEventSensorStatusEnumAttribute\\x12;\\n\\x0fpark_event_type\\x18\\x9f\\x01 \\x01(\\x0b\\x32!.proto.ParkEventTypeEnumAttribute\\x12=\\n\\x0fparkbrakestatus\\x18\\xa0\\x01 \\x01(\\x0b\\x32#.proto.ParkbrakestatusEnumAttribute\\x12`\\n\"performance_limitation_mode_status\\x18\\xa1\\x01 \\x01(\\x0b\\x32\\x33.proto.PerformanceLimitationModeStatusEnumAttribute\\x12M\\n\\x18picture_recording_status\\x18\\xa2\\x01 \\x01(\\x0b\\x32*.proto.PictureRecordingStatusEnumAttribute\\x12^\\n!picture_transfer_selection_status\\x18\\xa3\\x01 \\x01(\\x0b\\x32\\x32.proto.PictureTransferSelectionStatusEnumAttribute\\x12\\x31\\n\\x10position_heading\\x18\\xa4\\x01 \\x01(\\x0b\\x32\\x16.proto.DoubleAttribute\\x12-\\n\\x0cposition_lat\\x18\\xa5\\x01 \\x01(\\x0b\\x32\\x16.proto.DoubleAttribute\\x12.\\n\\rposition_long\\x18\\xa6\\x01 \\x01(\\x0b\\x32\\x16.proto.DoubleAttribute\\x12-\\n\\x0eprecond_active\\x18\\xa7\\x01 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12;\\n\\x1cprecond_at_departure_disable\\x18\\xa8\\x01 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12\\x30\\n\\x10precond_duration\\x18\\xa9\\x01 \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12\\x38\\n\\rprecond_error\\x18\\xaa\\x01 \\x01(\\x0b\\x32 .proto.PrecondErrorEnumAttribute\\x12\\x34\\n\\x0bprecond_now\\x18\\xab\\x01 \\x01(\\x0b\\x32\\x1e.proto.PrecondNowEnumAttribute\\x12<\\n\\x11precond_now_error\\x18\\xac\\x01 \\x01(\\x0b\\x32 .proto.PrecondErrorEnumAttribute\\x12Q\\n\\x19precond_operability_state\\x18\\xad\\x01 \\x01(\\x0b\\x32-.proto.PrecondOperabilityStateObjectAttribute\\x12I\\n\\x16precond_operating_mode\\x18\\xae\\x01 \\x01(\\x0b\\x32(.proto.PrecondOperatingModeEnumAttribute\\x12\\x41\\n\\x17precond_seat_front_left\\x18\\xaf\\x01 \\x01(\\x0b\\x32\\x1f.proto.PrecondSeatEnumAttribute\\x12\\x42\\n\\x18precond_seat_front_right\\x18\\xb0\\x01 \\x01(\\x0b\\x32\\x1f.proto.PrecondSeatEnumAttribute\\x12@\\n\\x16precond_seat_rear_left\\x18\\xb1\\x01 \\x01(\\x0b\\x32\\x1f.proto.PrecondSeatEnumAttribute\\x12\\x41\\n\\x17precond_seat_rear_right\\x18\\xb2\\x01 \\x01(\\x0b\\x32\\x1f.proto.PrecondSeatEnumAttribute\\x12:\\n\\rprecond_state\\x18\\xb3\\x01 \\x01(\\x0b\\x32\".proto.PrecondStateObjectAttribute\\x12\\x43\\n\\x12precondatdeparture\\x18\\xb4\\x01 \\x01(\\x0b\\x32&.proto.PrecondatdepartureEnumAttribute\\x12\\x35\\n\\rrange_ad_blue\\x18\\xb5\\x01 \\x01(\\x0b\\x32\\x1d.proto.Int64DistanceAttribute\\x12;\\n\\x13range_electric_wltp\\x18\\xb6\\x01 \\x01(\\x0b\\x32\\x1d.proto.Int64DistanceAttribute\\x12\\x35\\n\\rrangeelectric\\x18\\xb7\\x01 \\x01(\\x0b\\x32\\x1d.proto.Int64DistanceAttribute\\x12\\x33\\n\\x0brangeliquid\\x18\\xb8\\x01 \\x01(\\x0b\\x32\\x1d.proto.Int64DistanceAttribute\\x12\\x32\\n\\x13remote_start_active\\x18\\xb9\\x01 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12\\x34\\n\\x14remote_start_endtime\\x18\\xba\\x01 \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12\\x44\\n\\x18remote_start_temperature\\x18\\xbb\\x01 \\x01(\\x0b\\x32!.proto.DoubleTemperatureAttribute\\x12R\\n\\x1aremote_update_start_status\\x18\\xbc\\x01 \\x01(\\x0b\\x32-.proto.RemoteUpdateStartStatusObjectAttribute\\x12\\x39\\n\\rrooftopstatus\\x18\\xbd\\x01 \\x01(\\x0b\\x32!.proto.RooftopstatusEnumAttribute\\x12K\\n\\x17selected_charge_program\\x18\\xbe\\x01 \\x01(\\x0b\\x32).proto.SelectedChargeProgramEnumAttribute\\x12\\x33\\n\\x13serviceintervaldays\\x18\\xbf\\x01 \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12?\\n\\x17serviceintervaldistance\\x18\\xc0\\x01 \\x01(\\x0b\\x32\\x1d.proto.Int64DistanceAttribute\\x12:\\n\\x0esmart_charging\\x18\\xc1\\x01 \\x01(\\x0b\\x32!.proto.SmartChargingEnumAttribute\\x12R\\n\\x1bsmart_charging_at_departure\\x18\\xc2\\x01 \\x01(\\x0b\\x32,.proto.SmartChargingAtDepartureEnumAttribute\\x12S\\n\\x1csmart_charging_at_departure2\\x18\\xc3\\x01 \\x01(\\x0b\\x32,.proto.SmartChargingAtDepartureEnumAttribute\\x12(\\n\\x03soc\\x18\\xc4\\x01 \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12H\\n\\x17soc_calibration_request\\x18\\xc5\\x01 \\x01(\\x0b\\x32&.proto.CalibrationRequestEnumAttribute\\x12\\x34\\n\\nsocprofile\\x18\\xc6\\x01 \\x01(\\x0b\\x32\\x1f.proto.SocprofileArrayAttribute\\x12W\\n\\x1dsoh_calibration_notifications\\x18\\xc7\\x01 \\x01(\\x0b\\x32/.proto.SohCalibrationNotificationsEnumAttribute\\x12K\\n\\x17soh_calibration_planned\\x18\\xc8\\x01 \\x01(\\x0b\\x32).proto.SohCalibrationPlannedEnumAttribute\\x12H\\n\\x17soh_calibration_request\\x18\\xc9\\x01 \\x01(\\x0b\\x32&.proto.CalibrationRequestEnumAttribute\\x12M\\n\\x18soh_calibration_required\\x18\\xca\\x01 \\x01(\\x0b\\x32*.proto.SohCalibrationRequiredEnumAttribute\\x12G\\n\\x15soh_calibration_state\\x18\\xcb\\x01 \\x01(\\x0b\\x32\\'.proto.SohCalibrationStateEnumAttribute\\x12\\x39\\n\\x19soh_charge_time_extension\\x18\\xcc\\x01 \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12M\\n\\x18soh_favorable_conditions\\x18\\xcd\\x01 \\x01(\\x0b\\x32*.proto.SohFavorableConditionsEnumAttribute\\x12>\\n\\x10speed_alert_conf\\x18\\xce\\x01 \\x01(\\x0b\\x32#.proto.SpeedAlertConfArrayAttribute\\x12\\x41\\n\\x13speed_unit_from_i_c\\x18\\xcf\\x01 \\x01(\\x0b\\x32#.proto.SpeedUnitFromICEnumAttribute\\x12\\x38\\n\\rsunroof_event\\x18\\xd0\\x01 \\x01(\\x0b\\x32 .proto.SunroofEventEnumAttribute\\x12\\x33\\n\\x14sunroof_event_active\\x18\\xd1\\x01 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12K\\n\\x1asunroof_status_front_blind\\x18\\xd2\\x01 \\x01(\\x0b\\x32&.proto.SunroofStatusBlindEnumAttribute\\x12J\\n\\x19sunroof_status_rear_blind\\x18\\xd3\\x01 \\x01(\\x0b\\x32&.proto.SunroofStatusBlindEnumAttribute\\x12\\x39\\n\\rsunroofstatus\\x18\\xd4\\x01 \\x01(\\x0b\\x32!.proto.SunroofstatusEnumAttribute\\x12\\x37\\n\\x12tank_level_ad_blue\\x18\\xd5\\x01 \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12\\x35\\n\\x10tanklevelpercent\\x18\\xd6\\x01 \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12/\\n\\ntarget_soc\\x18\\xd7\\x01 \\x01(\\x0b\\x32\\x1a.proto.Int64RatioAttribute\\x12[\\n tcu_connection_state_low_channel\\x18\\xd8\\x01 \\x01(\\x0b\\x32\\x30.proto.TcuConnectionStateLowChannelEnumAttribute\\x12\\x44\\n\\x14tcu_thermo_shut_down\\x18\\xd9\\x01 \\x01(\\x0b\\x32%.proto.TcuThermoShutDownEnumAttribute\\x12>\\n\\x14teenage_driving_mode\\x18\\xda\\x01 \\x01(\\x0b\\x32\\x1f.proto.DrivingModeEnumAttribute\\x12\\x43\\n\\x12temperature_points\\x18\\xdb\\x01 \\x01(\\x0b\\x32&.proto.TemperaturePointsArrayAttribute\\x12\\x44\\n\\x14temperature_unit_h_u\\x18\\xdc\\x01 \\x01(\\x0b\\x32%.proto.TemperatureUnitHUEnumAttribute\\x12\\x31\\n\\x12theft_alarm_active\\x18\\xdd\\x01 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12\\x31\\n\\x12theft_system_armed\\x18\\xde\\x01 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12:\\n\\x0ftime_format_h_u\\x18\\xdf\\x01 \\x01(\\x0b\\x32 .proto.TimeFormatHUEnumAttribute\\x12?\\n\\x16tire_marker_front_left\\x18\\xe0\\x01 \\x01(\\x0b\\x32\\x1e.proto.TireMarkerEnumAttribute\\x12@\\n\\x17tire_marker_front_right\\x18\\xe1\\x01 \\x01(\\x0b\\x32\\x1e.proto.TireMarkerEnumAttribute\\x12\\x44\\n\\x1btire_marker_inner_rear_left\\x18\\xe2\\x01 \\x01(\\x0b\\x32\\x1e.proto.TireMarkerEnumAttribute\\x12\\x45\\n\\x1ctire_marker_inner_rear_right\\x18\\xe3\\x01 \\x01(\\x0b\\x32\\x1e.proto.TireMarkerEnumAttribute\\x12>\\n\\x15tire_marker_rear_left\\x18\\xe4\\x01 \\x01(\\x0b\\x32\\x1e.proto.TireMarkerEnumAttribute\\x12?\\n\\x16tire_marker_rear_right\\x18\\xe5\\x01 \\x01(\\x0b\\x32\\x1e.proto.TireMarkerEnumAttribute\\x12\\x46\\n\\x1dtire_pressure_inner_rear_left\\x18\\xe6\\x01 \\x01(\\x0b\\x32\\x1e.proto.DoublePressureAttribute\\x12G\\n\\x1etire_pressure_inner_rear_right\\x18\\xe7\\x01 \\x01(\\x0b\\x32\\x1e.proto.DoublePressureAttribute\\x12G\\n\\x15tire_sensor_available\\x18\\xe8\\x01 \\x01(\\x0b\\x32\\'.proto.TireSensorAvailableEnumAttribute\\x12H\\n\\x16tire_warning_level_prw\\x18\\xe9\\x01 \\x01(\\x0b\\x32\\'.proto.TireWarningLevelPrwEnumAttribute\\x12@\\n\\x17tirepressure_front_left\\x18\\xea\\x01 \\x01(\\x0b\\x32\\x1e.proto.DoublePressureAttribute\\x12\\x41\\n\\x18tirepressure_front_right\\x18\\xeb\\x01 \\x01(\\x0b\\x32\\x1e.proto.DoublePressureAttribute\\x12?\\n\\x16tirepressure_rear_left\\x18\\xec\\x01 \\x01(\\x0b\\x32\\x1e.proto.DoublePressureAttribute\\x12@\\n\\x17tirepressure_rear_right\\x18\\xed\\x01 \\x01(\\x0b\\x32\\x1e.proto.DoublePressureAttribute\\x12=\\n\\x0ftirewarninglamp\\x18\\xee\\x01 \\x01(\\x0b\\x32#.proto.TirewarninglampEnumAttribute\\x12=\\n\\x0ftirewarningsprw\\x18\\xef\\x01 \\x01(\\x0b\\x32#.proto.TirewarningsprwEnumAttribute\\x12=\\n\\x0ftirewarningsrdk\\x18\\xf0\\x01 \\x01(\\x0b\\x32#.proto.TirewarningsrdkEnumAttribute\\x12Y\\n tow_protection_activation_status\\x18\\xf1\\x01 \\x01(\\x0b\\x32..proto.ProtectionActivationStatusEnumAttribute\\x12Z\\n\\x1ftow_protection_selection_status\\x18\\xf2\\x01 \\x01(\\x0b\\x32\\x30.proto.TowProtectionSelectionStatusEnumAttribute\\x12Q\\n\\x1ctow_protection_sensor_status\\x18\\xf3\\x01 \\x01(\\x0b\\x32*.proto.ProtectionSensorStatusEnumAttribute\\x12@\\n\\x12tracking_state_h_u\\x18\\xf4\\x01 \\x01(\\x0b\\x32#.proto.TrackingStateHuEnumAttribute\\x12Q\\n\\x1bturn_off_engine_pre_warning\\x18\\xf5\\x01 \\x01(\\x0b\\x32+.proto.TurnOffEnginePreWarningEnumAttribute\\x12@\\n turn_off_engine_pre_warning_time\\x18\\xf6\\x01 \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12<\\n\\x12valet_driving_mode\\x18\\xf7\\x01 \\x01(\\x0b\\x32\\x1f.proto.DrivingModeEnumAttribute\\x12V\\n\\x1dvehicle_data_connection_state\\x18\\xf8\\x01 \\x01(\\x0b\\x32..proto.VehicleDataConnectionStateEnumAttribute\\x12G\\n\\x15vehicle_health_status\\x18\\xf9\\x01 \\x01(\\x0b\\x32\\'.proto.VehicleHealthStatusEnumAttribute\\x12\\x61\\n#vehicle_theft_alarm_inactive_reason\\x18\\xfa\\x01 \\x01(\\x0b\\x32\\x33.proto.VehicleTheftAlarmInactiveReasonEnumAttribute\\x12%\\n\\x05vtime\\x18\\xfb\\x01 \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12\\x30\\n\\x11warningbrakefluid\\x18\\xfc\\x01 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12\\x35\\n\\x16warningbrakeliningwear\\x18\\xfd\\x01 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12\\x35\\n\\x16warningcoolantlevellow\\x18\\xfe\\x01 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12\\x31\\n\\x12warningenginelight\\x18\\xff\\x01 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12?\\n\\x10warningwashwater\\x18\\x80\\x02 \\x01(\\x0b\\x32$.proto.WarningwashwaterEnumAttribute\\x12<\\n\\x0eweekly_profile\\x18\\x81\\x02 \\x01(\\x0b\\x32#.proto.WeeklyProfileObjectAttribute\\x12\\x39\\n\\x0eweekly_set_h_u\\x18\\x82\\x02 \\x01(\\x0b\\x32 .proto.WeeklySetHUArrayAttribute\\x12H\\n\\x18window_status_rear_blind\\x18\\x83\\x02 \\x01(\\x0b\\x32%.proto.WindowStatusBlindEnumAttribute\\x12M\\n\\x1dwindow_status_rear_left_blind\\x18\\x84\\x02 \\x01(\\x0b\\x32%.proto.WindowStatusBlindEnumAttribute\\x12N\\n\\x1ewindow_status_rear_right_blind\\x18\\x85\\x02 \\x01(\\x0b\\x32%.proto.WindowStatusBlindEnumAttribute\\x12@\\n\\x15windowstatusfrontleft\\x18\\x86\\x02 \\x01(\\x0b\\x32 .proto.WindowstatusEnumAttribute\\x12\\x41\\n\\x16windowstatusfrontright\\x18\\x87\\x02 \\x01(\\x0b\\x32 .proto.WindowstatusEnumAttribute\\x12?\\n\\x14windowstatusrearleft\\x18\\x88\\x02 \\x01(\\x0b\\x32 .proto.WindowstatusEnumAttribute\\x12@\\n\\x15windowstatusrearright\\x18\\x89\\x02 \\x01(\\x0b\\x32 .proto.WindowstatusEnumAttribute\\x12\\x43\\n\\x13\\x64oor_status_overall\\x18\\x8a\\x02 \\x01(\\x0b\\x32%.proto.DoorStatusOverallEnumAttribute\\x12\\x36\\n\\roverall_range\\x18\\x8b\\x02 \\x01(\\x0b\\x32\\x1e.proto.DoubleDistanceAttribute\\x12R\\n3proximity_calculation_for_vehicle_position_required\\x18\\x8c\\x02 \\x01(\\x0b\\x32\\x14.proto.BoolAttribute\\x12G\\n\\x15starter_battery_state\\x18\\x8d\\x02 \\x01(\\x0b\\x32\\'.proto.StarterBatteryStateEnumAttribute\\x12\\x39\\n\\x19tire_press_meas_timestamp\\x18\\x8e\\x02 \\x01(\\x0b\\x32\\x15.proto.Int64Attribute\\x12R\\n\\x1bvehicle_position_error_code\\x18\\x8f\\x02 \\x01(\\x0b\\x32,.proto.VehiclePositionErrorCodeEnumAttribute\\x12G\\n\\x15window_status_overall\\x18\\x90\\x02 \\x01(\\x0b\\x32\\'.proto.WindowStatusOverallEnumAttribute*\\x9d\\x02\\n\\x11\\x41mgStageModeState\\x12+\\n\\'AMG_STAGE_MODE_STATE_STAGING_NOT_ACTIVE\\x10\\x00\\x12.\\n*AMG_STAGE_MODE_STATE_REVERTING_IN_PROGRESS\\x10\\x01\\x12>\\n:AMG_STAGE_MODE_STATE_TRANSFORMING_FINISHED_TRANSFORMED_POS\\x10\\x02\\x12:\\n6AMG_STAGE_MODE_STATE_TRANSFORMING_FINISHED_DEFAULT_POS\\x10\\x03\\x12/\\n+AMG_STAGE_MODE_STATE_TRANSFORMATION_ABORTED\\x10\\x04*\\xb4\\x03\\n\"ChildPresenceDetectionWarningLevel\\x12\\x0e\\n\\nNO_WARNING\\x10\\x00\\x12\\x0b\\n\\x07INITIAL\\x10\\x01\\x12\\x0e\\n\\nESCALATION\\x10\\x02\\x12\\x15\\n\\x11SILENT_ESCALATION\\x10\\x03\\x12#\\n\\x1fWARNING_LEVEL_DEACTIVATED_ERROR\\x10\\x04\\x12#\\n\\x1fWARNING_LEVEL_ACTIVE_ECALL_SOON\\x10\\x05\\x12*\\n&WARNING_LEVEL_ACTIVE_ECALL_TRANSMITTED\\x10\\x06\\x12,\\n(WARNING_LEVEL_ACTIVE_ECALL_NOT_AVAILABLE\\x10\\x07\\x12\\x19\\n\\x15WARNING_LEVEL_DELAYED\\x10\\x08\\x12)\\n%WARNING_LEVEL_ACTIVE_NO_ECALL_SIL_ESC\\x10\\t\\x12%\\n!WARNING_LEVEL_ACTIVE_NO_ECALL_ESC\\x10\\n\\x12\\x39\\n5WARNING_LEVEL_ACTIVE_ECALL_NOT_AVAILABLE_SECOND_STAGE\\x10\\x0b*\\x9a\\x04\\n&ChildPresenceDetectionWarningLastEvent\\x12\\x16\\n\\x12NO_WARNING_INITIAL\\x10\\x00\\x12\\'\\n#WARNING_ACTIVE_TEMPERATURE_DECREASE\\x10\\x01\\x12\\'\\n#WARNING_ACTIVE_TEMPERATURE_INCREASE\\x10\\x02\\x12\\x1e\\n\\x1aWARNING_ACTIVE_BATTERY_LOW\\x10\\x03\\x12\\x1d\\n\\x19WARNING_ACTIVE_ECALL_SOON\\x10\\x04\\x12$\\n WARNING_ACTIVE_ECALL_TRANSMITTED\\x10\\x05\\x12\\x17\\n\\x13WARNING_DEACTIVATED\\x10\\x06\\x12\\x17\\n\\x13NO_WARNING_NO_EVENT\\x10\\x07\\x12\\x13\\n\\x0fWARNING_DELAYED\\x10\\x08\\x12\\x1f\\n\\x1bWARNING_DEACTIVATED_BATTERY\\x10\\t\\x12\\x1d\\n\\x19WARNING_DEACTIVATED_ERROR\\x10\\n\\x12\\x1e\\n\\x1aWARNING_DEACTIVATED_UNLOCK\\x10\\x0b\\x12&\\n\"WARNING_ACTIVE_ECALL_NOT_AVAILABLE\\x10\\x0c\\x12\\x38\\n4WARNING_ACTIVE_ECALL_NOT_AVAILABLE_PUSH_NOTIFICATION\\x10\\r\\x12\\x18\\n\\x14\\x43\\x41MERA_NOT_AVAILABLE\\x10\\x0e*\\x7f\\n\\x17KeylineActivationStates\\x12$\\n UNKNOWN_KEYLINE_ACTIVATION_STATE\\x10\\x00\\x12\\x0e\\n\\nALL_ACTIVE\\x10\\x01\\x12\\x19\\n\\x15SELECTIVE_DEACTIVATED\\x10\\x02\\x12\\x13\\n\\x0f\\x41LL_DEACTIVATED\\x10\\x03*\\xb7\\x01\\n\\x1fPerformanceLimitationModeStatus\\x12\\x12\\n\\x0ePLM_NO_WARNING\\x10\\x00\\x12\\x15\\n\\x11SVH_EVENT_MANAGED\\x10\\x01\\x12\\x11\\n\\rPLM_REQUESTED\\x10\\x02\\x12\\x1c\\n\\x18PLM_SUCCESSFUL_REQUESTED\\x10\\x03\\x12\\x16\\n\\x12PLM_NOT_AUTHORIZED\\x10\\x04\\x12\\r\\n\\tPLM_ERROR\\x10\\x05\\x12\\x11\\n\\rPLM_INCAPABLE\\x10\\x06*\\xaa\\x02\\n\\x18\\x45xteriorMonitoringStatus\\x12\\x0c\\n\\x08\\x45XM_IDLE\\x10\\x00\\x12\\x0f\\n\\x0b\\x45XM_WAKE_UP\\x10\\x01\\x12\\x19\\n\\x15\\x45XM_REQUEST_SUBMITTED\\x10\\x02\\x12\\x11\\n\\rEXM_RECORDING\\x10\\x03\\x12\\x10\\n\\x0c\\x45XM_ANNOUNCE\\x10\\x04\\x12\\x11\\n\\rEXM_UPLOADING\\x10\\x05\\x12\\x11\\n\\rEXM_COMPLETED\\x10\\x06\\x12\\x19\\n\\x15\\x45XM_AE_REQUEST_DENIED\\x10\\x65\\x12\\x14\\n\\x10\\x45XM_AE_INCAPABLE\\x10j\\x12\\x14\\n\\x10\\x45XM_AE_OVERRULED\\x10l\\x12!\\n\\x1d\\x45XM_AE_PLAY_PROTECTION_ACTIVE\\x10n\\x12\\x1f\\n\\x1b\\x45XM_AE_PRECONDITION_MISSING\\x10o*\\xc3\\x02\\n\\x18InteriorMonitoringStatus\\x12\\x0c\\n\\x08INM_IDLE\\x10\\x00\\x12\\x0f\\n\\x0bINM_WAKE_UP\\x10\\x01\\x12\\x11\\n\\rINM_RECORDING\\x10\\x02\\x12\\x15\\n\\x11INM_PICTURE_TAKEN\\x10\\x03\\x12\\x10\\n\\x0cINM_ANNOUNCE\\x10\\x04\\x12\\x11\\n\\rINM_UPLOADING\\x10\\x05\\x12\\x11\\n\\rINM_COMPLETED\\x10\\x06\\x12\\x15\\n\\x11INM_CAMERA_BROKEN\\x10\\x65\\x12\\x13\\n\\x0fINM_MEMORY_FULL\\x10g\\x12\\x1b\\n\\x17INM_PRIVACY_MODE_ACTIVE\\x10i\\x12\\x1f\\n\\x1bINM_PICTURE_TAKING_DISABLED\\x10j\\x12\\x18\\n\\x14INM_ACTIVE_BURSTMODE\\x10l\\x12\"\\n\\x1eINM_PICTURE_TAKING_INTERRUPTED\\x10n*\\xd1\\x01\\n\\x0cUpdateStatus\\x12\\x19\\n\\x15UPDATE_STATUS_UNKNOWN\\x10\\x00\\x12\\x17\\n\\x13\\x41WAIT_REPROGRAMMING\\x10\\x01\\x12!\\n\\x1d\\x41WAIT_REPROGRAMMING_STARTABLE\\x10\\x02\\x12\\x11\\n\\rREPROG_ACTIVE\\x10\\x03\\x12\\r\\n\\tPOSTPONED\\x10\\x04\\x12\\x0e\\n\\nSUCCESSFUL\\x10\\x05\\x12\\x0b\\n\\x07\\x46\\x41ILURE\\x10\\x06\\x12\\t\\n\\x05PANIC\\x10\\x07\\x12\\t\\n\\x05\\x45RROR\\x10\\x08\\x12\\x15\\n\\x11\\x43ONFIRMED_STARTED\\x10\\t*U\\n\\x15SohCalibrationPlanned\\x12\\x1f\\n\\x1bSOH_CALIBRATION_NOT_PLANNED\\x10\\x00\\x12\\x1b\\n\\x17SOH_CALIBRATION_PLANNED\\x10\\x01*\\x89\\x02\\n\\x11\\x44\\x63\\x43hargingProfile\\x12\\x1f\\n\\x1b\\x44\\x43_CHARGING_PROFILE_UNKNOWN\\x10\\x00\\x12 \\n\\x1c\\x44\\x43_CHARGING_PROFILE_STANDARD\\x10\\x01\\x12%\\n!DC_CHARGING_PROFILE_SILENT_OR_ECO\\x10\\x02\\x12!\\n\\x1d\\x44\\x43_CHARGING_PROFILE_ULTRAFAST\\x10\\x03\\x12\\x1f\\n\\x1b\\x44\\x43_CHARGING_PROFILE_PITSTOP\\x10\\x04\\x12\"\\n\\x1e\\x44\\x43_CHARGING_PROFILE_FAST_ECO_1\\x10\\x05\\x12\"\\n\\x1e\\x44\\x43_CHARGING_PROFILE_FAST_ECO_2\\x10\\x06*\\x9e\\x03\\n\"ParkEventPictureTransmissionStatus\\x12/\\n+PARK_EVENT_PICTURE_TRANSMISSION_STATUS_IDLE\\x10\\x00\\x12\\x32\\n.PARK_EVENT_PICTURE_TRANSMISSION_STATUS_WAKE_UP\\x10\\x01\\x12<\\n8PARK_EVENT_PICTURE_TRANSMISSION_STATUS_REQUEST_SUBMITTED\\x10\\x02\\x12\\x34\\n0PARK_EVENT_PICTURE_TRANSMISSION_STATUS_RECORDING\\x10\\x03\\x12\\x33\\n/PARK_EVENT_PICTURE_TRANSMISSION_STATUS_ANNOUNCE\\x10\\x04\\x12\\x34\\n0PARK_EVENT_PICTURE_TRANSMISSION_STATUS_UPLOADING\\x10\\x05\\x12\\x34\\n0PARK_EVENT_PICTURE_TRANSMISSION_STATUS_COMPLETED\\x10\\x06*\\x93\\x0e\\n\\x19\\x43hargingScheduleUseCaseId\\x12\\x30\\n,CHARGING_SCHEDULE_USE_CASE_ID_SMART_CHARGING\\x10\\x00\\x12?\\n;CHARGING_SCHEDULE_USE_CASE_ID_MERCEDES_INTELLIGENT_CHARGING\\x10\\x01\\x12\\x39\\n5CHARGING_SCHEDULE_USE_CASE_ID_BETA_COMMUNITY_CHARGING\\x10\\x02\\x12\\x30\\n,CHARGING_SCHEDULE_USE_CASE_ID_SOLAR_CHARGING\\x10\\n\\x12\\x30\\n,CHARGING_SCHEDULE_USE_CASE_ID_GREEN_CHARGING\\x10\\x0b\\x12\\x34\\n0CHARGING_SCHEDULE_USE_CASE_ID_EFFICIENT_CHARGING\\x10\\x0c\\x12\\x37\\n3CHARGING_SCHEDULE_USE_CASE_ID_ECO_FRIENDLY_CHARGING\\x10\\r\\x12\\x36\\n2CHARGING_SCHEDULE_USE_CASE_ID_SUSTAINABLE_CHARGING\\x10\\x0e\\x12\\x36\\n2CHARGING_SCHEDULE_USE_CASE_ID_INTELLIGENT_CHARGING\\x10\\x0f\\x12\\x39\\n5CHARGING_SCHEDULE_USE_CASE_ID_WORKPLACE_CHARGING_PLAN\\x10\\x10\\x12\\x34\\n0CHARGING_SCHEDULE_USE_CASE_ID_HOME_CHARGING_PLAN\\x10\\x11\\x12\\x38\\n4CHARGING_SCHEDULE_USE_CASE_ID_FLEET_MANAGED_CHARGING\\x10\\x12\\x12:\\n6CHARGING_SCHEDULE_USE_CASE_ID_PRICE_OPTIMIZED_CHARGING\\x10\\x13\\x12;\\n7CHARGING_SCHEDULE_USE_CASE_ID_BATTERY_FRIENDLY_CHARGING\\x10\\x14\\x12\\x43\\n?CHARGING_SCHEDULE_USE_CASE_ID_EXTERNAL_NOISE_OPTIMIZED_CHARGING\\x10\\x15\\x12\\x43\\n?CHARGING_SCHEDULE_USE_CASE_ID_VIDEO_WATCHING_OPTIMIZED_CHARGING\\x10\\x16\\x12:\\n6CHARGING_SCHEDULE_USE_CASE_ID_TIME_CONTROLLED_CHARGING\\x10\\x17\\x12\\x37\\n3CHARGING_SCHEDULE_USE_CASE_ID_PEAK_SHAVING_CHARGING\\x10\\x18\\x12@\\n<CHARGING_SCHEDULE_USE_CASE_ID_DYNAMIC_LOAD_BALANCED_CHARGING\\x10\\x19\\x12<\\n8CHARGING_SCHEDULE_USE_CASE_ID_BUSINESS_SPECIFIC_CHARGING\\x10\\x1a\\x12:\\n6CHARGING_SCHEDULE_USE_CASE_ID_PREFERRED_CHARGING_TIMES\\x10\\x1b\\x12\\'\\n#CHARGING_SCHEDULE_USE_CASE_ID_ENPAL\\x10\\x64\\x12(\\n$CHARGING_SCHEDULE_USE_CASE_ID_TIBBER\\x10\\x65\\x12\\x34\\n0CHARGING_SCHEDULE_USE_CASE_ID_THE_MOBILITY_HOUSE\\x10\\x66\\x12)\\n%CHARGING_SCHEDULE_USE_CASE_ID_AWATTAR\\x10g\\x12)\\n%CHARGING_SCHEDULE_USE_CASE_ID_TRONITY\\x10h\\x12&\\n!CHARGING_SCHEDULE_USE_CASE_ID_DPD\\x10\\xc8\\x01\\x12\\x30\\n+CHARGING_SCHEDULE_USE_CASE_ID_DEUTSCHE_POST\\x10\\xc9\\x01\\x12,\\n\\'CHARGING_SCHEDULE_USE_CASE_ID_HACKATHON\\x10\\xfa\\x01\\x12/\\n*CHARGING_SCHEDULE_USE_CASE_ID_SANDBOX_MODE\\x10\\xfb\\x01\\x12\\x31\\n,CHARGING_SCHEDULE_USE_CASE_ID_DEVELOPER_MODE\\x10\\xfc\\x01\\x12,\\n\\'CHARGING_SCHEDULE_USE_CASE_ID_TEST_MODE\\x10\\xfd\\x01\\x12-\\n(CHARGING_SCHEDULE_USE_CASE_ID_DEBUG_MODE\\x10\\xfe\\x01*S\\n\\x10ScheduleIdStatus\\x12\\x1e\\n\\x1aSCHEDULE_ID_STATUS_INITIAL\\x10\\x00\\x12\\x1f\\n\\x1aSCHEDULE_ID_STATUS_DELETED\\x10\\xd2\\x01*\\x92\\x01\\n\\x15SocCalibrationRequest\\x12&\\n\"SOC_CALIBRATION_REQUEST_NO_REQUEST\\x10\\x00\\x12\\'\\n#SOC_CALIBRATION_REQUEST_LOW_REQUEST\\x10\\x01\\x12(\\n$SOC_CALIBRATION_REQUEST_HIGH_REQUEST\\x10\\x02*\\xa6\\x01\\n\\x16SohFavorableConditions\\x12*\\n&SOH_FAVORABLE_CONDITIONS_NOT_FAVORABLE\\x10\\x00\\x12/\\n+SOH_FAVORABLE_CONDITIONS_FAVOURABLE_LEVEL_1\\x10\\x01\\x12/\\n+SOH_FAVORABLE_CONDITIONS_FAVOURABLE_LEVEL_2\\x10\\x02*\\x8f\\x01\\n\\x18\\x43hargingStopErrorDetails\\x12\\x38\\n4CHARGING_STOP_ERROR_DETAILS_NO_INFO_OR_ERROR_MESSAGE\\x10\\x00\\x12\\x39\\n5CHARGING_STOP_ERROR_DETAILS_CHARGE_STOP_BUTTON_DEFECT\\x10\\x01*\\xfe\\x04\\n\\x13SohCalibrationState\\x12$\\n SOH_CALIBRATION_STATE_NOT_ACTIVE\\x10\\x00\\x12 \\n\\x1cSOH_CALIBRATION_STATE_ACTIVE\\x10\\x01\\x12$\\n SOH_CALIBRATION_STATE_SUCCESSFUL\\x10\\x02\\x12-\\n)SOH_CALIBRATION_STATE_BMS_UNDEFINED_ERROR\\x10\\x03\\x12/\\n+SOH_CALIBRATION_STATE_BMS_TEMPERATURE_ERROR\\x10\\x04\\x12\\x36\\n2SOH_CALIBRATION_STATE_NO_CUSTOMER_PERMISSION_ERROR\\x10\\x05\\x12?\\n;SOH_CALIBRATION_STATE_NOT_ENOUGH_TIME_UNTIL_DEPARTURE_ERROR\\x10\\x06\\x12.\\n*SOH_CALIBRATION_STATE_USER_CANCELLED_ERROR\\x10\\x07\\x12:\\n6SOH_CALIBRATION_STATE_CHARGING_PROCESS_CANCELLED_ERROR\\x10\\x08\\x12@\\n<SOH_CALIBRATION_STATE_CHARGING_INFRASTRUCTURE_PROTOCOL_ERROR\\x10\\t\\x12G\\nCSOH_CALIBRATION_STATE_CHARGING_INFRASTRUCTURE_POWER_REDUCTION_ERROR\\x10\\n\\x12)\\n%SOH_CALIBRATION_STATE_UNDEFINED_ERROR\\x10\\x0b*X\\n\\x16SohCalibrationRequired\\x12 \\n\\x1cSOH_CALIBRATION_NOT_REQUIRED\\x10\\x00\\x12\\x1c\\n\\x18SOH_CALIBRATION_REQUIRED\\x10\\x01*\\x92\\x01\\n\\x15SohCalibrationRequest\\x12&\\n\"SOH_CALIBRATION_REQUEST_NO_REQUEST\\x10\\x00\\x12\\'\\n#SOH_CALIBRATION_REQUEST_LOW_REQUEST\\x10\\x01\\x12(\\n$SOH_CALIBRATION_REQUEST_HIGH_REQUEST\\x10\\x02*\\x8f\\x01\\n\\x17TurnOffEnginePreWarning\\x12\\x15\\n\\x11NO_MESSAGE_ACTIVE\\x10\\x00\\x12,\\n(VEHICLE_READY_AUTOMATIC_SHUTDOWN_ON_LOCK\\x10\\x01\\x12/\\n+VEHICLE_READY_AUTOMATIC_SHUTDOWN_ON_TIMEOUT\\x10\\x02*\\xd1\\x02\\n\\x1bSohCalibrationNotifications\\x12>\\n:SOH_CALIBRATION_NOTIFICATIONS_NO_SOH_CALIBRATION_NECESSARY\\x10\\x00\\x12;\\n7SOH_CALIBRATION_NOTIFICATIONS_SEND_NOTIFICATION_LEVEL_1\\x10\\x01\\x12;\\n7SOH_CALIBRATION_NOTIFICATIONS_SEND_NOTIFICATION_LEVEL_2\\x10\\x02\\x12;\\n7SOH_CALIBRATION_NOTIFICATIONS_SEND_NOTIFICATION_LEVEL_3\\x10\\x03\\x12;\\n7SOH_CALIBRATION_NOTIFICATIONS_SEND_NOTIFICATION_LEVEL_4\\x10\\x04*\\xe5\\x02\\n!HvBatteryPrecondStatesDischarging\\x12\\x18\\n\\x14\\x44ISCHARGING_INACTIVE\\x10\\x00\\x12\\x1e\\n\\x1a\\x44ISCHARGING_HEATING_ACTIVE\\x10\\x01\\x12\"\\n\\x1e\\x44ISCHARGING_HEATING_SUCCESSFUL\\x10\\x02\\x12&\\n\"DISCHARGING_HEATING_NOT_SUFFICIENT\\x10\\x03\\x12&\\n\"DISCHARGING_HEATING_RECOMMENDATION\\x10\\x04\\x12\\x1e\\n\\x1a\\x44ISCHARGING_COOLING_ACTIVE\\x10\\x05\\x12\"\\n\\x1e\\x44ISCHARGING_COOLING_SUCCESSFUL\\x10\\x06\\x12&\\n\"DISCHARGING_COOLING_NOT_SUFFICIENT\\x10\\x07\\x12&\\n\"DISCHARGING_COOLING_RECOMMENDATION\\x10\\x08*\\xcf\\x02\\n\\x1eHvBatteryPrecondStatesCharging\\x12\\x1d\\n\\x19\\x43HARGING_HEATING_INACTIVE\\x10\\x00\\x12\\x1b\\n\\x17\\x43HARGING_HEATING_ACTIVE\\x10\\x01\\x12\\x1f\\n\\x1b\\x43HARGING_HEATING_SUCCESSFUL\\x10\\x02\\x12#\\n\\x1f\\x43HARGING_HEATING_NOT_SUFFICIENT\\x10\\x03\\x12#\\n\\x1f\\x43HARGING_HEATING_RECOMMENDATION\\x10\\x04\\x12\\x1b\\n\\x17\\x43HARGING_COOLING_ACTIVE\\x10\\x05\\x12\\x1f\\n\\x1b\\x43HARGING_COOLING_SUCCESSFUL\\x10\\x06\\x12#\\n\\x1f\\x43HARGING_COOLING_NOT_SUFFICIENT\\x10\\x07\\x12#\\n\\x1f\\x43HARGING_COOLING_RECOMMENDATION\\x10\\x08*\\xc3\\x01\\n\\x0cMainCategory\\x12\\x18\\n\\x14MAIN_CATEGORY_SERVER\\x10\\x00\\x12\\x15\\n\\x11MAIN_CATEGORY_HMI\\x10\\x01\\x12 \\n\\x1cMAIN_CATEGORY_VEHICLE_SYSTEM\\x10\\x02\\x12\\x1d\\n\\x19MAIN_CATEGORY_DIAGNOSTICS\\x10\\x03\\x12\\x18\\n\\x14MAIN_CATEGORY_REMOTE\\x10\\x04\\x12\\'\\n#MAIN_CATEGORY_CONTAINER_APPLICATION\\x10\\x05*N\\n\\x0bSubCategory\\x12\\x18\\n\\x14SUB_CATEGORY_UNKNOWN\\x10\\x00\\x12%\\n!SUB_CATEGORY_BATTERY_CONDITIONING\\x10\\x01*_\\n\\x10SpecificCategory\\x12\\x1d\\n\\x19SPECIFIC_CATEGORY_UNKNOWN\\x10\\x00\\x12,\\n(SPECIFIC_CATEGORY_PRECONDITIONING_BUTTON\\x10\\x01*\\xa1\\x01\\n\\x06Method\\x12(\\n$METHOD_COND_REQ_TO_REACH_TARGET_TEMP\\x10\\x00\\x12)\\n%METHOD_COND_REQ_TO_REACH_TARGET_POWER\\x10\\x01\\x12$\\n METHOD_OMIT_CONDITIONING_REQUEST\\x10\\x02\\x12\\x1c\\n\\x18METHOD_SET_CONFIGURATION\\x10\\x03*\\x95\\x01\\n\\x06Status\\x12\\x0c\\n\\x08STATE_OK\\x10\\x00\\x12\\x1b\\n\\x17STATE_UNSPECIFIED_ERROR\\x10\\x01\\x12$\\n STATE_CONDITIONING_NOT_NECESSARY\\x10\\x02\\x12\\x1d\\n\\x19STATE_TIME_NOT_SUFFICIENT\\x10\\x03\\x12\\x1b\\n\\x17STATE_BATTERY_LEVEL_LOW\\x10\\x04*\\xba\\x04\\n\\x1cHvBatteryPrecondAvailability\\x12\\x31\\n-HV_BATTERY_PRECOND_AVAILABILITY_NOT_AVAILABLE\\x10\\x00\\x12\\x33\\n/HV_BATTERY_PRECOND_AVAILABILITY_FULLY_AVAILABLE\\x10\\x01\\x12\\x45\\nAHV_BATTERY_PRECOND_AVAILABILITY_TEMPORARILY_NOT_AVAILABLE_LOW_SOC\\x10\\x02\\x12J\\nFHV_BATTERY_PRECOND_AVAILABILITY_TEMPORARILY_NOT_AVAILABLE_MECHATRONICS\\x10\\x03\\x12Q\\nMHV_BATTERY_PRECOND_AVAILABILITY_TEMPORARILY_NOT_AVAILABLE_BATTERY_TEMPERATURE\\x10\\x04\\x12=\\n9HV_BATTERY_PRECOND_AVAILABILITY_LIMITED_AVAILABLE_LOW_SOC\\x10\\x05\\x12\\x42\\n>HV_BATTERY_PRECOND_AVAILABILITY_LIMITED_AVAILABLE_MECHATRONICS\\x10\\x06\\x12I\\nEHV_BATTERY_PRECOND_AVAILABILITY_LIMITED_AVAILABLE_BATTERY_TEMPERATURE\\x10\\x07*\\xe1\\x03\\n\\x10\\x45vsePairingState\\x12\\x1b\\n\\x17\\x45VSE_PAIRING_STATE_IDLE\\x10\\x00\\x12\\x1f\\n\\x1b\\x45VSE_PAIRING_STATE_FINISHED\\x10\\x01\\x12\\'\\n#EVSE_PAIRING_STATE_FAILED_TLS_ERROR\\x10\\x02\\x12%\\n!EVSE_PAIRING_STATE_FAILED_TIMEOUT\\x10\\x03\\x12\\x30\\n,EVSE_PAIRING_STATE_FAILED_NO_INDEX_AVAILABLE\\x10\\x04\\x12&\\n\"EVSE_PAIRING_STATE_PROCESS_ONGOING\\x10\\x05\\x12&\\n\"EVSE_PAIRING_STATE_PROCESS_STOPPED\\x10\\x06\\x12\\x30\\n,EVSE_PAIRING_STATE_CERTIFICATE_NOT_INSTALLED\\x10\\x07\\x12:\\n6EVSE_PAIRING_STATE_PAIRING_SERVICE_NOT_OFFERED_BY_EVSE\\x10\\x08\\x12O\\nKEVSE_PAIRING_STATE_BIDIRECTIONAL_POWER_TRANSFER_SERVICE_NOT_OFFERED_BY_EVSE\\x10\\t*U\\n\\x14\\x45mergencyPowerSupply\\x12\\x1e\\n\\x1a\\x45MERGENCY_POWER_SUPPLY_OFF\\x10\\x00\\x12\\x1d\\n\\x19\\x45MERGENCY_POWER_SUPPLY_ON\\x10\\x01*\\x8f\\x01\\n\"ParkCollisionPictureTransferStatus\\x12\\x34\\n0PARK_COLLISION_PICTURE_TRANSFER_STATUS_DESELETED\\x10\\x00\\x12\\x33\\n/PARK_COLLISION_PICTURE_TRANSFER_STATUS_SELECTED\\x10\\x01*f\\n\\x16PictureRecordingStatus\\x12\\'\\n#PICTURE_RECORDING_STATUS_NOT_ACTIVE\\x10\\x00\\x12#\\n\\x1fPICTURE_RECORDING_STATUS_ACTIVE\\x10\\x01*\\x96\\x04\\n\\x1bParkCollisionInactiveReason\\x12+\\n\\'PARK_COLLISION_INACTIVE_REASON_DISABLED\\x10\\x00\\x12=\\n9PARK_COLLISION_INACTIVE_REASON_WAIT_FOR_SYSTEM_ACTIVATION\\x10\\x01\\x12\\x30\\n,PARK_COLLISION_INACTIVE_REASON_SYSTEM_ACTIVE\\x10\\x02\\x12\\x35\\n1PARK_COLLISION_INACTIVE_REASON_TRUNK_OR_DOOR_OPEN\\x10\\x03\\x12-\\n)PARK_COLLISION_INACTIVE_REASON_DESELECTED\\x10\\x04\\x12\\x32\\n.PARK_COLLISION_INACTIVE_REASON_COLLISION_LIMIT\\x10\\x05\\x12\\x32\\n.PARK_COLLISION_INACTIVE_REASON_MONITORING_TIME\\x10\\x06\\x12\\x37\\n3PARK_COLLISION_INACTIVE_REASON_CONVERTIBLE_TOP_OPEN\\x10\\x07\\x12(\\n$PARK_COLLISION_INACTIVE_REASON_TEST1\\x10\\x08\\x12(\\n$PARK_COLLISION_INACTIVE_REASON_TEST2\\x10\\t*{\\n\\x1cParkCollisionSelectionStatus\\x12-\\n)PARK_COLLISION_SELECTION_STATUS_DESELETED\\x10\\x00\\x12,\\n(PARK_COLLISION_SELECTION_STATUS_SELECTED\\x10\\x01*\\xe9\\x01\\n\\x1fVehicleTheftAlarmInactiveReason\\x12\\x30\\n,VEHICLE_THEFT_ALARM_INACTIVE_REASON_NO_ERROR\\x10\\x00\\x12\\x31\\n-VEHICLE_THEFT_ALARM_INACTIVE_REASON_SIREN_COM\\x10\\x01\\x12\\x31\\n-VEHICLE_THEFT_ALARM_INACTIVE_REASON_SIREN_BAT\\x10\\x02\\x12.\\n*VEHICLE_THEFT_ALARM_INACTIVE_REASON_SENSOR\\x10\\x03*\\x9d\\x01\\n\\x1dTowProtectionActivationStatus\\x12(\\n$TOW_PROTECTION_ACTIVATION_STATUS_OFF\\x10\\x00\\x12\\'\\n#TOW_PROTECTION_ACTIVATION_STATUS_ON\\x10\\x01\\x12)\\n%TOW_PROTECTION_ACTIVATION_STATUS_INIT\\x10\\x02*{\\n\\x1cTowProtectionSelectionStatus\\x12-\\n)TOW_PROTECTION_SELECTION_STATUS_DESELETED\\x10\\x00\\x12,\\n(TOW_PROTECTION_SELECTION_STATUS_SELECTED\\x10\\x01*\\xb1\\x01\\n\"InteriorProtectionActivationStatus\\x12-\\n)INTERIOR_PROTECTION_ACTIVATION_STATUS_OFF\\x10\\x00\\x12,\\n(INTERIOR_PROTECTION_ACTIVATION_STATUS_ON\\x10\\x01\\x12.\\n*INTERIOR_PROTECTION_ACTIVATION_STATUS_INIT\\x10\\x02*\\x8a\\x01\\n!InteriorProtectionSelectionStatus\\x12\\x32\\n.INTERIOR_PROTECTION_SELECTION_STATUS_DESELETED\\x10\\x00\\x12\\x31\\n-INTERIOR_PROTECTION_SELECTION_STATUS_SELECTED\\x10\\x01*^\\n\\x10PanicAlarmActive\\x12 \\n\\x1cPANIC_ALARM_ACTIVE_CONFIRMED\\x10\\x00\\x12(\\n$PANIC_ALARM_ACTIVE_NOT_YET_CONFIRMED\\x10\\x01*\\x89\\x01\\n\\x1fParkEventPictureSelectionStatus\\x12\\x34\\n0PARK_EVENT_PICTURE_SELECTION_STATUS_NOT_SELECTED\\x10\\x00\\x12\\x30\\n,PARK_EVENT_PICTURE_SELECTION_STATUS_SELECTED\\x10\\x01*\\x9d\\x01\\n\\x1dParkCollisionActivationStatus\\x12(\\n$PARK_COLLISION_ACTIVATION_STATUS_OFF\\x10\\x00\\x12\\'\\n#PARK_COLLISION_ACTIVATION_STATUS_ON\\x10\\x01\\x12)\\n%PARK_COLLISION_ACTIVATION_STATUS_INIT\\x10\\x02*\\xf7\\x02\\n\\x1a\\x43hargingCompatibilityError\\x12(\\n$CHARGING_COMPATIBILITY_ERROR_DEFAULT\\x10\\x00\\x12\\x33\\n/CHARGING_COMPATIBILITY_ERROR_FULL_COMPATIBILITY\\x10\\x01\\x12L\\nHCHARGING_COMPATIBILITY_ERROR_FULL_COMPATIBILITY_WITH_ADDITIONAL_HARDWARE\\x10\\x02\\x12\\x30\\n,CHARGING_COMPATIBILITY_PARTIAL_COMPATIBILITY\\x10\\x03\\x12G\\nCCHARGING_COMPATIBILITY_PARTIAL_COMPATIBILITY_WITH_ADDITIONAL_DEVICE\\x10\\x04\\x12\\x31\\n-CHARGING_COMPATIBILITY_ERROR_NO_COMPATIBILITY\\x10\\x05*\\xa6\\x03\\n\\x18\\x43hargingFlapErrorDetails\\x12\\x38\\n4CHARGING_FLAP_ERROR_DETAILS_NO_INFO_OR_ERROR_MESSAGE\\x10\\x00\\x12>\\n:CHARGING_FLAP_ERROR_DETAILS_OPENING_DEFECT_SEARCH_WORKSHOP\\x10\\x01\\x12\\'\\n#CHARGING_FLAP_ERROR_DETAILS_BLOCKED\\x10\\x02\\x12<\\n8CHARGING_FLAP_ERROR_DETAILS_DRIVING_POSITION_NOT_PARKING\\x10\\x03\\x12-\\n)CHARGING_FLAP_ERROR_DETAILS_STATE_UNKNOWN\\x10\\x04\\x12\\x38\\n4CHARGING_FLAP_ERROR_DETAILS_PRESSED_DETECTION_DEFECT\\x10\\x05\\x12@\\n<CHARGING_FLAP_ERROR_DETAILS_CLOSING_OF_AUTOMATED_FLAP_DEFECT\\x10\\x06*\\xe8\\x01\\n\\x18\\x43hargeFlapsPositionState\\x12\\'\\n#CHARGE_FLAPS_POSITION_STATE_DEFAULT\\x10\\x00\\x12$\\n CHARGE_FLAPS_POSITION_STATE_OPEN\\x10\\x01\\x12&\\n\"CHARGE_FLAPS_POSITION_STATE_CLOSED\\x10\\x02\\x12,\\n(CHARGE_FLAPS_POSITION_STATE_FLAP_PRESSED\\x10\\x03\\x12\\'\\n#CHARGE_FLAPS_POSITION_STATE_UNKNOWN\\x10\\x04*\\xb4\\x05\\n\\x18\\x43hargingPowerRestriction\\x12-\\n)CHARGING_POWER_RESTRICTION_NO_RESTRICTION\\x10\\x00\\x12\\x32\\n.CHARGING_POWER_RESTRICTION_ECO_CHARGING_ACTIVE\\x10\\x01\\x12>\\n:CHARGING_POWER_RESTRICTION_REDUCED_DUE_TO_CUSTOMER_SETTING\\x10\\x02\\x12\\x45\\nACHARGING_POWER_RESTRICTION_REDUCED_DUE_TO_VEHICLE_CHARGING_SYSTEM\\x10\\x03\\x12<\\n8CHARGING_POWER_RESTRICTION_REDUCED_DUE_TO_REMOTE_CONTROL\\x10\\x04\\x12\\x45\\nACHARGING_POWER_RESTRICTION_REDUCED_DUE_TO_CHARGING_INFRASTRUCTURE\\x10\\x05\\x12?\\n;CHARGING_POWER_RESTRICTION_REDUCED_DUE_TO_CHARGING_STRATEGY\\x10\\x06\\x12\\x36\\n2CHARGING_POWER_RESTRICTION_STATE_OF_CHARGE_TOO_LOW\\x10\\x07\\x12\\x37\\n3CHARGING_POWER_RESTRICTION_STATE_OF_CHARGE_TOO_HIGH\\x10\\x08\\x12:\\n6CHARGING_POWER_RESTRICTION_BATTERY_TEMPERATURE_TOO_LOW\\x10\\t\\x12;\\n7CHARGING_POWER_RESTRICTION_BATTERY_TEMPERATURE_TOO_HIGH\\x10\\n*\\xce\\x02\\n\\rBatteryHealth\\x12\\x17\\n\\x13\\x42\\x41TTERY_GREEN_STATE\\x10\\x00\\x12\\x18\\n\\x14\\x42\\x41TTERY_YELLOW_STATE\\x10\\x01\\x12\\x15\\n\\x11\\x42\\x41TTERY_RED_STATE\\x10\\x02\\x12\\x1e\\n\\x1aISSUE_WITH_DATA_EVALUATION\\x10\\x03\\x12\\x1a\\n\\x16NO_EVALUATION_POSSIBLE\\x10\\x04\\x12\\x13\\n\\x0f\\x42\\x41TTERY_CHANGED\\x10\\x05\\x12\\'\\n#BATTERY_HEALTH_CANNOT_BE_CALCULATED\\x10\\x06\\x12\\x1a\\n\\x16NO_MB_ORIGINAL_BATTERY\\x10\\x07\\x12%\\n!TECHNICAL_LIMITATION_FROM_VEHICLE\\x10\\x08\\x12\\x1b\\n\\x17GENERAL_TECHNICAL_ERROR\\x10\\t\\x12\\x19\\n\\x15GENERAL_PROCESS_ERROR\\x10\\n*\\xb1\\x01\\n\\x10PrecondStateType\\x12 \\n\\x1cPRECOND_STATE_TYPE_ON_UNLOCK\\x10\\x00\\x12(\\n$PRECOND_STATE_TYPE_AT_DEPARTURE_TIME\\x10\\x01\\x12 \\n\\x1cPRECOND_STATE_TYPE_IMMEDIATE\\x10\\x02\\x12/\\n+PRECOND_STATE_TYPE_CHILD_PRESENCE_DETECTION\\x10\\x03*y\\n\\rChargeProgram\\x12\\x1a\\n\\x16\\x44\\x45\\x46\\x41ULT_CHARGE_PROGRAM\\x10\\x00\\x12\\x1a\\n\\x16INSTANT_CHARGE_PROGRAM\\x10\\x01\\x12\\x17\\n\\x13HOME_CHARGE_PROGRAM\\x10\\x02\\x12\\x17\\n\\x13WORK_CHARGE_PROGRAM\\x10\\x03*f\\n\\x0f\\x41ttributeStatus\\x12\\x0f\\n\\x0bVALUE_VALID\\x10\\x00\\x12\\x16\\n\\x12VALUE_NOT_RECEIVED\\x10\\x01\\x12\\x11\\n\\rVALUE_INVALID\\x10\\x03\\x12\\x17\\n\\x13VALUE_NOT_AVAILABLE\\x10\\x04*g\\n\\x05Scope\\x12\\x08\\n\\x04USER\\x10\\x00\\x12\\x12\\n\\x0eONBOARD_FENCES\\x10\\x01\\x12\\x0c\\n\\x08USER_PIN\\x10\\x03\\x12\\x18\\n\\x14SERVICE_PREREQUISITE\\x10\\x04\\x12\\x18\\n\\x14USER_PROFILE_PICTURE\\x10\\x05*8\\n\\nDoorstatus\\x12\\x15\\n\\x11\\x44OORSTATUS_CLOSED\\x10\\x00\\x12\\x13\\n\\x0f\\x44OORSTATUS_OPEN\\x10\\x01*H\\n\\x0e\\x44oorlockstatus\\x12\\x19\\n\\x15\\x44OORLOCKSTATUS_LOCKED\\x10\\x00\\x12\\x1b\\n\\x17\\x44OORLOCKSTATUS_UNLOCKED\\x10\\x01*\\xbf\\x01\\n\\x15\\x44oorlockstatusvehicle\\x12\"\\n\\x1e\\x44OORLOCKSTATUSVEHICLE_UNLOCKED\\x10\\x00\\x12)\\n%DOORLOCKSTATUSVEHICLE_INTERNAL_LOCKED\\x10\\x01\\x12)\\n%DOORLOCKSTATUSVEHICLE_EXTERNAL_LOCKED\\x10\\x02\\x12,\\n(DOORLOCKSTATUSVEHICLE_SELECTIVE_UNLOCKED\\x10\\x03*\\x85\\x01\\n\\x11\\x44oorStatusOverall\\x12%\\n!DOOR_STATUS_OVERALL_ANY_DOOR_OPEN\\x10\\x00\\x12(\\n$DOOR_STATUS_OVERALL_ALL_DOORS_CLOSED\\x10\\x01\\x12\\x1f\\n\\x1b\\x44OOR_STATUS_OVERALL_UNKNOWN\\x10\\x03*Z\\n\\rDoorstatusgas\\x12\\x18\\n\\x14\\x44OORSTATUSGAS_CLOSED\\x10\\x00\\x12\\x16\\n\\x12\\x44OORSTATUSGAS_OPEN\\x10\\x01\\x12\\x17\\n\\x13\\x44OORSTATUSGAS_ERROR\\x10\\x02*\\xd3\\x05\\n\\x0e\\x43hargingstatus\\x12\\x1b\\n\\x17\\x43HARGINGSTATUS_CHARGING\\x10\\x00\\x12 \\n\\x1c\\x43HARGINGSTATUS_END_OF_CHARGE\\x10\\x01\\x12\\x1f\\n\\x1b\\x43HARGINGSTATUS_CHARGE_BREAK\\x10\\x02\\x12)\\n%CHARGINGSTATUS_CHARGE_CABLE_UNPLUGGED\\x10\\x03\\x12!\\n\\x1d\\x43HARGINGSTATUS_CHARGING_ERROR\\x10\\x04\\x12 \\n\\x1c\\x43HARGINGSTATUS_SLOW_CHARGING\\x10\\x05\\x12 \\n\\x1c\\x43HARGINGSTATUS_FAST_CHARGING\\x10\\x06\\x12\\x1e\\n\\x1a\\x43HARGINGSTATUS_DISCHARGING\\x10\\x07\\x12\\x1e\\n\\x1a\\x43HARGINGSTATUS_NO_CHARGING\\x10\\x08\\x12;\\n7CHARGINGSTATUS_SLOW_CHARGING_AFTER_REACHING_TRIP_TARGET\\x10\\t\\x12\\x36\\n2CHARGINGSTATUS_CHARGING_AFTER_REACHING_TRIP_TARGET\\x10\\n\\x12;\\n7CHARGINGSTATUS_FAST_CHARGING_AFTER_REACHING_TRIP_TARGET\\x10\\x0b\\x12@\\n<CHARGINGSTATUS_COMMUNICATION_WITH_EVSE_ACTIVE_NO_ENERGY_FLOW\\x10\\x0c\\x12%\\n!CHARGINGSTATUS_AC_CHARGING_ACTIVE\\x10\\r\\x12%\\n!CHARGINGSTATUS_DC_CHARGING_ACTIVE\\x10\\x0e\\x12\\x31\\n-CHARGINGSTATUS_SOH_BATTERY_CALIBRATION_ACTIVE\\x10\\x0f\\x12\\x1a\\n\\x16\\x43HARGINGSTATUS_UNKNOWN\\x10\\x10*\\xe3\\x01\\n\\x0c\\x43hargingMode\\x12\\x16\\n\\x12\\x43HARGING_MODE_NONE\\x10\\x00\\x12\\x1f\\n\\x1b\\x43HARGING_MODE_CONDUCTIVE_AC\\x10\\x01\\x12\\x1b\\n\\x17\\x43HARGING_MODE_INDUCTIVE\\x10\\x02\\x12-\\n)CHARGING_MODE_CONDUCTIVE_AC_AND_INDUCTIVE\\x10\\x03\\x12\\x1f\\n\\x1b\\x43HARGING_MODE_CONDUCTIVE_DC\\x10\\x04\\x12-\\n)CHARGING_MODE_CONDUCTIVE_DC_AND_INDUCTIVE\\x10\\x05*\\xc0\\x05\\n\\x15SelectedChargeProgram\\x12#\\n\\x1fSELECTED_CHARGE_PROGRAM_DEFAULT\\x10\\x00\\x12#\\n\\x1fSELECTED_CHARGE_PROGRAM_INSTANT\\x10\\x01\\x12 \\n\\x1cSELECTED_CHARGE_PROGRAM_HOME\\x10\\x02\\x12 \\n\\x1cSELECTED_CHARGE_PROGRAM_WORK\\x10\\x03\\x12*\\n&SELECTED_CHARGE_PROGRAM_AC_DC_STANDARD\\x10\\x04\\x12@\\n<SELECTED_CHARGE_PROGRAM_AC_DC_STANDARD_V1X_RANGE_ASSIST_MODE\\x10\\x05\\x12-\\n)SELECTED_CHARGE_PROGRAM_DC_CP_V2X_CHADEMO\\x10\\x06\\x12:\\n6SELECTED_CHARGE_PROGRAM_DC_CP_V2X_ISO_15118_20_DYNAMIC\\x10\\x07\\x12<\\n8SELECTED_CHARGE_PROGRAM_DC_CP_V2X_ISO_15118_20_SCHEDULED\\x10\\x08\\x12\\x31\\n-SELECTED_CHARGE_PROGRAM_AC_DC_OPPORTUNITY_V1X\\x10\\t\\x12\\'\\n#SELECTED_CHARGE_PROGRAM_AC_EV_TIMER\\x10\\n\\x12;\\n7SELECTED_CHARGE_PROGRAM_AC_DC_DIN_ISO_15118_2_SCHEDULED\\x10\\x0b\\x12\\x32\\n.SELECTED_CHARGE_PROGRAM_AC_API_REMOTE_SCHEDULE\\x10\\x0c\\x12\\x35\\n1SELECTED_CHARGE_PROGRAM_AC_DC_BATTERY_CALIBRATION\\x10\\r*\\x8a\\x01\\n\\rSmartCharging\\x12!\\n\\x1dSMART_CHARGING_WALLBOX_ACTIVE\\x10\\x00\\x12\\'\\n#SMART_CHARGING_COMMUNICATION_ACTIVE\\x10\\x01\\x12-\\n)SMART_CHARGING_ON_OFF_PEAK_SETTING_ACTIVE\\x10\\x02*n\\n\\x18SmartChargingAtDeparture\\x12*\\n&SMART_CHARGING_AT_DEPARTURE_NOT_ACTIVE\\x10\\x00\\x12&\\n\"SMART_CHARGING_AT_DEPARTURE_ACTIVE\\x10\\x01*\\xf8\\x01\\n\\x13\\x43hargeCouplerStatus\\x12,\\n(CHARGE_COUPLER_STATUS_PLUGGED_BOTH_SIDES\\x10\\x00\\x12.\\n*CHARGE_COUPLER_STATUS_PLUGGED_VEHICLE_SIDE\\x10\\x01\\x12\\x32\\n.CHARGE_COUPLER_STATUS_NOT_PLUGGED_VEHICLE_SIDE\\x10\\x02\\x12!\\n\\x1d\\x43HARGE_COUPLER_STATUS_UNKNOWN\\x10\\x03\\x12,\\n(CHARGE_COUPLER_STATUS_UNKNOWN_DUE_DEFECT\\x10\\x04*\\x93\\x01\\n\\x17\\x43hargeCouplerLockStatus\\x12%\\n!CHARGE_COUPLER_LOCK_STATUS_LOCKED\\x10\\x00\\x12\\'\\n#CHARGE_COUPLER_LOCK_STATUS_UNLOCKED\\x10\\x01\\x12(\\n$CHARGE_COUPLER_LOCK_STATUS_NOT_CLEAR\\x10\\x02*s\\n\\x10\\x43hargeFlapStatus\\x12\\x1b\\n\\x17\\x43HARGE_FLAP_STATUS_OPEN\\x10\\x00\\x12\\x1d\\n\\x19\\x43HARGE_FLAP_STATUS_CLOSED\\x10\\x01\\x12#\\n\\x1f\\x43HARGE_FLAP_STATUS_FLAP_PRESSED\\x10\\x02*\\x89\\x01\\n\\x14\\x43hargingErrorDetails\\x12#\\n\\x1f\\x43HARGING_ERROR_DETAILS_NO_ERROR\\x10\\x00\\x12%\\n!CHARGING_ERROR_DETAILS_AC_FAILURE\\x10\\x01\\x12%\\n!CHARGING_ERROR_DETAILS_DC_FAILURE\\x10\\x02*\\x8a\\x01\\n\\rIgnitionstate\\x12\\x16\\n\\x12IGNITIONSTATE_LOCK\\x10\\x00\\x12\\x15\\n\\x11IGNITIONSTATE_OFF\\x10\\x01\\x12\\x1b\\n\\x17IGNITIONSTATE_ACCESSORY\\x10\\x02\\x12\\x14\\n\\x10IGNITIONSTATE_ON\\x10\\x04\\x12\\x17\\n\\x13IGNITIONSTATE_START\\x10\\x05*E\\n\\x0b\\x45ngineState\\x12\\x1c\\n\\x18\\x45NGINE_STATE_NOT_RUNNING\\x10\\x00\\x12\\x18\\n\\x14\\x45NGINE_STATE_RUNNING\\x10\\x01*O\\n\\x0fParkbrakestatus\\x12\\x1f\\n\\x1bPARKBRAKESTATUS_NOT_ENGAGED\\x10\\x00\\x12\\x1b\\n\\x17PARKBRAKESTATUS_ENGAGED\\x10\\x01*N\\n\\x10\\x45ngineHoodStatus\\x12\\x1d\\n\\x19\\x45NGINE_HOOD_STATUS_CLOSED\\x10\\x00\\x12\\x1b\\n\\x17\\x45NGINE_HOOD_STATUS_OPEN\\x10\\x01*s\\n\\rRooftopstatus\\x12\\x1a\\n\\x16ROOFTOPSTATUS_UNLOCKED\\x10\\x00\\x12!\\n\\x1dROOFTOPSTATUS_OPEN_AND_LOCKED\\x10\\x01\\x12#\\n\\x1fROOFTOPSTATUS_CLOSED_AND_LOCKED\\x10\\x02*\\x97\\x01\\n\\x0cWindowstatus\\x12\\x1d\\n\\x19WINDOWSTATUS_INTERMEDIATE\\x10\\x00\\x12\"\\n\\x1eWINDOWSTATUS_COMPLETELY_OPENED\\x10\\x01\\x12\"\\n\\x1eWINDOWSTATUS_COMPLETELY_CLOSED\\x10\\x02\\x12 \\n\\x1cWINDOWSTATUS_AIRING_POSITION\\x10\\x03*\\x8f\\x01\\n\\x11WindowStatusBlind\\x12$\\n WINDOW_STATUS_BLIND_INTERMEDIATE\\x10\\x00\\x12)\\n%WINDOW_STATUS_BLIND_COMPLETELY_OPENED\\x10\\x01\\x12)\\n%WINDOW_STATUS_BLIND_COMPLETELY_CLOSED\\x10\\x02*\\xa4\\x01\\n\\x13WindowStatusOverall\\x12\\x1e\\n\\x1aWINDOW_STATUS_OVERALL_OPEN\\x10\\x00\\x12 \\n\\x1cWINDOW_STATUS_OVERALL_CLOSED\\x10\\x01\\x12)\\n%WINDOW_STATUS_OVERALL_COMPLETELY_OPEN\\x10\\x02\\x12 \\n\\x1cWINDOW_STATUS_OVERALL_AIRING\\x10\\x03*\\x85\\x01\\n\\rSunroofstatus\\x12\\x18\\n\\x14SUNROOFSTATUS_CLOSED\\x10\\x00\\x12\\x1f\\n\\x1bSUNROOFSTATUS_COMPLETE_OPEN\\x10\\x01\\x12\\x1e\\n\\x1aSUNROOFSTATUS_LIFTING_OPEN\\x10\\x02\\x12\\x19\\n\\x15SUNROOFSTATUS_RUNNING\\x10\\x03*\\xb5\\x01\\n\\x12SunroofStatusBlind\\x12%\\n!SUNROOF_STATUS_BLIND_INTERMEDIATE\\x10\\x00\\x12*\\n&SUNROOF_STATUS_BLIND_COMPLETELY_OPENED\\x10\\x01\\x12*\\n&SUNROOF_STATUS_BLIND_COMPLETELY_CLOSED\\x10\\x02\\x12 \\n\\x1cSUNROOF_STATUS_BLIND_OPENING\\x10\\x03*\\x9f\\x01\\n\\x0cSunroofEvent\\x12\\x16\\n\\x12SUNROOF_EVENT_NONE\\x10\\x00\\x12$\\n SUNROOF_EVENT_RAIN_LIFT_POSITION\\x10\\x01\\x12)\\n%SUNROOF_EVENT_AUTOMATIC_LIFT_POSITION\\x10\\x02\\x12&\\n\"SUNROOF_EVENT_VENTILATION_POSITION\\x10\\x03*N\\n\\x10\\x46lipWindowStatus\\x12\\x1d\\n\\x19\\x46LIP_WINDOW_STATUS_CLOSED\\x10\\x00\\x12\\x1b\\n\\x17\\x46LIP_WINDOW_STATUS_OPEN\\x10\\x01*\\x95\\x01\\n\\nTireMarker\\x12\\x1a\\n\\x16TIRE_MARKER_NO_WARNING\\x10\\x00\\x12\\x1c\\n\\x18TIRE_MARKER_SOFT_WARNING\\x10\\x01\\x12\\x1c\\n\\x18TIRE_MARKER_LOW_PRESSURE\\x10\\x02\\x12\\x19\\n\\x15TIRE_MARKER_DEFLATION\\x10\\x03\\x12\\x14\\n\\x10TIRE_MARKER_MARK\\x10\\x04*\\xe7\\x01\\n\\x13TireSensorAvailable\\x12%\\n!TIRE_SENSOR_AVAILABLE_ALL_LOCATED\\x10\\x00\\x12.\\n*TIRE_SENSOR_AVAILABLE_ONE_TO_THREE_MISSING\\x10\\x01\\x12%\\n!TIRE_SENSOR_AVAILABLE_ALL_MISSING\\x10\\x02\\x12&\\n\"TIRE_SENSOR_AVAILABLE_SYSTEM_ERROR\\x10\\x03\\x12*\\n&TIRE_SENSOR_AVAILABLE_AUTOLOCATE_ERROR\\x10\\x04*\\x8b\\x01\\n\\x13TireWarningLevelPrw\\x12%\\n!TIRE_WARNING_LEVEL_PRW_NO_WARNING\\x10\\x00\\x12\"\\n\\x1eTIRE_WARNING_LEVEL_PRW_WARNING\\x10\\x01\\x12)\\n%TIRE_WARNING_LEVEL_PRW_GO_TO_WORKSHOP\\x10\\x02*\\x87\\x01\\n\\x0fTirewarninglamp\\x12$\\n TIREWARNINGLAMP_NO_COMBI_MESSAGE\\x10\\x00\\x12\"\\n\\x1eTIREWARNINGLAMP_CONSTANT_LIGHT\\x10\\x01\\x12*\\n&TIREWARNINGLAMP_BLINKING_THEN_CONSTANT\\x10\\x02*N\\n\\x0fTirewarningsprw\\x12\\x1e\\n\\x1aTIREWARNINGSPRW_NO_WARNING\\x10\\x00\\x12\\x1b\\n\\x17TIREWARNINGSPRW_WARNING\\x10\\x01*\\x94\\x01\\n\\x0fTirewarningsrdk\\x12\\x1e\\n\\x1aTIREWARNINGSRDK_NO_WARNING\\x10\\x00\\x12 \\n\\x1cTIREWARNINGSRDK_SOFT_WARNING\\x10\\x01\\x12 \\n\\x1cTIREWARNINGSRDK_LOW_PRESSURE\\x10\\x02\\x12\\x1d\\n\\x19TIREWARNINGSRDK_DEFLATION\\x10\\x03*\\xbb\\x02\\n\\x0cPrecondError\\x12\\x1a\\n\\x16PRECOND_ERROR_NO_ERROR\\x10\\x00\\x12&\\n\"PRECOND_ERROR_BATTERY_LOW_FUEL_LOW\\x10\\x01\\x12!\\n\\x1dPRECOND_ERROR_PLAY_PROTECTION\\x10\\x02\\x12\\'\\n#PRECOND_ERROR_CHARGING_NOT_FINISHED\\x10\\x03\\x12 \\n\\x1cPRECOND_ERROR_INTERNAL_ERROR\\x10\\x04\\x12#\\n\\x1fPRECOND_ERROR_ENERGY_BUDGET_LOW\\x10\\x05\\x12$\\n PRECOND_ERROR_OPEN_WINDOWS_DOORS\\x10\\x06\\x12.\\n*PRECOND_ERROR_REGULAR_CLIMATIZATION_ACTIVE\\x10\\x07*>\\n\\nPrecondNow\\x12\\x18\\n\\x14PRECOND_NOW_INACTIVE\\x10\\x00\\x12\\x16\\n\\x12PRECOND_NOW_ACTIVE\\x10\\x01*\\x9e\\x01\\n\\x14PrecondOperatingMode\\x12\\x1e\\n\\x1aPRECOND_OPERATING_MODE_OFF\\x10\\x00\\x12\\x1f\\n\\x1bPRECOND_OPERATING_MODE_HEAT\\x10\\x01\\x12\\x1f\\n\\x1bPRECOND_OPERATING_MODE_COOL\\x10\\x02\\x12$\\n PRECOND_OPERATING_MODE_VENTILATE\\x10\\x03*T\\n\\x12Precondatdeparture\\x12\\x1f\\n\\x1bPRECONDATDEPARTURE_INACTIVE\\x10\\x00\\x12\\x1d\\n\\x19PRECONDATDEPARTURE_ACTIVE\\x10\\x01*8\\n\\x0bPrecondSeat\\x12\\x14\\n\\x10PRECOND_SEAT_OFF\\x10\\x00\\x12\\x13\\n\\x0fPRECOND_SEAT_ON\\x10\\x01*\\x93\\x02\\n\\rAuxheatstatus\\x12\\x1a\\n\\x16\\x41UXHEATSTATUS_INACTIVE\\x10\\x00\\x12%\\n!AUXHEATSTATUS_HEATING_NORMAL_MODE\\x10\\x01\\x12)\\n%AUXHEATSTATUS_VENTILATING_NORMAL_MODE\\x10\\x02\\x12 \\n\\x1c\\x41UXHEATSTATUS_HEATING_MANUAL\\x10\\x03\\x12&\\n\"AUXHEATSTATUS_POST_RUNNING_HEATING\\x10\\x04\\x12*\\n&AUXHEATSTATUS_POST_RUNNING_VENTILATING\\x10\\x05\\x12\\x1e\\n\\x1a\\x41UXHEATSTATUS_HEATING_AUTO\\x10\\x06*\\x9f\\x01\\n\\x14\\x41uxheattimeselection\\x12!\\n\\x1d\\x41UXHEATTIMESELECTION_NO_TIMER\\x10\\x00\\x12 \\n\\x1c\\x41UXHEATTIMESELECTION_TIMER_1\\x10\\x01\\x12 \\n\\x1c\\x41UXHEATTIMESELECTION_TIMER_2\\x10\\x02\\x12 \\n\\x1c\\x41UXHEATTIMESELECTION_TIMER_3\\x10\\x03*m\\n\\x0e\\x41uxheatwarning\\x12\\x17\\n\\x13\\x41UXHEATWARNING_NONE\\x10\\x00\\x12\\x1f\\n\\x1b\\x41UXHEATWARNING_CONFIRMATION\\x10\\x01\\x12!\\n\\x1d\\x41UXHEATWARNING_CONFIRMATION_2\\x10\\x02*\\xd6\\x01\\n\\x11\\x44\\x65partureTimeMode\\x12 \\n\\x1c\\x44\\x45PARTURE_TIME_MODE_INACTIVE\\x10\\x00\\x12$\\n DEPARTURE_TIME_MODE_ADHOC_ACTIVE\\x10\\x01\\x12(\\n$DEPARTURE_TIME_MODE_WEEKLYSET_ACTIVE\\x10\\x02\\x12\"\\n\\x1e\\x44\\x45PARTURE_TIME_MODE_TIMER_ACTV\\x10\\x03\\x12+\\n\\'DEPARTURE_TIME_MODE_INTELLIGENT_DP_ACTV\\x10\\x04*\\x9d\\x01\\n\\x07Weekday\\x12\\x12\\n\\x0eWEEKDAY_MONDAY\\x10\\x00\\x12\\x13\\n\\x0fWEEKDAY_TUESDAY\\x10\\x01\\x12\\x15\\n\\x11WEEKDAY_WEDNESDAY\\x10\\x02\\x12\\x14\\n\\x10WEEKDAY_THURSDAY\\x10\\x03\\x12\\x12\\n\\x0eWEEKDAY_FRIDAY\\x10\\x04\\x12\\x14\\n\\x10WEEKDAY_SATURDAY\\x10\\x05\\x12\\x12\\n\\x0eWEEKDAY_SUNDAY\\x10\\x06*X\\n\\x13RangeSkipIndication\\x12!\\n\\x1dRANGE_SKIP_INDICATION_DISPLAY\\x10\\x00\\x12\\x1e\\n\\x1aRANGE_SKIP_INDICATION_SKIP\\x10\\x01*~\\n\\x15\\x46ilterParticleLoading\\x12 \\n\\x1c\\x46ILTER_PARTICLE_LOADING_HIGH\\x10\\x00\\x12\"\\n\\x1e\\x46ILTER_PARTICLE_LOADING_MEDIUM\\x10\\x01\\x12\\x1f\\n\\x1b\\x46ILTER_PARTICLE_LOADING_LOW\\x10\\x02*\\xec\\x07\\n\\nLanguageHU\\x12\\x16\\n\\x12LANGUAGE_HU_GERMAN\\x10\\x00\\x12\\x1b\\n\\x17LANGUAGE_HU_ENGLISH_IMP\\x10\\x01\\x12\\x16\\n\\x12LANGUAGE_HU_FRENCH\\x10\\x02\\x12\\x17\\n\\x13LANGUAGE_HU_ITALIAN\\x10\\x03\\x12\\x17\\n\\x13LANGUAGE_HU_SPANISH\\x10\\x04\\x12\\x18\\n\\x14LANGUAGE_HU_JAPANESE\\x10\\x05\\x12\\x1b\\n\\x17LANGUAGE_HU_ENGLISH_MET\\x10\\x06\\x12\\x15\\n\\x11LANGUAGE_HU_DUTCH\\x10\\x07\\x12\\x16\\n\\x12LANGUAGE_HU_DANISH\\x10\\x08\\x12\\x17\\n\\x13LANGUAGE_HU_SWEDISH\\x10\\t\\x12\\x17\\n\\x13LANGUAGE_HU_TURKISH\\x10\\n\\x12\\x1a\\n\\x16LANGUAGE_HU_PORTUGUESE\\x10\\x0b\\x12\\x17\\n\\x13LANGUAGE_HU_RUSSIAN\\x10\\x0c\\x12\\x16\\n\\x12LANGUAGE_HU_ARABIC\\x10\\r\\x12\\x17\\n\\x13LANGUAGE_HU_CHINESE\\x10\\x0e\\x12\\x1a\\n\\x16LANGUAGE_HU_ENGLISH_AM\\x10\\x0f\\x12\\x1c\\n\\x18LANGUAGE_HU_TRAD_CHINESE\\x10\\x10\\x12\\x16\\n\\x12LANGUAGE_HU_KOREAN\\x10\\x11\\x12\\x17\\n\\x13LANGUAGE_HU_FINNISH\\x10\\x12\\x12\\x16\\n\\x12LANGUAGE_HU_POLISH\\x10\\x13\\x12\\x15\\n\\x11LANGUAGE_HU_CZECH\\x10\\x14\\x12!\\n\\x1dLANGUAGE_HU_PORTUGUESE_BRAZIL\\x10\\x15\\x12\\x19\\n\\x15LANGUAGE_HU_NORWEGIAN\\x10\\x16\\x12\\x14\\n\\x10LANGUAGE_HU_THAI\\x10\\x17\\x12\\x1a\\n\\x16LANGUAGE_HU_INDONESIAN\\x10\\x18\\x12\\x19\\n\\x15LANGUAGE_HU_BULGARIAN\\x10\\x19\\x12\\x19\\n\\x15LANGUAGE_HU_SLOVAKIAN\\x10\\x1a\\x12\\x18\\n\\x14LANGUAGE_HU_CROATIAN\\x10\\x1b\\x12\\x17\\n\\x13LANGUAGE_HU_SERBIAN\\x10\\x1c\\x12\\x19\\n\\x15LANGUAGE_HU_HUNGARIAN\\x10\\x1d\\x12\\x19\\n\\x15LANGUAGE_HU_UKRAINIAN\\x10\\x1e\\x12\\x17\\n\\x13LANGUAGE_HU_MALAYAN\\x10\\x1f\\x12\\x1a\\n\\x16LANGUAGE_HU_VIETNAMESE\\x10 \\x12\\x18\\n\\x14LANGUAGE_HU_ROMANIAN\\x10!\\x12\\x1f\\n\\x1bLANGUAGE_HU_TRAD_CHINESE_TW\\x10\"\\x12\\x16\\n\\x12LANGUAGE_HU_HEBREW\\x10#\\x12\\x15\\n\\x11LANGUAGE_HU_GREEK\\x10$\\x12\\x19\\n\\x15LANGUAGE_HU_SLOVENIAN\\x10%*J\\n\\x0fSpeedUnitFromIC\\x12\\x1b\\n\\x17SPEED_UNIT_FROM_IC_KM_H\\x10\\x00\\x12\\x1a\\n\\x16SPEED_UNIT_FROM_IC_MPH\\x10\\x01*X\\n\\x11TemperatureUnitHU\\x12\\x1f\\n\\x1bTEMPERATURE_UNIT_HU_CELSIUS\\x10\\x00\\x12\"\\n\\x1eTEMPERATURE_UNIT_HU_FAHRENHEIT\\x10\\x01*H\\n\\x0cTimeFormatHU\\x12\\x1b\\n\\x17TIME_FORMAT_HU_12_HOURS\\x10\\x00\\x12\\x1b\\n\\x17TIME_FORMAT_HU_24_HOURS\\x10\\x01*F\\n\\x0fTrackingStateHu\\x12\\x19\\n\\x15TRACKING_STATE_HU_OFF\\x10\\x00\\x12\\x18\\n\\x14TRACKING_STATE_HU_ON\\x10\\x01*y\\n\\x1aVehicleDataConnectionState\\x12.\\n*VEHICLE_DATA_CONNECTION_STATE_DISCONNECTED\\x10\\x00\\x12+\\n\\'VEHICLE_DATA_CONNECTION_STATE_CONNECTED\\x10\\x01*w\\n\\x13VehicleHealthStatus\\x12\\x1f\\n\\x1bVEHICLE_HEALTH_STATUS_GREEN\\x10\\x00\\x12 \\n\\x1cVEHICLE_HEALTH_STATUS_YELLOW\\x10\\x01\\x12\\x1d\\n\\x19VEHICLE_HEALTH_STATUS_RED\\x10\\x02*\\xa5\\x01\\n\\x0b\\x44rivingMode\\x12\\x18\\n\\x14\\x44RIVING_MODE_UNKNOWN\\x10\\x00\\x12\\x14\\n\\x10\\x44RIVING_MODE_OFF\\x10\\x01\\x12\\x13\\n\\x0f\\x44RIVING_MODE_ON\\x10\\x02\\x12\\x1c\\n\\x18\\x44RIVING_MODE_PENDING_OFF\\x10\\x03\\x12\\x1b\\n\\x17\\x44RIVING_MODE_PENDING_ON\\x10\\x04\\x12\\x16\\n\\x12\\x44RIVING_MODE_ERROR\\x10\\x05*\\x91\\x01\\n\\x0fOilWarningLevel\\x12\\x1e\\n\\x1aOIL_WARNING_LEVEL_OVERFILL\\x10\\x00\\x12\\x18\\n\\x14OIL_WARNING_LEVEL_OK\\x10\\x01\\x12\\x1f\\n\\x1bOIL_WARNING_LEVEL_UNDERFILL\\x10\\x02\\x12#\\n\\x1fOIL_WARNING_LEVEL_NOT_AVAILABLE\\x10\\x03*b\\n\\x0eParkEventLevel\\x12\\x18\\n\\x14PARK_EVENT_LEVEL_LOW\\x10\\x00\\x12\\x1b\\n\\x17PARK_EVENT_LEVEL_MEDIUM\\x10\\x01\\x12\\x19\\n\\x15PARK_EVENT_LEVEL_HIGH\\x10\\x02*\\xc8\\x02\\n\\rParkEventType\\x12\\x18\\n\\x14PARK_EVENT_TYPE_IDLE\\x10\\x00\\x12\\x1e\\n\\x1aPARK_EVENT_TYPE_FRONT_LEFT\\x10\\x01\\x12 \\n\\x1cPARK_EVENT_TYPE_FRONT_MIDDLE\\x10\\x02\\x12\\x1f\\n\\x1bPARK_EVENT_TYPE_FRONT_RIGHT\\x10\\x03\\x12\\x19\\n\\x15PARK_EVENT_TYPE_RIGHT\\x10\\x04\\x12\\x1e\\n\\x1aPARK_EVENT_TYPE_REAR_RIGHT\\x10\\x05\\x12\\x1f\\n\\x1bPARK_EVENT_TYPE_REAR_MIDDLE\\x10\\x06\\x12\\x1d\\n\\x19PARK_EVENT_TYPE_REAR_LEFT\\x10\\x07\\x12\\x18\\n\\x14PARK_EVENT_TYPE_LEFT\\x10\\x08\\x12%\\n!PARK_EVENT_TYPE_DIRECTION_UNKNOWN\\x10\\t*\\xa2\\x01\\n\\x15ParkEventSensorStatus\\x12\\x30\\n,PARK_EVENT_SENSOR_STATUS_NOT_ACTIVE_SELECTED\\x10\\x00\\x12\\x32\\n.PARK_EVENT_SENSOR_STATUS_NOT_ACTIVE_UNSELECTED\\x10\\x01\\x12#\\n\\x1fPARK_EVENT_SENSOR_STATUS_ACTIVE\\x10\\x02*Q\\n\\x10Warningwashwater\\x12\\x1d\\n\\x19WARNINGWASHWATER_INACTIVE\\x10\\x00\\x12\\x1e\\n\\x1aWARNINGWASHWATER_TRIGGERED\\x10\\x01*\\xf3\\x02\\n\\x0eHybridWarnings\\x12\\x18\\n\\x14HYBRID_WARNINGS_NONE\\x10\\x00\\x12 \\n\\x1cHYBRID_WARNINGS_SEEK_SERVICE\\x10\\x01\\x12&\\n\"HYBRID_WARNINGS_HIGH_VOLTAGE_FAULT\\x10\\x02\\x12%\\n!HYBRID_WARNINGS_POWER_TRAIN_FAULT\\x10\\x03\\x12#\\n\\x1fHYBRID_WARNINGS_STARTER_BATTERY\\x10\\x04\\x12 \\n\\x1cHYBRID_WARNINGS_STOP_VEHICLE\\x10\\x05\\x12\\x1f\\n\\x1bHYBRID_WARNINGS_PLUGIN_ONLY\\x10\\x06\\x12\\'\\n#HYBRID_WARNINGS_PLUGIN_STILL_ACTIVE\\x10\\x07\\x12 \\n\\x1cHYBRID_WARNINGS_POWER_REDUCE\\x10\\x08\\x12#\\n\\x1fHYBRID_WARNINGS_STOP_ENGINE_OFF\\x10\\t*\\xcd\\t\\n\\x16LastTheftWarningReason\\x12&\\n\"LAST_THEFT_WARNING_REASON_NO_ALARM\\x10\\x00\\x12)\\n%LAST_THEFT_WARNING_REASON_BASIS_ALARM\\x10\\x10\\x12-\\n)LAST_THEFT_WARNING_REASON_DOOR_FRONT_LEFT\\x10\\x11\\x12.\\n*LAST_THEFT_WARNING_REASON_DOOR_FRONT_RIGHT\\x10\\x12\\x12,\\n(LAST_THEFT_WARNING_REASON_DOOR_REAR_LEFT\\x10\\x13\\x12-\\n)LAST_THEFT_WARNING_REASON_DOOR_REAR_RIGHT\\x10\\x14\\x12\"\\n\\x1eLAST_THEFT_WARNING_REASON_HOOD\\x10\\x15\\x12%\\n!LAST_THEFT_WARNING_REASON_DECKLID\\x10\\x16\\x12+\\n\\'LAST_THEFT_WARNING_REASON_COMMON_ALM_IN\\x10\\x17\\x12#\\n\\x1fLAST_THEFT_WARNING_REASON_PANIC\\x10\\x1a\\x12&\\n\"LAST_THEFT_WARNING_REASON_GLOVEBOX\\x10\\x1b\\x12\\'\\n#LAST_THEFT_WARNING_REASON_CENTERBOX\\x10\\x1c\\x12%\\n!LAST_THEFT_WARNING_REASON_REARBOX\\x10\\x1d\\x12)\\n%LAST_THEFT_WARNING_REASON_FLIP_WINDOW\\x10\\x1e\\x12(\\n$LAST_THEFT_WARNING_REASON_SENSOR_VTA\\x10 \\x12!\\n\\x1dLAST_THEFT_WARNING_REASON_ITS\\x10!\\x12%\\n!LAST_THEFT_WARNING_REASON_ITS_SLV\\x10\"\\x12!\\n\\x1dLAST_THEFT_WARNING_REASON_TPS\\x10#\\x12#\\n\\x1fLAST_THEFT_WARNING_REASON_SIREN\\x10$\\x12&\\n\"LAST_THEFT_WARNING_REASON_HOLD_COM\\x10%\\x12$\\n LAST_THEFT_WARNING_REASON_REMOTE\\x10&\\x12\\'\\n#LAST_THEFT_WARNING_REASON_EXT_ITS_1\\x10*\\x12\\'\\n#LAST_THEFT_WARNING_REASON_EXT_ITS_2\\x10+\\x12\\'\\n#LAST_THEFT_WARNING_REASON_EXT_ITS_3\\x10,\\x12\\'\\n#LAST_THEFT_WARNING_REASON_EXT_ITS_4\\x10-\\x12.\\n*LAST_THEFT_WARNING_REASON_CHILD_PRESENCE_1\\x10.\\x12.\\n*LAST_THEFT_WARNING_REASON_CHILD_PRESENCE_2\\x10/\\x12-\\n)LAST_THEFT_WARNING_REASON_CENTRAL_LOCKING\\x10\\x30\\x12\\'\\n#LAST_THEFT_WARNING_REASON_AMBIGUOUS\\x10<*\\xad\\x01\\n HvBatteryThermalPropagationEvent\\x12-\\n)HV_BATTERY_THERMAL_PROPAGATION_NO_WARNING\\x10\\x00\\x12,\\n(HV_BATTERY_THERMAL_PROPAGATION_WARNING_1\\x10\\x01\\x12,\\n(HV_BATTERY_THERMAL_PROPAGATION_WARNING_2\\x10\\x02*\\xc1\\x01\\n\\x13StarterBatteryState\\x12\\x1f\\n\\x1bSTARTER_BATTERY_STATE_GREEN\\x10\\x00\\x12 \\n\\x1cSTARTER_BATTERY_STATE_YELLOW\\x10\\x01\\x12\\x1d\\n\\x19STARTER_BATTERY_STATE_RED\\x10\\x02\\x12 \\n\\x1cSTARTER_BATTERY_STATE_ORANGE\\x10\\x03\\x12&\\n\"STARTER_BATTERY_STATE_GREEN_YELLOW\\x10\\x04*\\xa1\\x02\\n\\x18VehiclePositionErrorCode\\x12\\'\\n#VEHICLE_POSITION_ERROR_CODE_UNKNOWN\\x10\\x00\\x12\\x30\\n,VEHICLE_POSITION_ERROR_CODE_SERVICE_INACTIVE\\x10\\x01\\x12\\x31\\n-VEHICLE_POSITION_ERROR_CODE_TRACKING_INACTIVE\\x10\\x02\\x12&\\n\"VEHICLE_POSITION_ERROR_CODE_PARKED\\x10\\x03\\x12+\\n\\'VEHICLE_POSITION_ERROR_CODE_IGNITION_ON\\x10\\x04\\x12\"\\n\\x1eVEHICLE_POSITION_ERROR_CODE_OK\\x10\\x05*s\\n\\x12\\x43\\x61librationRequest\\x12\"\\n\\x1e\\x43\\x41LIBRATION_REQUEST_NO_REQUEST\\x10\\x00\\x12\\x1b\\n\\x17\\x43\\x41LIBRATION_REQUEST_LOW\\x10\\x01\\x12\\x1c\\n\\x18\\x43\\x41LIBRATION_REQUEST_HIGH\\x10\\x02*\\x88\\x05\\n\\x11\\x41ssystOilQuantity\\x12&\\n\"ASSYST_OIL_QUANTITY_NO_MEASUREMENT\\x10\\x00\\x12\\x35\\n1ASSYST_OIL_QUANTITY_NO_MEASUREMENT_ENGINE_RUNNING\\x10\\x01\\x12/\\n+ASSYST_OIL_QUANTITY_MEASUREMENT_IGNITION_ON\\x10\\x02\\x12\\x1c\\n\\x18\\x41SSYST_OIL_QUANTITY_WAIT\\x10\\x03\\x12*\\n&ASSYST_OIL_QUANTITY_MEASUREMENT_ACTIVE\\x10\\x04\\x12\\x1e\\n\\x1a\\x41SSYST_OIL_QUANTITY_OIL_OK\\x10\\x05\\x12#\\n\\x1f\\x41SSYST_OIL_QUANTITY_OIL_REDUCED\\x10\\x06\\x12#\\n\\x1f\\x41SSYST_OIL_QUANTITY_REFILL_1LTR\\x10\\x07\\x12%\\n!ASSYST_OIL_QUANTITY_REFILL_1_5LTR\\x10\\x08\\x12#\\n\\x1f\\x41SSYST_OIL_QUANTITY_REFILL_2LTR\\x10\\t\\x12%\\n!ASSYST_OIL_QUANTITY_REFILL_0_5LTR\\x10\\n\\x12-\\n)ASSYST_OIL_QUANTITY_ENGINE_START_REQUIRED\\x10\\x0b\\x12.\\n*ASSYST_OIL_QUANTITY_ENGINE_WARMUP_REQUIRED\\x10\\x0c\\x12.\\n*ASSYST_OIL_QUANTITY_VEHICLE_NOT_HORIZONTAL\\x10\\r\\x12-\\n)ASSYST_OIL_QUANTITY_NO_MEASUREMENT_RESULT\\x10\\x0e*\\x81\\x02\\n\\x10\\x41ssystOilWarning\\x12\\x1b\\n\\x17\\x41SSYST_OIL_WARNING_IDLE\\x10\\x00\\x12!\\n\\x1d\\x41SSYST_OIL_WARNING_REFILL_LTR\\x10\\x01\\x12\"\\n\\x1e\\x41SSYST_OIL_WARNING_NOT_DEFINED\\x10\\x02\\x12!\\n\\x1d\\x41SSYST_OIL_WARNING_OVERFILL_1\\x10\\x03\\x12#\\n\\x1f\\x41SSYST_OIL_WARNING_SENSOR_FAULT\\x10\\x04\\x12 \\n\\x1c\\x41SSYST_OIL_WARNING_SWTCH_MIN\\x10\\x05\\x12\\x1f\\n\\x1b\\x41SSYST_OIL_WARNING_ENG_STOP\\x10\\x06*\\x8e\\x01\\n\\x1aProtectionActivationStatus\\x12$\\n PROTECTION_ACTIVATION_STATUS_OFF\\x10\\x00\\x12#\\n\\x1fPROTECTION_ACTIVATION_STATUS_ON\\x10\\x01\\x12%\\n!PROTECTION_ACTIVATION_STATUS_INIT\\x10\\x02*f\\n\\x16ProtectionSensorStatus\\x12\\'\\n#PROTECTION_SENSOR_STATUS_NOT_ACTIVE\\x10\\x00\\x12#\\n\\x1fPROTECTION_SENSOR_STATUS_ACTIVE\\x10\\x01*\\xa8\\x02\\n\\x1cTcuConnectionStateLowChannel\\x12,\\n(TCU_CONNECTION_STATE_LOW_CHANNEL_UNKNOWN\\x10\\x00\\x12\\x38\\n4TCU_CONNECTION_STATE_LOW_CHANNEL_INITIALLY_CONNECTED\\x10\\x01\\x12\\x30\\n,TCU_CONNECTION_STATE_LOW_CHANNEL_RECONNECTED\\x10\\x02\\x12\\x31\\n-TCU_CONNECTION_STATE_LOW_CHANNEL_DISCONNECTED\\x10\\x03\\x12;\\n7TCU_CONNECTION_STATE_LOW_CHANNEL_UNPLANNED_DISCONNECTED\\x10\\x04*{\\n\\x11TcuThermoShutDown\\x12 \\n\\x1cTCU_THERMO_SHUT_DOWN_UNKNOWN\\x10\\x00\\x12#\\n\\x1fTCU_THERMO_SHUT_DOWN_NOT_ACTIVE\\x10\\x01\\x12\\x1f\\n\\x1bTCU_THERMO_SHUT_DOWN_ACTIVE\\x10\\x02*\\xb5\\x01\\n\\x12KeyActivationState\\x12 \\n\\x1cKEY_ACTIVATION_STATE_UNKNOWN\\x10\\x00\\x12#\\n\\x1fKEY_ACTIVATION_STATE_ALL_ACTIVE\\x10\\x01\\x12.\\n*KEY_ACTIVATION_STATE_SELECTIVE_DEACTIVATED\\x10\\x02\\x12(\\n$KEY_ACTIVATION_STATE_ALL_DEACTIVATED\\x10\\x03*\\x84\\x01\\n\\x1ePictureTransferSelectionStatus\\x12\\x32\\n.PICTURE_TRANSFER_SELECTION_STATUS_NOT_SELECTED\\x10\\x00\\x12.\\n*PICTURE_TRANSFER_SELECTION_STATUS_SELECTED\\x10\\x01\\x42\\x1c\\n\\x1a\\x63om.daimler.mbcarkit.protob\\x06proto3'\n)\n\n_globals = globals()\n_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)\n_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, \"vehicle_events_pb2\", _globals)\nif not _descriptor._USE_C_DESCRIPTORS:\n    _globals[\"DESCRIPTOR\"]._loaded_options = None\n    _globals[\"DESCRIPTOR\"]._serialized_options = b\"\\n\\032com.daimler.mbcarkit.proto\"\n    _globals[\"_VEPUPDATE_ATTRIBUTESENTRY\"]._loaded_options = None\n    _globals[\"_VEPUPDATE_ATTRIBUTESENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_VEHICLEATTRIBUTESTATUS_SPEEDDISTANCEUNIT\"]._loaded_options = None\n    _globals[\"_VEHICLEATTRIBUTESTATUS_SPEEDDISTANCEUNIT\"]._serialized_options = b\"\\030\\001\"\n    _globals[\"_VEHICLEATTRIBUTESTATUS\"].fields_by_name[\"timestamp\"]._loaded_options = None\n    _globals[\"_VEHICLEATTRIBUTESTATUS\"].fields_by_name[\"timestamp\"]._serialized_options = b\"\\030\\001\"\n    _globals[\"_VEHICLEATTRIBUTESTATUS\"].fields_by_name[\"speed_distance_unit\"]._loaded_options = None\n    _globals[\"_VEHICLEATTRIBUTESTATUS\"].fields_by_name[\"speed_distance_unit\"]._serialized_options = b\"\\030\\001\"\n    _globals[\"_CHARGINGSCHEDULEACTIVE_CHARGINGSCHEDULEACTIVEUSECASEID\"]._loaded_options = None\n    _globals[\"_CHARGINGSCHEDULEACTIVE_CHARGINGSCHEDULEACTIVEUSECASEID\"]._serialized_options = b\"\\030\\001\"\n    _globals[\"_CHARGINGSCHEDULEACTIVE\"].fields_by_name[\"schedule_id_deprecated\"]._loaded_options = None\n    _globals[\"_CHARGINGSCHEDULEACTIVE\"].fields_by_name[\"schedule_id_deprecated\"]._serialized_options = b\"\\030\\001\"\n    _globals[\"_CHARGINGSCHEDULEACTIVE\"].fields_by_name[\"use_case_id_deprecated\"]._loaded_options = None\n    _globals[\"_CHARGINGSCHEDULEACTIVE\"].fields_by_name[\"use_case_id_deprecated\"]._serialized_options = b\"\\030\\001\"\n    _globals[\"_VEPUPDATESBYVIN_UPDATESENTRY\"]._loaded_options = None\n    _globals[\"_VEPUPDATESBYVIN_UPDATESENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_VEHICLESTATUS_ATTRIBUTESENTRY\"]._loaded_options = None\n    _globals[\"_VEHICLESTATUS_ATTRIBUTESENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_TRACKINGEVENT_PAYLOADENTRY\"]._loaded_options = None\n    _globals[\"_TRACKINGEVENT_PAYLOADENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_ACKNOWLEDGEVEPREQUEST\"]._loaded_options = None\n    _globals[\"_ACKNOWLEDGEVEPREQUEST\"]._serialized_options = b\"\\030\\001\"\n    _globals[\"_SCOPES_ADDITIONALRESOURCESENTRY\"]._loaded_options = None\n    _globals[\"_SCOPES_ADDITIONALRESOURCESENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_VEHICLESTATUSUPDATES_VEHICLESTATUSUPDATESENTRY\"]._loaded_options = None\n    _globals[\"_VEHICLESTATUSUPDATES_VEHICLESTATUSUPDATESENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_AMGSTAGEMODESTATE\"]._serialized_start = 58203\n    _globals[\"_AMGSTAGEMODESTATE\"]._serialized_end = 58488\n    _globals[\"_CHILDPRESENCEDETECTIONWARNINGLEVEL\"]._serialized_start = 58491\n    _globals[\"_CHILDPRESENCEDETECTIONWARNINGLEVEL\"]._serialized_end = 58927\n    _globals[\"_CHILDPRESENCEDETECTIONWARNINGLASTEVENT\"]._serialized_start = 58930\n    _globals[\"_CHILDPRESENCEDETECTIONWARNINGLASTEVENT\"]._serialized_end = 59468\n    _globals[\"_KEYLINEACTIVATIONSTATES\"]._serialized_start = 59470\n    _globals[\"_KEYLINEACTIVATIONSTATES\"]._serialized_end = 59597\n    _globals[\"_PERFORMANCELIMITATIONMODESTATUS\"]._serialized_start = 59600\n    _globals[\"_PERFORMANCELIMITATIONMODESTATUS\"]._serialized_end = 59783\n    _globals[\"_EXTERIORMONITORINGSTATUS\"]._serialized_start = 59786\n    _globals[\"_EXTERIORMONITORINGSTATUS\"]._serialized_end = 60084\n    _globals[\"_INTERIORMONITORINGSTATUS\"]._serialized_start = 60087\n    _globals[\"_INTERIORMONITORINGSTATUS\"]._serialized_end = 60410\n    _globals[\"_UPDATESTATUS\"]._serialized_start = 60413\n    _globals[\"_UPDATESTATUS\"]._serialized_end = 60622\n    _globals[\"_SOHCALIBRATIONPLANNED\"]._serialized_start = 60624\n    _globals[\"_SOHCALIBRATIONPLANNED\"]._serialized_end = 60709\n    _globals[\"_DCCHARGINGPROFILE\"]._serialized_start = 60712\n    _globals[\"_DCCHARGINGPROFILE\"]._serialized_end = 60977\n    _globals[\"_PARKEVENTPICTURETRANSMISSIONSTATUS\"]._serialized_start = 60980\n    _globals[\"_PARKEVENTPICTURETRANSMISSIONSTATUS\"]._serialized_end = 61394\n    _globals[\"_CHARGINGSCHEDULEUSECASEID\"]._serialized_start = 61397\n    _globals[\"_CHARGINGSCHEDULEUSECASEID\"]._serialized_end = 63208\n    _globals[\"_SCHEDULEIDSTATUS\"]._serialized_start = 63210\n    _globals[\"_SCHEDULEIDSTATUS\"]._serialized_end = 63293\n    _globals[\"_SOCCALIBRATIONREQUEST\"]._serialized_start = 63296\n    _globals[\"_SOCCALIBRATIONREQUEST\"]._serialized_end = 63442\n    _globals[\"_SOHFAVORABLECONDITIONS\"]._serialized_start = 63445\n    _globals[\"_SOHFAVORABLECONDITIONS\"]._serialized_end = 63611\n    _globals[\"_CHARGINGSTOPERRORDETAILS\"]._serialized_start = 63614\n    _globals[\"_CHARGINGSTOPERRORDETAILS\"]._serialized_end = 63757\n    _globals[\"_SOHCALIBRATIONSTATE\"]._serialized_start = 63760\n    _globals[\"_SOHCALIBRATIONSTATE\"]._serialized_end = 64398\n    _globals[\"_SOHCALIBRATIONREQUIRED\"]._serialized_start = 64400\n    _globals[\"_SOHCALIBRATIONREQUIRED\"]._serialized_end = 64488\n    _globals[\"_SOHCALIBRATIONREQUEST\"]._serialized_start = 64491\n    _globals[\"_SOHCALIBRATIONREQUEST\"]._serialized_end = 64637\n    _globals[\"_TURNOFFENGINEPREWARNING\"]._serialized_start = 64640\n    _globals[\"_TURNOFFENGINEPREWARNING\"]._serialized_end = 64783\n    _globals[\"_SOHCALIBRATIONNOTIFICATIONS\"]._serialized_start = 64786\n    _globals[\"_SOHCALIBRATIONNOTIFICATIONS\"]._serialized_end = 65123\n    _globals[\"_HVBATTERYPRECONDSTATESDISCHARGING\"]._serialized_start = 65126\n    _globals[\"_HVBATTERYPRECONDSTATESDISCHARGING\"]._serialized_end = 65483\n    _globals[\"_HVBATTERYPRECONDSTATESCHARGING\"]._serialized_start = 65486\n    _globals[\"_HVBATTERYPRECONDSTATESCHARGING\"]._serialized_end = 65821\n    _globals[\"_MAINCATEGORY\"]._serialized_start = 65824\n    _globals[\"_MAINCATEGORY\"]._serialized_end = 66019\n    _globals[\"_SUBCATEGORY\"]._serialized_start = 66021\n    _globals[\"_SUBCATEGORY\"]._serialized_end = 66099\n    _globals[\"_SPECIFICCATEGORY\"]._serialized_start = 66101\n    _globals[\"_SPECIFICCATEGORY\"]._serialized_end = 66196\n    _globals[\"_METHOD\"]._serialized_start = 66199\n    _globals[\"_METHOD\"]._serialized_end = 66360\n    _globals[\"_STATUS\"]._serialized_start = 66363\n    _globals[\"_STATUS\"]._serialized_end = 66512\n    _globals[\"_HVBATTERYPRECONDAVAILABILITY\"]._serialized_start = 66515\n    _globals[\"_HVBATTERYPRECONDAVAILABILITY\"]._serialized_end = 67085\n    _globals[\"_EVSEPAIRINGSTATE\"]._serialized_start = 67088\n    _globals[\"_EVSEPAIRINGSTATE\"]._serialized_end = 67569\n    _globals[\"_EMERGENCYPOWERSUPPLY\"]._serialized_start = 67571\n    _globals[\"_EMERGENCYPOWERSUPPLY\"]._serialized_end = 67656\n    _globals[\"_PARKCOLLISIONPICTURETRANSFERSTATUS\"]._serialized_start = 67659\n    _globals[\"_PARKCOLLISIONPICTURETRANSFERSTATUS\"]._serialized_end = 67802\n    _globals[\"_PICTURERECORDINGSTATUS\"]._serialized_start = 67804\n    _globals[\"_PICTURERECORDINGSTATUS\"]._serialized_end = 67906\n    _globals[\"_PARKCOLLISIONINACTIVEREASON\"]._serialized_start = 67909\n    _globals[\"_PARKCOLLISIONINACTIVEREASON\"]._serialized_end = 68443\n    _globals[\"_PARKCOLLISIONSELECTIONSTATUS\"]._serialized_start = 68445\n    _globals[\"_PARKCOLLISIONSELECTIONSTATUS\"]._serialized_end = 68568\n    _globals[\"_VEHICLETHEFTALARMINACTIVEREASON\"]._serialized_start = 68571\n    _globals[\"_VEHICLETHEFTALARMINACTIVEREASON\"]._serialized_end = 68804\n    _globals[\"_TOWPROTECTIONACTIVATIONSTATUS\"]._serialized_start = 68807\n    _globals[\"_TOWPROTECTIONACTIVATIONSTATUS\"]._serialized_end = 68964\n    _globals[\"_TOWPROTECTIONSELECTIONSTATUS\"]._serialized_start = 68966\n    _globals[\"_TOWPROTECTIONSELECTIONSTATUS\"]._serialized_end = 69089\n    _globals[\"_INTERIORPROTECTIONACTIVATIONSTATUS\"]._serialized_start = 69092\n    _globals[\"_INTERIORPROTECTIONACTIVATIONSTATUS\"]._serialized_end = 69269\n    _globals[\"_INTERIORPROTECTIONSELECTIONSTATUS\"]._serialized_start = 69272\n    _globals[\"_INTERIORPROTECTIONSELECTIONSTATUS\"]._serialized_end = 69410\n    _globals[\"_PANICALARMACTIVE\"]._serialized_start = 69412\n    _globals[\"_PANICALARMACTIVE\"]._serialized_end = 69506\n    _globals[\"_PARKEVENTPICTURESELECTIONSTATUS\"]._serialized_start = 69509\n    _globals[\"_PARKEVENTPICTURESELECTIONSTATUS\"]._serialized_end = 69646\n    _globals[\"_PARKCOLLISIONACTIVATIONSTATUS\"]._serialized_start = 69649\n    _globals[\"_PARKCOLLISIONACTIVATIONSTATUS\"]._serialized_end = 69806\n    _globals[\"_CHARGINGCOMPATIBILITYERROR\"]._serialized_start = 69809\n    _globals[\"_CHARGINGCOMPATIBILITYERROR\"]._serialized_end = 70184\n    _globals[\"_CHARGINGFLAPERRORDETAILS\"]._serialized_start = 70187\n    _globals[\"_CHARGINGFLAPERRORDETAILS\"]._serialized_end = 70609\n    _globals[\"_CHARGEFLAPSPOSITIONSTATE\"]._serialized_start = 70612\n    _globals[\"_CHARGEFLAPSPOSITIONSTATE\"]._serialized_end = 70844\n    _globals[\"_CHARGINGPOWERRESTRICTION\"]._serialized_start = 70847\n    _globals[\"_CHARGINGPOWERRESTRICTION\"]._serialized_end = 71539\n    _globals[\"_BATTERYHEALTH\"]._serialized_start = 71542\n    _globals[\"_BATTERYHEALTH\"]._serialized_end = 71876\n    _globals[\"_PRECONDSTATETYPE\"]._serialized_start = 71879\n    _globals[\"_PRECONDSTATETYPE\"]._serialized_end = 72056\n    _globals[\"_CHARGEPROGRAM\"]._serialized_start = 72058\n    _globals[\"_CHARGEPROGRAM\"]._serialized_end = 72179\n    _globals[\"_ATTRIBUTESTATUS\"]._serialized_start = 72181\n    _globals[\"_ATTRIBUTESTATUS\"]._serialized_end = 72283\n    _globals[\"_SCOPE\"]._serialized_start = 72285\n    _globals[\"_SCOPE\"]._serialized_end = 72388\n    _globals[\"_DOORSTATUS\"]._serialized_start = 72390\n    _globals[\"_DOORSTATUS\"]._serialized_end = 72446\n    _globals[\"_DOORLOCKSTATUS\"]._serialized_start = 72448\n    _globals[\"_DOORLOCKSTATUS\"]._serialized_end = 72520\n    _globals[\"_DOORLOCKSTATUSVEHICLE\"]._serialized_start = 72523\n    _globals[\"_DOORLOCKSTATUSVEHICLE\"]._serialized_end = 72714\n    _globals[\"_DOORSTATUSOVERALL\"]._serialized_start = 72717\n    _globals[\"_DOORSTATUSOVERALL\"]._serialized_end = 72850\n    _globals[\"_DOORSTATUSGAS\"]._serialized_start = 72852\n    _globals[\"_DOORSTATUSGAS\"]._serialized_end = 72942\n    _globals[\"_CHARGINGSTATUS\"]._serialized_start = 72945\n    _globals[\"_CHARGINGSTATUS\"]._serialized_end = 73668\n    _globals[\"_CHARGINGMODE\"]._serialized_start = 73671\n    _globals[\"_CHARGINGMODE\"]._serialized_end = 73898\n    _globals[\"_SELECTEDCHARGEPROGRAM\"]._serialized_start = 73901\n    _globals[\"_SELECTEDCHARGEPROGRAM\"]._serialized_end = 74605\n    _globals[\"_SMARTCHARGING\"]._serialized_start = 74608\n    _globals[\"_SMARTCHARGING\"]._serialized_end = 74746\n    _globals[\"_SMARTCHARGINGATDEPARTURE\"]._serialized_start = 74748\n    _globals[\"_SMARTCHARGINGATDEPARTURE\"]._serialized_end = 74858\n    _globals[\"_CHARGECOUPLERSTATUS\"]._serialized_start = 74861\n    _globals[\"_CHARGECOUPLERSTATUS\"]._serialized_end = 75109\n    _globals[\"_CHARGECOUPLERLOCKSTATUS\"]._serialized_start = 75112\n    _globals[\"_CHARGECOUPLERLOCKSTATUS\"]._serialized_end = 75259\n    _globals[\"_CHARGEFLAPSTATUS\"]._serialized_start = 75261\n    _globals[\"_CHARGEFLAPSTATUS\"]._serialized_end = 75376\n    _globals[\"_CHARGINGERRORDETAILS\"]._serialized_start = 75379\n    _globals[\"_CHARGINGERRORDETAILS\"]._serialized_end = 75516\n    _globals[\"_IGNITIONSTATE\"]._serialized_start = 75519\n    _globals[\"_IGNITIONSTATE\"]._serialized_end = 75657\n    _globals[\"_ENGINESTATE\"]._serialized_start = 75659\n    _globals[\"_ENGINESTATE\"]._serialized_end = 75728\n    _globals[\"_PARKBRAKESTATUS\"]._serialized_start = 75730\n    _globals[\"_PARKBRAKESTATUS\"]._serialized_end = 75809\n    _globals[\"_ENGINEHOODSTATUS\"]._serialized_start = 75811\n    _globals[\"_ENGINEHOODSTATUS\"]._serialized_end = 75889\n    _globals[\"_ROOFTOPSTATUS\"]._serialized_start = 75891\n    _globals[\"_ROOFTOPSTATUS\"]._serialized_end = 76006\n    _globals[\"_WINDOWSTATUS\"]._serialized_start = 76009\n    _globals[\"_WINDOWSTATUS\"]._serialized_end = 76160\n    _globals[\"_WINDOWSTATUSBLIND\"]._serialized_start = 76163\n    _globals[\"_WINDOWSTATUSBLIND\"]._serialized_end = 76306\n    _globals[\"_WINDOWSTATUSOVERALL\"]._serialized_start = 76309\n    _globals[\"_WINDOWSTATUSOVERALL\"]._serialized_end = 76473\n    _globals[\"_SUNROOFSTATUS\"]._serialized_start = 76476\n    _globals[\"_SUNROOFSTATUS\"]._serialized_end = 76609\n    _globals[\"_SUNROOFSTATUSBLIND\"]._serialized_start = 76612\n    _globals[\"_SUNROOFSTATUSBLIND\"]._serialized_end = 76793\n    _globals[\"_SUNROOFEVENT\"]._serialized_start = 76796\n    _globals[\"_SUNROOFEVENT\"]._serialized_end = 76955\n    _globals[\"_FLIPWINDOWSTATUS\"]._serialized_start = 76957\n    _globals[\"_FLIPWINDOWSTATUS\"]._serialized_end = 77035\n    _globals[\"_TIREMARKER\"]._serialized_start = 77038\n    _globals[\"_TIREMARKER\"]._serialized_end = 77187\n    _globals[\"_TIRESENSORAVAILABLE\"]._serialized_start = 77190\n    _globals[\"_TIRESENSORAVAILABLE\"]._serialized_end = 77421\n    _globals[\"_TIREWARNINGLEVELPRW\"]._serialized_start = 77424\n    _globals[\"_TIREWARNINGLEVELPRW\"]._serialized_end = 77563\n    _globals[\"_TIREWARNINGLAMP\"]._serialized_start = 77566\n    _globals[\"_TIREWARNINGLAMP\"]._serialized_end = 77701\n    _globals[\"_TIREWARNINGSPRW\"]._serialized_start = 77703\n    _globals[\"_TIREWARNINGSPRW\"]._serialized_end = 77781\n    _globals[\"_TIREWARNINGSRDK\"]._serialized_start = 77784\n    _globals[\"_TIREWARNINGSRDK\"]._serialized_end = 77932\n    _globals[\"_PRECONDERROR\"]._serialized_start = 77935\n    _globals[\"_PRECONDERROR\"]._serialized_end = 78250\n    _globals[\"_PRECONDNOW\"]._serialized_start = 78252\n    _globals[\"_PRECONDNOW\"]._serialized_end = 78314\n    _globals[\"_PRECONDOPERATINGMODE\"]._serialized_start = 78317\n    _globals[\"_PRECONDOPERATINGMODE\"]._serialized_end = 78475\n    _globals[\"_PRECONDATDEPARTURE\"]._serialized_start = 78477\n    _globals[\"_PRECONDATDEPARTURE\"]._serialized_end = 78561\n    _globals[\"_PRECONDSEAT\"]._serialized_start = 78563\n    _globals[\"_PRECONDSEAT\"]._serialized_end = 78619\n    _globals[\"_AUXHEATSTATUS\"]._serialized_start = 78622\n    _globals[\"_AUXHEATSTATUS\"]._serialized_end = 78897\n    _globals[\"_AUXHEATTIMESELECTION\"]._serialized_start = 78900\n    _globals[\"_AUXHEATTIMESELECTION\"]._serialized_end = 79059\n    _globals[\"_AUXHEATWARNING\"]._serialized_start = 79061\n    _globals[\"_AUXHEATWARNING\"]._serialized_end = 79170\n    _globals[\"_DEPARTURETIMEMODE\"]._serialized_start = 79173\n    _globals[\"_DEPARTURETIMEMODE\"]._serialized_end = 79387\n    _globals[\"_WEEKDAY\"]._serialized_start = 79390\n    _globals[\"_WEEKDAY\"]._serialized_end = 79547\n    _globals[\"_RANGESKIPINDICATION\"]._serialized_start = 79549\n    _globals[\"_RANGESKIPINDICATION\"]._serialized_end = 79637\n    _globals[\"_FILTERPARTICLELOADING\"]._serialized_start = 79639\n    _globals[\"_FILTERPARTICLELOADING\"]._serialized_end = 79765\n    _globals[\"_LANGUAGEHU\"]._serialized_start = 79768\n    _globals[\"_LANGUAGEHU\"]._serialized_end = 80772\n    _globals[\"_SPEEDUNITFROMIC\"]._serialized_start = 80774\n    _globals[\"_SPEEDUNITFROMIC\"]._serialized_end = 80848\n    _globals[\"_TEMPERATUREUNITHU\"]._serialized_start = 80850\n    _globals[\"_TEMPERATUREUNITHU\"]._serialized_end = 80938\n    _globals[\"_TIMEFORMATHU\"]._serialized_start = 80940\n    _globals[\"_TIMEFORMATHU\"]._serialized_end = 81012\n    _globals[\"_TRACKINGSTATEHU\"]._serialized_start = 81014\n    _globals[\"_TRACKINGSTATEHU\"]._serialized_end = 81084\n    _globals[\"_VEHICLEDATACONNECTIONSTATE\"]._serialized_start = 81086\n    _globals[\"_VEHICLEDATACONNECTIONSTATE\"]._serialized_end = 81207\n    _globals[\"_VEHICLEHEALTHSTATUS\"]._serialized_start = 81209\n    _globals[\"_VEHICLEHEALTHSTATUS\"]._serialized_end = 81328\n    _globals[\"_DRIVINGMODE\"]._serialized_start = 81331\n    _globals[\"_DRIVINGMODE\"]._serialized_end = 81496\n    _globals[\"_OILWARNINGLEVEL\"]._serialized_start = 81499\n    _globals[\"_OILWARNINGLEVEL\"]._serialized_end = 81644\n    _globals[\"_PARKEVENTLEVEL\"]._serialized_start = 81646\n    _globals[\"_PARKEVENTLEVEL\"]._serialized_end = 81744\n    _globals[\"_PARKEVENTTYPE\"]._serialized_start = 81747\n    _globals[\"_PARKEVENTTYPE\"]._serialized_end = 82075\n    _globals[\"_PARKEVENTSENSORSTATUS\"]._serialized_start = 82078\n    _globals[\"_PARKEVENTSENSORSTATUS\"]._serialized_end = 82240\n    _globals[\"_WARNINGWASHWATER\"]._serialized_start = 82242\n    _globals[\"_WARNINGWASHWATER\"]._serialized_end = 82323\n    _globals[\"_HYBRIDWARNINGS\"]._serialized_start = 82326\n    _globals[\"_HYBRIDWARNINGS\"]._serialized_end = 82697\n    _globals[\"_LASTTHEFTWARNINGREASON\"]._serialized_start = 82700\n    _globals[\"_LASTTHEFTWARNINGREASON\"]._serialized_end = 83929\n    _globals[\"_HVBATTERYTHERMALPROPAGATIONEVENT\"]._serialized_start = 83932\n    _globals[\"_HVBATTERYTHERMALPROPAGATIONEVENT\"]._serialized_end = 84105\n    _globals[\"_STARTERBATTERYSTATE\"]._serialized_start = 84108\n    _globals[\"_STARTERBATTERYSTATE\"]._serialized_end = 84301\n    _globals[\"_VEHICLEPOSITIONERRORCODE\"]._serialized_start = 84304\n    _globals[\"_VEHICLEPOSITIONERRORCODE\"]._serialized_end = 84593\n    _globals[\"_CALIBRATIONREQUEST\"]._serialized_start = 84595\n    _globals[\"_CALIBRATIONREQUEST\"]._serialized_end = 84710\n    _globals[\"_ASSYSTOILQUANTITY\"]._serialized_start = 84713\n    _globals[\"_ASSYSTOILQUANTITY\"]._serialized_end = 85361\n    _globals[\"_ASSYSTOILWARNING\"]._serialized_start = 85364\n    _globals[\"_ASSYSTOILWARNING\"]._serialized_end = 85621\n    _globals[\"_PROTECTIONACTIVATIONSTATUS\"]._serialized_start = 85624\n    _globals[\"_PROTECTIONACTIVATIONSTATUS\"]._serialized_end = 85766\n    _globals[\"_PROTECTIONSENSORSTATUS\"]._serialized_start = 85768\n    _globals[\"_PROTECTIONSENSORSTATUS\"]._serialized_end = 85870\n    _globals[\"_TCUCONNECTIONSTATELOWCHANNEL\"]._serialized_start = 85873\n    _globals[\"_TCUCONNECTIONSTATELOWCHANNEL\"]._serialized_end = 86169\n    _globals[\"_TCUTHERMOSHUTDOWN\"]._serialized_start = 86171\n    _globals[\"_TCUTHERMOSHUTDOWN\"]._serialized_end = 86294\n    _globals[\"_KEYACTIVATIONSTATE\"]._serialized_start = 86297\n    _globals[\"_KEYACTIVATIONSTATE\"]._serialized_end = 86478\n    _globals[\"_PICTURETRANSFERSELECTIONSTATUS\"]._serialized_start = 86481\n    _globals[\"_PICTURETRANSFERSELECTIONSTATUS\"]._serialized_end = 86613\n    _globals[\"_VEPUPDATE\"]._serialized_start = 166\n    _globals[\"_VEPUPDATE\"]._serialized_end = 426\n    _globals[\"_VEPUPDATE_ATTRIBUTESENTRY\"]._serialized_start = 346\n    _globals[\"_VEPUPDATE_ATTRIBUTESENTRY\"]._serialized_end = 426\n    _globals[\"_VEHICLEATTRIBUTESTATUS\"]._serialized_start = 429\n    _globals[\"_VEHICLEATTRIBUTESTATUS\"]._serialized_end = 8421\n    _globals[\"_VEHICLEATTRIBUTESTATUS_COMBUSTIONCONSUMPTIONUNIT\"]._serialized_start = 6440\n    _globals[\"_VEHICLEATTRIBUTESTATUS_COMBUSTIONCONSUMPTIONUNIT\"]._serialized_end = 6575\n    _globals[\"_VEHICLEATTRIBUTESTATUS_ELECTRICITYCONSUMPTIONUNIT\"]._serialized_start = 6578\n    _globals[\"_VEHICLEATTRIBUTESTATUS_ELECTRICITYCONSUMPTIONUNIT\"]._serialized_end = 6731\n    _globals[\"_VEHICLEATTRIBUTESTATUS_GASCONSUMPTIONUNIT\"]._serialized_start = 6733\n    _globals[\"_VEHICLEATTRIBUTESTATUS_GASCONSUMPTIONUNIT\"]._serialized_end = 6838\n    _globals[\"_VEHICLEATTRIBUTESTATUS_SPEEDDISTANCEUNIT\"]._serialized_start = 6840\n    _globals[\"_VEHICLEATTRIBUTESTATUS_SPEEDDISTANCEUNIT\"]._serialized_end = 6927\n    _globals[\"_VEHICLEATTRIBUTESTATUS_SPEEDUNIT\"]._serialized_start = 6929\n    _globals[\"_VEHICLEATTRIBUTESTATUS_SPEEDUNIT\"]._serialized_end = 7001\n    _globals[\"_VEHICLEATTRIBUTESTATUS_DISTANCEUNIT\"]._serialized_start = 7003\n    _globals[\"_VEHICLEATTRIBUTESTATUS_DISTANCEUNIT\"]._serialized_end = 7075\n    _globals[\"_VEHICLEATTRIBUTESTATUS_TEMPERATUREUNIT\"]._serialized_start = 7077\n    _globals[\"_VEHICLEATTRIBUTESTATUS_TEMPERATUREUNIT\"]._serialized_end = 7157\n    _globals[\"_VEHICLEATTRIBUTESTATUS_PRESSUREUNIT\"]._serialized_start = 7159\n    _globals[\"_VEHICLEATTRIBUTESTATUS_PRESSUREUNIT\"]._serialized_end = 7231\n    _globals[\"_VEHICLEATTRIBUTESTATUS_RATIOUNIT\"]._serialized_start = 7233\n    _globals[\"_VEHICLEATTRIBUTESTATUS_RATIOUNIT\"]._serialized_end = 7285\n    _globals[\"_VEHICLEATTRIBUTESTATUS_CLOCKHOURUNIT\"]._serialized_start = 7287\n    _globals[\"_VEHICLEATTRIBUTESTATUS_CLOCKHOURUNIT\"]._serialized_end = 7355\n    _globals[\"_VEHICLEATTRIBUTESTATUS_TCUCONNECTIONSTATELOWCHANNELSTATUS\"]._serialized_start = 7358\n    _globals[\"_VEHICLEATTRIBUTESTATUS_TCUCONNECTIONSTATELOWCHANNELSTATUS\"]._serialized_end = 7516\n    _globals[\"_VEHICLEATTRIBUTESTATUS_CHARGINGCOUPLERERRORDETAILS\"]._serialized_start = 7519\n    _globals[\"_VEHICLEATTRIBUTESTATUS_CHARGINGCOUPLERERRORDETAILS\"]._serialized_end = 7886\n    _globals[\"_VEHICLEATTRIBUTESTATUS_CHARGINGERRORIMPOSSIBLECHANGETO400V\"]._serialized_start = 7889\n    _globals[\"_VEHICLEATTRIBUTESTATUS_CHARGINGERRORIMPOSSIBLECHANGETO400V\"]._serialized_end = 8056\n    _globals[\"_VEHICLEATTRIBUTESTATUS_CHARGINGERRORIMPOSSIBLECHANGETO800V\"]._serialized_start = 8059\n    _globals[\"_VEHICLEATTRIBUTESTATUS_CHARGINGERRORIMPOSSIBLECHANGETO800V\"]._serialized_end = 8226\n    _globals[\"_VEHICLEATTRIBUTESTATUS_CHARGINGERRORVEHICLENOSUPPORT400V\"]._serialized_start = 8229\n    _globals[\"_VEHICLEATTRIBUTESTATUS_CHARGINGERRORVEHICLENOSUPPORT400V\"]._serialized_end = 8387\n    _globals[\"_AMGSTAGEMODEERROR\"]._serialized_start = 8424\n    _globals[\"_AMGSTAGEMODEERROR\"]._serialized_end = 8592\n    _globals[\"_KEYLINEACTIVATIONSTATEVALUE\"]._serialized_start = 8594\n    _globals[\"_KEYLINEACTIVATIONSTATEVALUE\"]._serialized_end = 8695\n    _globals[\"_NEXTDEPARTURETIMEVALUE\"]._serialized_start = 8697\n    _globals[\"_NEXTDEPARTURETIMEVALUE\"]._serialized_end = 8751\n    _globals[\"_REMOTEUPDATESTARTSTATUS\"]._serialized_start = 8754\n    _globals[\"_REMOTEUPDATESTARTSTATUS\"]._serialized_end = 8895\n    _globals[\"_CHARGINGSCHEDULEACTIVE\"]._serialized_start = 8898\n    _globals[\"_CHARGINGSCHEDULEACTIVE\"]._serialized_end = 11698\n    _globals[\"_CHARGINGSCHEDULEACTIVE_CHARGINGSCHEDULEACTIVESCHEDULE\"]._serialized_start = 9382\n    _globals[\"_CHARGINGSCHEDULEACTIVE_CHARGINGSCHEDULEACTIVESCHEDULE\"]._serialized_end = 9461\n    _globals[\"_CHARGINGSCHEDULEACTIVE_CHARGINGSCHEDULEACTIVEUSECASEID\"]._serialized_start = 9464\n    _globals[\"_CHARGINGSCHEDULEACTIVE_CHARGINGSCHEDULEACTIVEUSECASEID\"]._serialized_end = 11516\n    _globals[\"_CHARGINGSCHEDULEACTIVE_CHARGINGSCHEDULEACTIVEOFFLINEMODE\"]._serialized_start = 11519\n    _globals[\"_CHARGINGSCHEDULEACTIVE_CHARGINGSCHEDULEACTIVEOFFLINEMODE\"]._serialized_end = 11698\n    _globals[\"_HVBATTERYPRECONDSTATE\"]._serialized_start = 11701\n    _globals[\"_HVBATTERYPRECONDSTATE\"]._serialized_end = 11844\n    _globals[\"_HVBATTERYPRECONDREQUESTSTATE\"]._serialized_start = 11847\n    _globals[\"_HVBATTERYPRECONDREQUESTSTATE\"]._serialized_end = 12077\n    _globals[\"_PRECONDOPERABILITYSTATE\"]._serialized_start = 12080\n    _globals[\"_PRECONDOPERABILITYSTATE\"]._serialized_end = 12545\n    _globals[\"_PRECONDOPERABILITYSTATE_PRECONDERRORSTATE\"]._serialized_start = 12214\n    _globals[\"_PRECONDOPERABILITYSTATE_PRECONDERRORSTATE\"]._serialized_end = 12545\n    _globals[\"_CHARGINGSCHEDULEREQUESTED\"]._serialized_start = 12548\n    _globals[\"_CHARGINGSCHEDULEREQUESTED\"]._serialized_end = 14626\n    _globals[\"_CHARGINGSCHEDULEREQUESTED_SCHEDULEIDSTATUS\"]._serialized_start = 12737\n    _globals[\"_CHARGINGSCHEDULEREQUESTED_SCHEDULEIDSTATUS\"]._serialized_end = 12819\n    _globals[\"_CHARGINGSCHEDULEREQUESTED_CHARGINGSCHEDULEUSECASEID\"]._serialized_start = 12822\n    _globals[\"_CHARGINGSCHEDULEREQUESTED_CHARGINGSCHEDULEUSECASEID\"]._serialized_end = 14626\n    _globals[\"_CHARGINGTIMER\"]._serialized_start = 14628\n    _globals[\"_CHARGINGTIMER\"]._serialized_end = 14687\n    _globals[\"_CHARGINGTIMERENTRY\"]._serialized_start = 14690\n    _globals[\"_CHARGINGTIMERENTRY\"]._serialized_end = 15087\n    _globals[\"_CHARGINGTIMERENTRY_CHARGINGTIMERACTION\"]._serialized_start = 14923\n    _globals[\"_CHARGINGTIMERENTRY_CHARGINGTIMERACTION\"]._serialized_end = 15087\n    _globals[\"_CHARGINGPREDICTIONSOC\"]._serialized_start = 15089\n    _globals[\"_CHARGINGPREDICTIONSOC\"]._serialized_end = 15211\n    _globals[\"_CHARGINGPREDICTIONDEPARTURETIME\"]._serialized_start = 15213\n    _globals[\"_CHARGINGPREDICTIONDEPARTURETIME\"]._serialized_end = 15312\n    _globals[\"_CHARGEINLETSENTRY\"]._serialized_start = 15315\n    _globals[\"_CHARGEINLETSENTRY\"]._serialized_end = 15976\n    _globals[\"_CHARGEINLETSENTRY_CHARGEINLETSCOUPLERSTATE\"]._serialized_start = 15491\n    _globals[\"_CHARGEINLETSENTRY_CHARGEINLETSCOUPLERSTATE\"]._serialized_end = 15741\n    _globals[\"_CHARGEINLETSENTRY_CHARGEINLETSLOCKSTATE\"]._serialized_start = 15744\n    _globals[\"_CHARGEINLETSENTRY_CHARGEINLETSLOCKSTATE\"]._serialized_end = 15976\n    _globals[\"_CHARGEINLETS\"]._serialized_start = 15978\n    _globals[\"_CHARGEINLETS\"]._serialized_end = 16035\n    _globals[\"_CHARGEFLAPSENTRY\"]._serialized_start = 16037\n    _globals[\"_CHARGEFLAPSENTRY\"]._serialized_end = 16124\n    _globals[\"_CHARGEFLAPS\"]._serialized_start = 16126\n    _globals[\"_CHARGEFLAPS\"]._serialized_end = 16181\n    _globals[\"_CHARGINGPOWERRESTRICTIONS\"]._serialized_start = 16183\n    _globals[\"_CHARGINGPOWERRESTRICTIONS\"]._serialized_end = 16279\n    _globals[\"_CHARGINGBREAKCLOCKTIMERVALUE\"]._serialized_start = 16281\n    _globals[\"_CHARGINGBREAKCLOCKTIMERVALUE\"]._serialized_end = 16388\n    _globals[\"_PRECONDSTATE\"]._serialized_start = 16391\n    _globals[\"_PRECONDSTATE\"]._serialized_end = 16520\n    _globals[\"_CHARGINGPOWERCONTROL\"]._serialized_start = 16523\n    _globals[\"_CHARGINGPOWERCONTROL\"]._serialized_end = 16830\n    _globals[\"_CHARGINGPOWERCONTROL_CHARGINGSTATUSFORPOWERCONTROL\"]._serialized_start = 16750\n    _globals[\"_CHARGINGPOWERCONTROL_CHARGINGSTATUSFORPOWERCONTROL\"]._serialized_end = 16830\n    _globals[\"_CHARGINGBREAKCLOCKTIMERENTRY\"]._serialized_start = 16833\n    _globals[\"_CHARGINGBREAKCLOCKTIMERENTRY\"]._serialized_end = 17031\n    _globals[\"_CHARGEPROGRAMSVALUE\"]._serialized_start = 17033\n    _globals[\"_CHARGEPROGRAMSVALUE\"]._serialized_end = 17121\n    _globals[\"_CHARGEPROGRAMPARAMETERS\"]._serialized_start = 17124\n    _globals[\"_CHARGEPROGRAMPARAMETERS\"]._serialized_end = 17480\n    _globals[\"_WEEKLYPROFILEVALUE\"]._serialized_start = 17483\n    _globals[\"_WEEKLYPROFILEVALUE\"]._serialized_end = 17944\n    _globals[\"_VVRTIMEPROFILE\"]._serialized_start = 17947\n    _globals[\"_VVRTIMEPROFILE\"]._serialized_end = 18141\n    _globals[\"_ECOHISTOGRAMVALUE\"]._serialized_start = 18143\n    _globals[\"_ECOHISTOGRAMVALUE\"]._serialized_end = 18214\n    _globals[\"_ECOHISTOGRAMBIN\"]._serialized_start = 18216\n    _globals[\"_ECOHISTOGRAMBIN\"]._serialized_end = 18266\n    _globals[\"_SPEEDALERTCONFIGURATIONVALUE\"]._serialized_start = 18268\n    _globals[\"_SPEEDALERTCONFIGURATIONVALUE\"]._serialized_end = 18366\n    _globals[\"_SPEEDALERTCONFIGURATION\"]._serialized_start = 18368\n    _globals[\"_SPEEDALERTCONFIGURATION\"]._serialized_end = 18480\n    _globals[\"_WEEKLYSETTINGSHEADUNITVALUE\"]._serialized_start = 18482\n    _globals[\"_WEEKLYSETTINGSHEADUNITVALUE\"]._serialized_end = 18558\n    _globals[\"_WEEKLYSETTING\"]._serialized_start = 18560\n    _globals[\"_WEEKLYSETTING\"]._serialized_end = 18620\n    _globals[\"_TEMPERATUREPOINTSVALUE\"]._serialized_start = 18622\n    _globals[\"_TEMPERATUREPOINTSVALUE\"]._serialized_end = 18699\n    _globals[\"_TEMPERATUREPOINT\"]._serialized_start = 18701\n    _globals[\"_TEMPERATUREPOINT\"]._serialized_end = 18789\n    _globals[\"_WEEKDAYTARIFFVALUE\"]._serialized_start = 18791\n    _globals[\"_WEEKDAYTARIFFVALUE\"]._serialized_end = 18843\n    _globals[\"_WEEKENDTARIFFVALUE\"]._serialized_start = 18845\n    _globals[\"_WEEKENDTARIFFVALUE\"]._serialized_end = 18897\n    _globals[\"_TARIFF\"]._serialized_start = 18899\n    _globals[\"_TARIFF\"]._serialized_end = 18935\n    _globals[\"_STATEOFCHARGEPROFILEVALUE\"]._serialized_start = 18937\n    _globals[\"_STATEOFCHARGEPROFILEVALUE\"]._serialized_end = 19012\n    _globals[\"_STATEOFCHARGE\"]._serialized_start = 19014\n    _globals[\"_STATEOFCHARGE\"]._serialized_end = 19078\n    _globals[\"_VEPUPDATESBYVIN\"]._serialized_start = 19081\n    _globals[\"_VEPUPDATESBYVIN\"]._serialized_end = 19243\n    _globals[\"_VEPUPDATESBYVIN_UPDATESENTRY\"]._serialized_start = 19179\n    _globals[\"_VEPUPDATESBYVIN_UPDATESENTRY\"]._serialized_end = 19243\n    _globals[\"_DEBUGMESSAGE\"]._serialized_start = 19245\n    _globals[\"_DEBUGMESSAGE\"]._serialized_end = 19276\n    _globals[\"_VEHICLESTATUS\"]._serialized_start = 19279\n    _globals[\"_VEHICLESTATUS\"]._serialized_end = 19447\n    _globals[\"_VEHICLESTATUS_ATTRIBUTESENTRY\"]._serialized_start = 346\n    _globals[\"_VEHICLESTATUS_ATTRIBUTESENTRY\"]._serialized_end = 426\n    _globals[\"_PUSHMESSAGE\"]._serialized_start = 19450\n    _globals[\"_PUSHMESSAGE\"]._serialized_end = 20456\n    _globals[\"_TRACKINGEVENT\"]._serialized_start = 20459\n    _globals[\"_TRACKINGEVENT\"]._serialized_end = 20655\n    _globals[\"_TRACKINGEVENT_PAYLOADENTRY\"]._serialized_start = 20588\n    _globals[\"_TRACKINGEVENT_PAYLOADENTRY\"]._serialized_end = 20655\n    _globals[\"_PAYLOADVALUE\"]._serialized_start = 20657\n    _globals[\"_PAYLOADVALUE\"]._serialized_end = 20769\n    _globals[\"_ACKNOWLEDGEVEPREQUEST\"]._serialized_start = 20771\n    _globals[\"_ACKNOWLEDGEVEPREQUEST\"]._serialized_end = 20823\n    _globals[\"_ACKNOWLEDGEVEPUPDATESBYVIN\"]._serialized_start = 20825\n    _globals[\"_ACKNOWLEDGEVEPUPDATESBYVIN\"]._serialized_end = 20878\n    _globals[\"_CONFIGUREPINGINTERVAL\"]._serialized_start = 20880\n    _globals[\"_CONFIGUREPINGINTERVAL\"]._serialized_end = 20929\n    _globals[\"_ACKNOWLEDGEVEHICLEUPDATED\"]._serialized_start = 20931\n    _globals[\"_ACKNOWLEDGEVEHICLEUPDATED\"]._serialized_end = 20983\n    _globals[\"_ACKNOWLEDGEPREFERREDDEALERCHANGE\"]._serialized_start = 20985\n    _globals[\"_ACKNOWLEDGEPREFERREDDEALERCHANGE\"]._serialized_end = 21044\n    _globals[\"_VEHICLEUPDATED\"]._serialized_start = 21046\n    _globals[\"_VEHICLEUPDATED\"]._serialized_end = 21147\n    _globals[\"_PREFERREDDEALERCHANGE\"]._serialized_start = 21149\n    _globals[\"_PREFERREDDEALERCHANGE\"]._serialized_end = 21257\n    _globals[\"_ACKNOWLEDGEDATACHANGEEVENT\"]._serialized_start = 21259\n    _globals[\"_ACKNOWLEDGEDATACHANGEEVENT\"]._serialized_end = 21312\n    _globals[\"_SCOPES\"]._serialized_start = 21315\n    _globals[\"_SCOPES\"]._serialized_end = 21559\n    _globals[\"_SCOPES_ADDITIONALRESOURCESENTRY\"]._serialized_start = 21501\n    _globals[\"_SCOPES_ADDITIONALRESOURCESENTRY\"]._serialized_end = 21559\n    _globals[\"_DATACHANGEEVENT\"]._serialized_start = 21561\n    _globals[\"_DATACHANGEEVENT\"]._serialized_end = 21655\n    _globals[\"_VEHICLESTATUSUPDATES\"]._serialized_start = 21658\n    _globals[\"_VEHICLESTATUSUPDATES\"]._serialized_end = 21881\n    _globals[\"_VEHICLESTATUSUPDATES_VEHICLESTATUSUPDATESENTRY\"]._serialized_start = 21794\n    _globals[\"_VEHICLESTATUSUPDATES_VEHICLESTATUSUPDATESENTRY\"]._serialized_end = 21881\n    _globals[\"_ACKNOWLEDGEVEHICLESTATUSUPDATES\"]._serialized_start = 21883\n    _globals[\"_ACKNOWLEDGEVEHICLESTATUSUPDATES\"]._serialized_end = 21941\n    _globals[\"_VSUMETADATA\"]._serialized_start = 21943\n    _globals[\"_VSUMETADATA\"]._serialized_end = 22043\n    _globals[\"_BOOLATTRIBUTE\"]._serialized_start = 22045\n    _globals[\"_BOOLATTRIBUTE\"]._serialized_end = 22113\n    _globals[\"_INT64ATTRIBUTE\"]._serialized_start = 22115\n    _globals[\"_INT64ATTRIBUTE\"]._serialized_end = 22184\n    _globals[\"_DOUBLEATTRIBUTE\"]._serialized_start = 22186\n    _globals[\"_DOUBLEATTRIBUTE\"]._serialized_end = 22256\n    _globals[\"_TIMESTAMPATTRIBUTE\"]._serialized_start = 22258\n    _globals[\"_TIMESTAMPATTRIBUTE\"]._serialized_end = 22331\n    _globals[\"_INT64DISTANCEATTRIBUTE\"]._serialized_start = 22334\n    _globals[\"_INT64DISTANCEATTRIBUTE\"]._serialized_end = 22492\n    _globals[\"_DOUBLEDISTANCEATTRIBUTE\"]._serialized_start = 22495\n    _globals[\"_DOUBLEDISTANCEATTRIBUTE\"]._serialized_end = 22654\n    _globals[\"_DOUBLEPRESSUREATTRIBUTE\"]._serialized_start = 22657\n    _globals[\"_DOUBLEPRESSUREATTRIBUTE\"]._serialized_end = 22816\n    _globals[\"_DOUBLESPEEDATTRIBUTE\"]._serialized_start = 22819\n    _globals[\"_DOUBLESPEEDATTRIBUTE\"]._serialized_end = 22972\n    _globals[\"_DOUBLECOMBUSTIONCONSUMPTIONATTRIBUTE\"]._serialized_start = 22975\n    _globals[\"_DOUBLECOMBUSTIONCONSUMPTIONATTRIBUTE\"]._serialized_end = 23160\n    _globals[\"_DOUBLEELECTRICITYCONSUMPTIONATTRIBUTE\"]._serialized_start = 23163\n    _globals[\"_DOUBLEELECTRICITYCONSUMPTIONATTRIBUTE\"]._serialized_end = 23350\n    _globals[\"_DOUBLEGASCONSUMPTIONATTRIBUTE\"]._serialized_start = 23353\n    _globals[\"_DOUBLEGASCONSUMPTIONATTRIBUTE\"]._serialized_end = 23524\n    _globals[\"_INT64RATIOATTRIBUTE\"]._serialized_start = 23527\n    _globals[\"_INT64RATIOATTRIBUTE\"]._serialized_end = 23679\n    _globals[\"_DOUBLERATIOATTRIBUTE\"]._serialized_start = 23682\n    _globals[\"_DOUBLERATIOATTRIBUTE\"]._serialized_end = 23835\n    _globals[\"_DOUBLETEMPERATUREATTRIBUTE\"]._serialized_start = 23838\n    _globals[\"_DOUBLETEMPERATUREATTRIBUTE\"]._serialized_end = 24003\n    _globals[\"_INT64CLOCKHOURATTRIBUTE\"]._serialized_start = 24006\n    _globals[\"_INT64CLOCKHOURATTRIBUTE\"]._serialized_end = 24166\n    _globals[\"_TIMESTAMPCLOCKHOURATTRIBUTE\"]._serialized_start = 24169\n    _globals[\"_TIMESTAMPCLOCKHOURATTRIBUTE\"]._serialized_end = 24333\n    _globals[\"_AMGSTAGEMODESTATEENUMATTRIBUTE\"]._serialized_start = 24335\n    _globals[\"_AMGSTAGEMODESTATEENUMATTRIBUTE\"]._serialized_end = 24446\n    _globals[\"_ASSYSTOILQUANTITYENUMATTRIBUTE\"]._serialized_start = 24448\n    _globals[\"_ASSYSTOILQUANTITYENUMATTRIBUTE\"]._serialized_end = 24559\n    _globals[\"_ASSYSTOILWARNINGENUMATTRIBUTE\"]._serialized_start = 24561\n    _globals[\"_ASSYSTOILWARNINGENUMATTRIBUTE\"]._serialized_end = 24670\n    _globals[\"_AUXHEATSTATUSENUMATTRIBUTE\"]._serialized_start = 24672\n    _globals[\"_AUXHEATSTATUSENUMATTRIBUTE\"]._serialized_end = 24775\n    _globals[\"_AUXHEATTIMESELECTIONENUMATTRIBUTE\"]._serialized_start = 24777\n    _globals[\"_AUXHEATTIMESELECTIONENUMATTRIBUTE\"]._serialized_end = 24894\n    _globals[\"_BATTERYHEALTHENUMATTRIBUTE\"]._serialized_start = 24896\n    _globals[\"_BATTERYHEALTHENUMATTRIBUTE\"]._serialized_end = 24999\n    _globals[\"_CALIBRATIONREQUESTENUMATTRIBUTE\"]._serialized_start = 25001\n    _globals[\"_CALIBRATIONREQUESTENUMATTRIBUTE\"]._serialized_end = 25114\n    _globals[\"_CHARGECOUPLERLOCKSTATUSENUMATTRIBUTE\"]._serialized_start = 25116\n    _globals[\"_CHARGECOUPLERLOCKSTATUSENUMATTRIBUTE\"]._serialized_end = 25239\n    _globals[\"_CHARGECOUPLERSTATUSENUMATTRIBUTE\"]._serialized_start = 25241\n    _globals[\"_CHARGECOUPLERSTATUSENUMATTRIBUTE\"]._serialized_end = 25356\n    _globals[\"_CHARGEFLAPSTATUSENUMATTRIBUTE\"]._serialized_start = 25358\n    _globals[\"_CHARGEFLAPSTATUSENUMATTRIBUTE\"]._serialized_end = 25467\n    _globals[\"_CHARGINGCOMPATIBILITYERRORENUMATTRIBUTE\"]._serialized_start = 25470\n    _globals[\"_CHARGINGCOMPATIBILITYERRORENUMATTRIBUTE\"]._serialized_end = 25599\n    _globals[\"_CHARGINGCOUPLERERRORDETAILSENUMATTRIBUTE\"]._serialized_start = 25602\n    _globals[\"_CHARGINGCOUPLERERRORDETAILSENUMATTRIBUTE\"]._serialized_end = 25756\n    _globals[\"_CHARGINGERRORDETAILSENUMATTRIBUTE\"]._serialized_start = 25758\n    _globals[\"_CHARGINGERRORDETAILSENUMATTRIBUTE\"]._serialized_end = 25875\n    _globals[\"_CHARGINGERRORIMPOSSIBLECHANGETO400VENUMATTRIBUTE\"]._serialized_start = 25878\n    _globals[\"_CHARGINGERRORIMPOSSIBLECHANGETO400VENUMATTRIBUTE\"]._serialized_end = 26048\n    _globals[\"_CHARGINGERRORIMPOSSIBLECHANGETO800VENUMATTRIBUTE\"]._serialized_start = 26051\n    _globals[\"_CHARGINGERRORIMPOSSIBLECHANGETO800VENUMATTRIBUTE\"]._serialized_end = 26221\n    _globals[\"_CHARGINGERRORVEHICLENOSUPPORT400VENUMATTRIBUTE\"]._serialized_start = 26224\n    _globals[\"_CHARGINGERRORVEHICLENOSUPPORT400VENUMATTRIBUTE\"]._serialized_end = 26390\n    _globals[\"_CHARGINGFLAPERRORDETAILSENUMATTRIBUTE\"]._serialized_start = 26392\n    _globals[\"_CHARGINGFLAPERRORDETAILSENUMATTRIBUTE\"]._serialized_end = 26517\n    _globals[\"_CHARGINGMODEENUMATTRIBUTE\"]._serialized_start = 26519\n    _globals[\"_CHARGINGMODEENUMATTRIBUTE\"]._serialized_end = 26620\n    _globals[\"_CHARGINGSTATUSENUMATTRIBUTE\"]._serialized_start = 26622\n    _globals[\"_CHARGINGSTATUSENUMATTRIBUTE\"]._serialized_end = 26727\n    _globals[\"_CHARGINGSTOPERRORDETAILSENUMATTRIBUTE\"]._serialized_start = 26729\n    _globals[\"_CHARGINGSTOPERRORDETAILSENUMATTRIBUTE\"]._serialized_end = 26854\n    _globals[\"_CHILDPRESENCEDETECTIONWARNINGLASTEVENTENUMATTRIBUTE\"]._serialized_start = 26857\n    _globals[\"_CHILDPRESENCEDETECTIONWARNINGLASTEVENTENUMATTRIBUTE\"]._serialized_end = 27010\n    _globals[\"_CHILDPRESENCEDETECTIONWARNINGLEVELENUMATTRIBUTE\"]._serialized_start = 27013\n    _globals[\"_CHILDPRESENCEDETECTIONWARNINGLEVELENUMATTRIBUTE\"]._serialized_end = 27158\n    _globals[\"_DCCHARGINGPROFILEENUMATTRIBUTE\"]._serialized_start = 27160\n    _globals[\"_DCCHARGINGPROFILEENUMATTRIBUTE\"]._serialized_end = 27271\n    _globals[\"_DEPARTURETIMEMODEENUMATTRIBUTE\"]._serialized_start = 27273\n    _globals[\"_DEPARTURETIMEMODEENUMATTRIBUTE\"]._serialized_end = 27384\n    _globals[\"_DOORLOCKSTATUSENUMATTRIBUTE\"]._serialized_start = 27386\n    _globals[\"_DOORLOCKSTATUSENUMATTRIBUTE\"]._serialized_end = 27491\n    _globals[\"_DOORLOCKSTATUSVEHICLEENUMATTRIBUTE\"]._serialized_start = 27493\n    _globals[\"_DOORLOCKSTATUSVEHICLEENUMATTRIBUTE\"]._serialized_end = 27612\n    _globals[\"_DOORSTATUSENUMATTRIBUTE\"]._serialized_start = 27614\n    _globals[\"_DOORSTATUSENUMATTRIBUTE\"]._serialized_end = 27711\n    _globals[\"_DOORSTATUSOVERALLENUMATTRIBUTE\"]._serialized_start = 27713\n    _globals[\"_DOORSTATUSOVERALLENUMATTRIBUTE\"]._serialized_end = 27824\n    _globals[\"_DOORSTATUSGASENUMATTRIBUTE\"]._serialized_start = 27826\n    _globals[\"_DOORSTATUSGASENUMATTRIBUTE\"]._serialized_end = 27929\n    _globals[\"_DRIVINGMODEENUMATTRIBUTE\"]._serialized_start = 27931\n    _globals[\"_DRIVINGMODEENUMATTRIBUTE\"]._serialized_end = 28030\n    _globals[\"_EMERGENCYPOWERSUPPLYENUMATTRIBUTE\"]._serialized_start = 28032\n    _globals[\"_EMERGENCYPOWERSUPPLYENUMATTRIBUTE\"]._serialized_end = 28149\n    _globals[\"_ENGINEHOODSTATUSENUMATTRIBUTE\"]._serialized_start = 28151\n    _globals[\"_ENGINEHOODSTATUSENUMATTRIBUTE\"]._serialized_end = 28260\n    _globals[\"_ENGINESTATEENUMATTRIBUTE\"]._serialized_start = 28262\n    _globals[\"_ENGINESTATEENUMATTRIBUTE\"]._serialized_end = 28361\n    _globals[\"_EVSEPAIRINGSTATEENUMATTRIBUTE\"]._serialized_start = 28363\n    _globals[\"_EVSEPAIRINGSTATEENUMATTRIBUTE\"]._serialized_end = 28472\n    _globals[\"_EXTERIORMONITORINGSTATUSENUMATTRIBUTE\"]._serialized_start = 28474\n    _globals[\"_EXTERIORMONITORINGSTATUSENUMATTRIBUTE\"]._serialized_end = 28599\n    _globals[\"_FILTERPARTICLELOADINGENUMATTRIBUTE\"]._serialized_start = 28601\n    _globals[\"_FILTERPARTICLELOADINGENUMATTRIBUTE\"]._serialized_end = 28720\n    _globals[\"_FLIPWINDOWSTATUSENUMATTRIBUTE\"]._serialized_start = 28722\n    _globals[\"_FLIPWINDOWSTATUSENUMATTRIBUTE\"]._serialized_end = 28831\n    _globals[\"_HVBATTERYPRECONDAVAILABILITYENUMATTRIBUTE\"]._serialized_start = 28834\n    _globals[\"_HVBATTERYPRECONDAVAILABILITYENUMATTRIBUTE\"]._serialized_end = 28967\n    _globals[\"_HVBATTERYTHERMALPROPAGATIONEVENTENUMATTRIBUTE\"]._serialized_start = 28970\n    _globals[\"_HVBATTERYTHERMALPROPAGATIONEVENTENUMATTRIBUTE\"]._serialized_end = 29111\n    _globals[\"_HYBRIDWARNINGSENUMATTRIBUTE\"]._serialized_start = 29113\n    _globals[\"_HYBRIDWARNINGSENUMATTRIBUTE\"]._serialized_end = 29218\n    _globals[\"_IGNITIONSTATEENUMATTRIBUTE\"]._serialized_start = 29220\n    _globals[\"_IGNITIONSTATEENUMATTRIBUTE\"]._serialized_end = 29323\n    _globals[\"_INTERIORMONITORINGSTATUSENUMATTRIBUTE\"]._serialized_start = 29325\n    _globals[\"_INTERIORMONITORINGSTATUSENUMATTRIBUTE\"]._serialized_end = 29450\n    _globals[\"_INTERIORPROTECTIONSELECTIONSTATUSENUMATTRIBUTE\"]._serialized_start = 29453\n    _globals[\"_INTERIORPROTECTIONSELECTIONSTATUSENUMATTRIBUTE\"]._serialized_end = 29596\n    _globals[\"_KEYACTIVATIONSTATEENUMATTRIBUTE\"]._serialized_start = 29598\n    _globals[\"_KEYACTIVATIONSTATEENUMATTRIBUTE\"]._serialized_end = 29711\n    _globals[\"_LANGUAGEHUENUMATTRIBUTE\"]._serialized_start = 29713\n    _globals[\"_LANGUAGEHUENUMATTRIBUTE\"]._serialized_end = 29810\n    _globals[\"_LASTTHEFTWARNINGREASONENUMATTRIBUTE\"]._serialized_start = 29812\n    _globals[\"_LASTTHEFTWARNINGREASONENUMATTRIBUTE\"]._serialized_end = 29933\n    _globals[\"_OILWARNINGLEVELENUMATTRIBUTE\"]._serialized_start = 29935\n    _globals[\"_OILWARNINGLEVELENUMATTRIBUTE\"]._serialized_end = 30042\n    _globals[\"_PARKBRAKESTATUSENUMATTRIBUTE\"]._serialized_start = 30044\n    _globals[\"_PARKBRAKESTATUSENUMATTRIBUTE\"]._serialized_end = 30151\n    _globals[\"_PARKCOLLISIONACTIVATIONSTATUSENUMATTRIBUTE\"]._serialized_start = 30154\n    _globals[\"_PARKCOLLISIONACTIVATIONSTATUSENUMATTRIBUTE\"]._serialized_end = 30289\n    _globals[\"_PARKCOLLISIONINACTIVEREASONENUMATTRIBUTE\"]._serialized_start = 30292\n    _globals[\"_PARKCOLLISIONINACTIVEREASONENUMATTRIBUTE\"]._serialized_end = 30423\n    _globals[\"_PARKCOLLISIONPICTURETRANSFERSTATUSENUMATTRIBUTE\"]._serialized_start = 30426\n    _globals[\"_PARKCOLLISIONPICTURETRANSFERSTATUSENUMATTRIBUTE\"]._serialized_end = 30571\n    _globals[\"_PARKCOLLISIONSELECTIONSTATUSENUMATTRIBUTE\"]._serialized_start = 30574\n    _globals[\"_PARKCOLLISIONSELECTIONSTATUSENUMATTRIBUTE\"]._serialized_end = 30707\n    _globals[\"_PARKEVENTLEVELENUMATTRIBUTE\"]._serialized_start = 30709\n    _globals[\"_PARKEVENTLEVELENUMATTRIBUTE\"]._serialized_end = 30814\n    _globals[\"_PARKEVENTPICTURESELECTIONSTATUSENUMATTRIBUTE\"]._serialized_start = 30817\n    _globals[\"_PARKEVENTPICTURESELECTIONSTATUSENUMATTRIBUTE\"]._serialized_end = 30956\n    _globals[\"_PARKEVENTPICTURETRANSMISSIONSTATUSENUMATTRIBUTE\"]._serialized_start = 30959\n    _globals[\"_PARKEVENTPICTURETRANSMISSIONSTATUSENUMATTRIBUTE\"]._serialized_end = 31104\n    _globals[\"_PARKEVENTSENSORSTATUSENUMATTRIBUTE\"]._serialized_start = 31106\n    _globals[\"_PARKEVENTSENSORSTATUSENUMATTRIBUTE\"]._serialized_end = 31225\n    _globals[\"_PARKEVENTTYPEENUMATTRIBUTE\"]._serialized_start = 31227\n    _globals[\"_PARKEVENTTYPEENUMATTRIBUTE\"]._serialized_end = 31330\n    _globals[\"_PERFORMANCELIMITATIONMODESTATUSENUMATTRIBUTE\"]._serialized_start = 31333\n    _globals[\"_PERFORMANCELIMITATIONMODESTATUSENUMATTRIBUTE\"]._serialized_end = 31472\n    _globals[\"_PICTURERECORDINGSTATUSENUMATTRIBUTE\"]._serialized_start = 31474\n    _globals[\"_PICTURERECORDINGSTATUSENUMATTRIBUTE\"]._serialized_end = 31595\n    _globals[\"_PICTURETRANSFERSELECTIONSTATUSENUMATTRIBUTE\"]._serialized_start = 31598\n    _globals[\"_PICTURETRANSFERSELECTIONSTATUSENUMATTRIBUTE\"]._serialized_end = 31735\n    _globals[\"_PRECONDATDEPARTUREENUMATTRIBUTE\"]._serialized_start = 31737\n    _globals[\"_PRECONDATDEPARTUREENUMATTRIBUTE\"]._serialized_end = 31850\n    _globals[\"_PRECONDERRORENUMATTRIBUTE\"]._serialized_start = 31852\n    _globals[\"_PRECONDERRORENUMATTRIBUTE\"]._serialized_end = 31953\n    _globals[\"_PRECONDNOWENUMATTRIBUTE\"]._serialized_start = 31955\n    _globals[\"_PRECONDNOWENUMATTRIBUTE\"]._serialized_end = 32052\n    _globals[\"_PRECONDOPERATINGMODEENUMATTRIBUTE\"]._serialized_start = 32054\n    _globals[\"_PRECONDOPERATINGMODEENUMATTRIBUTE\"]._serialized_end = 32171\n    _globals[\"_PRECONDSEATENUMATTRIBUTE\"]._serialized_start = 32173\n    _globals[\"_PRECONDSEATENUMATTRIBUTE\"]._serialized_end = 32272\n    _globals[\"_PROTECTIONACTIVATIONSTATUSENUMATTRIBUTE\"]._serialized_start = 32275\n    _globals[\"_PROTECTIONACTIVATIONSTATUSENUMATTRIBUTE\"]._serialized_end = 32404\n    _globals[\"_PROTECTIONSENSORSTATUSENUMATTRIBUTE\"]._serialized_start = 32406\n    _globals[\"_PROTECTIONSENSORSTATUSENUMATTRIBUTE\"]._serialized_end = 32527\n    _globals[\"_RANGESKIPINDICATIONENUMATTRIBUTE\"]._serialized_start = 32529\n    _globals[\"_RANGESKIPINDICATIONENUMATTRIBUTE\"]._serialized_end = 32644\n    _globals[\"_ROOFTOPSTATUSENUMATTRIBUTE\"]._serialized_start = 32646\n    _globals[\"_ROOFTOPSTATUSENUMATTRIBUTE\"]._serialized_end = 32749\n    _globals[\"_SELECTEDCHARGEPROGRAMENUMATTRIBUTE\"]._serialized_start = 32751\n    _globals[\"_SELECTEDCHARGEPROGRAMENUMATTRIBUTE\"]._serialized_end = 32870\n    _globals[\"_SMARTCHARGINGENUMATTRIBUTE\"]._serialized_start = 32872\n    _globals[\"_SMARTCHARGINGENUMATTRIBUTE\"]._serialized_end = 32975\n    _globals[\"_SMARTCHARGINGATDEPARTUREENUMATTRIBUTE\"]._serialized_start = 32977\n    _globals[\"_SMARTCHARGINGATDEPARTUREENUMATTRIBUTE\"]._serialized_end = 33102\n    _globals[\"_SOHCALIBRATIONNOTIFICATIONSENUMATTRIBUTE\"]._serialized_start = 33105\n    _globals[\"_SOHCALIBRATIONNOTIFICATIONSENUMATTRIBUTE\"]._serialized_end = 33236\n    _globals[\"_SOHCALIBRATIONPLANNEDENUMATTRIBUTE\"]._serialized_start = 33238\n    _globals[\"_SOHCALIBRATIONPLANNEDENUMATTRIBUTE\"]._serialized_end = 33357\n    _globals[\"_SOHCALIBRATIONREQUIREDENUMATTRIBUTE\"]._serialized_start = 33359\n    _globals[\"_SOHCALIBRATIONREQUIREDENUMATTRIBUTE\"]._serialized_end = 33480\n    _globals[\"_SOHCALIBRATIONSTATEENUMATTRIBUTE\"]._serialized_start = 33482\n    _globals[\"_SOHCALIBRATIONSTATEENUMATTRIBUTE\"]._serialized_end = 33597\n    _globals[\"_SOHFAVORABLECONDITIONSENUMATTRIBUTE\"]._serialized_start = 33599\n    _globals[\"_SOHFAVORABLECONDITIONSENUMATTRIBUTE\"]._serialized_end = 33720\n    _globals[\"_SPEEDUNITFROMICENUMATTRIBUTE\"]._serialized_start = 33722\n    _globals[\"_SPEEDUNITFROMICENUMATTRIBUTE\"]._serialized_end = 33829\n    _globals[\"_STARTERBATTERYSTATEENUMATTRIBUTE\"]._serialized_start = 33831\n    _globals[\"_STARTERBATTERYSTATEENUMATTRIBUTE\"]._serialized_end = 33946\n    _globals[\"_SUNROOFEVENTENUMATTRIBUTE\"]._serialized_start = 33948\n    _globals[\"_SUNROOFEVENTENUMATTRIBUTE\"]._serialized_end = 34049\n    _globals[\"_SUNROOFSTATUSENUMATTRIBUTE\"]._serialized_start = 34051\n    _globals[\"_SUNROOFSTATUSENUMATTRIBUTE\"]._serialized_end = 34154\n    _globals[\"_SUNROOFSTATUSBLINDENUMATTRIBUTE\"]._serialized_start = 34156\n    _globals[\"_SUNROOFSTATUSBLINDENUMATTRIBUTE\"]._serialized_end = 34269\n    _globals[\"_TCUCONNECTIONSTATELOWCHANNELENUMATTRIBUTE\"]._serialized_start = 34272\n    _globals[\"_TCUCONNECTIONSTATELOWCHANNELENUMATTRIBUTE\"]._serialized_end = 34405\n    _globals[\"_TCUTHERMOSHUTDOWNENUMATTRIBUTE\"]._serialized_start = 34407\n    _globals[\"_TCUTHERMOSHUTDOWNENUMATTRIBUTE\"]._serialized_end = 34518\n    _globals[\"_TEMPERATUREUNITHUENUMATTRIBUTE\"]._serialized_start = 34520\n    _globals[\"_TEMPERATUREUNITHUENUMATTRIBUTE\"]._serialized_end = 34631\n    _globals[\"_TIMEFORMATHUENUMATTRIBUTE\"]._serialized_start = 34633\n    _globals[\"_TIMEFORMATHUENUMATTRIBUTE\"]._serialized_end = 34734\n    _globals[\"_TIREMARKERENUMATTRIBUTE\"]._serialized_start = 34736\n    _globals[\"_TIREMARKERENUMATTRIBUTE\"]._serialized_end = 34833\n    _globals[\"_TIRESENSORAVAILABLEENUMATTRIBUTE\"]._serialized_start = 34835\n    _globals[\"_TIRESENSORAVAILABLEENUMATTRIBUTE\"]._serialized_end = 34950\n    _globals[\"_TIREWARNINGLEVELPRWENUMATTRIBUTE\"]._serialized_start = 34952\n    _globals[\"_TIREWARNINGLEVELPRWENUMATTRIBUTE\"]._serialized_end = 35067\n    _globals[\"_TIREWARNINGLAMPENUMATTRIBUTE\"]._serialized_start = 35069\n    _globals[\"_TIREWARNINGLAMPENUMATTRIBUTE\"]._serialized_end = 35176\n    _globals[\"_TIREWARNINGSPRWENUMATTRIBUTE\"]._serialized_start = 35178\n    _globals[\"_TIREWARNINGSPRWENUMATTRIBUTE\"]._serialized_end = 35285\n    _globals[\"_TIREWARNINGSRDKENUMATTRIBUTE\"]._serialized_start = 35287\n    _globals[\"_TIREWARNINGSRDKENUMATTRIBUTE\"]._serialized_end = 35394\n    _globals[\"_TOWPROTECTIONSELECTIONSTATUSENUMATTRIBUTE\"]._serialized_start = 35397\n    _globals[\"_TOWPROTECTIONSELECTIONSTATUSENUMATTRIBUTE\"]._serialized_end = 35530\n    _globals[\"_TRACKINGSTATEHUENUMATTRIBUTE\"]._serialized_start = 35532\n    _globals[\"_TRACKINGSTATEHUENUMATTRIBUTE\"]._serialized_end = 35639\n    _globals[\"_TURNOFFENGINEPREWARNINGENUMATTRIBUTE\"]._serialized_start = 35641\n    _globals[\"_TURNOFFENGINEPREWARNINGENUMATTRIBUTE\"]._serialized_end = 35764\n    _globals[\"_VEHICLEDATACONNECTIONSTATEENUMATTRIBUTE\"]._serialized_start = 35767\n    _globals[\"_VEHICLEDATACONNECTIONSTATEENUMATTRIBUTE\"]._serialized_end = 35896\n    _globals[\"_VEHICLEHEALTHSTATUSENUMATTRIBUTE\"]._serialized_start = 35898\n    _globals[\"_VEHICLEHEALTHSTATUSENUMATTRIBUTE\"]._serialized_end = 36013\n    _globals[\"_VEHICLEPOSITIONERRORCODEENUMATTRIBUTE\"]._serialized_start = 36015\n    _globals[\"_VEHICLEPOSITIONERRORCODEENUMATTRIBUTE\"]._serialized_end = 36140\n    _globals[\"_VEHICLETHEFTALARMINACTIVEREASONENUMATTRIBUTE\"]._serialized_start = 36143\n    _globals[\"_VEHICLETHEFTALARMINACTIVEREASONENUMATTRIBUTE\"]._serialized_end = 36282\n    _globals[\"_WARNINGWASHWATERENUMATTRIBUTE\"]._serialized_start = 36284\n    _globals[\"_WARNINGWASHWATERENUMATTRIBUTE\"]._serialized_end = 36393\n    _globals[\"_WEEKDAYENUMATTRIBUTE\"]._serialized_start = 36395\n    _globals[\"_WEEKDAYENUMATTRIBUTE\"]._serialized_end = 36486\n    _globals[\"_WINDOWSTATUSENUMATTRIBUTE\"]._serialized_start = 36488\n    _globals[\"_WINDOWSTATUSENUMATTRIBUTE\"]._serialized_end = 36589\n    _globals[\"_WINDOWSTATUSBLINDENUMATTRIBUTE\"]._serialized_start = 36591\n    _globals[\"_WINDOWSTATUSBLINDENUMATTRIBUTE\"]._serialized_end = 36702\n    _globals[\"_WINDOWSTATUSOVERALLENUMATTRIBUTE\"]._serialized_start = 36704\n    _globals[\"_WINDOWSTATUSOVERALLENUMATTRIBUTE\"]._serialized_end = 36819\n    _globals[\"_AMGSTAGEMODEERROROBJECTATTRIBUTE\"]._serialized_start = 36821\n    _globals[\"_AMGSTAGEMODEERROROBJECTATTRIBUTE\"]._serialized_end = 36934\n    _globals[\"_CHARGINGBREAKCLOCKTIMEROBJECTATTRIBUTE\"]._serialized_start = 36937\n    _globals[\"_CHARGINGBREAKCLOCKTIMEROBJECTATTRIBUTE\"]._serialized_end = 37067\n    _globals[\"_CHARGINGPREDICTIONDEPARTURETIMEOBJECTATTRIBUTE\"]._serialized_start = 37070\n    _globals[\"_CHARGINGPREDICTIONDEPARTURETIMEOBJECTATTRIBUTE\"]._serialized_end = 37211\n    _globals[\"_CHARGINGPREDICTIONSOCOBJECTATTRIBUTE\"]._serialized_start = 37213\n    _globals[\"_CHARGINGPREDICTIONSOCOBJECTATTRIBUTE\"]._serialized_end = 37334\n    _globals[\"_CHARGINGSCHEDULEACTIVEOBJECTATTRIBUTE\"]._serialized_start = 37336\n    _globals[\"_CHARGINGSCHEDULEACTIVEOBJECTATTRIBUTE\"]._serialized_end = 37459\n    _globals[\"_CHARGINGSCHEDULEREQUESTEDOBJECTATTRIBUTE\"]._serialized_start = 37462\n    _globals[\"_CHARGINGSCHEDULEREQUESTEDOBJECTATTRIBUTE\"]._serialized_end = 37591\n    _globals[\"_HVBATTERYPRECONDREQUESTSTATEOBJECTATTRIBUTE\"]._serialized_start = 37594\n    _globals[\"_HVBATTERYPRECONDREQUESTSTATEOBJECTATTRIBUTE\"]._serialized_end = 37729\n    _globals[\"_HVBATTERYPRECONDSTATEOBJECTATTRIBUTE\"]._serialized_start = 37731\n    _globals[\"_HVBATTERYPRECONDSTATEOBJECTATTRIBUTE\"]._serialized_end = 37852\n    _globals[\"_KEYLINEACTIVATIONSTATEOBJECTATTRIBUTE\"]._serialized_start = 37855\n    _globals[\"_KEYLINEACTIVATIONSTATEOBJECTATTRIBUTE\"]._serialized_end = 37983\n    _globals[\"_NEXTDEPARTURETIMEOBJECTATTRIBUTE\"]._serialized_start = 37986\n    _globals[\"_NEXTDEPARTURETIMEOBJECTATTRIBUTE\"]._serialized_end = 38186\n    _globals[\"_PRECONDOPERABILITYSTATEOBJECTATTRIBUTE\"]._serialized_start = 38188\n    _globals[\"_PRECONDOPERABILITYSTATEOBJECTATTRIBUTE\"]._serialized_end = 38313\n    _globals[\"_PRECONDSTATEOBJECTATTRIBUTE\"]._serialized_start = 38315\n    _globals[\"_PRECONDSTATEOBJECTATTRIBUTE\"]._serialized_end = 38418\n    _globals[\"_REMOTEUPDATESTARTSTATUSOBJECTATTRIBUTE\"]._serialized_start = 38420\n    _globals[\"_REMOTEUPDATESTARTSTATUSOBJECTATTRIBUTE\"]._serialized_end = 38545\n    _globals[\"_WEEKLYPROFILEOBJECTATTRIBUTE\"]._serialized_start = 38547\n    _globals[\"_WEEKLYPROFILEOBJECTATTRIBUTE\"]._serialized_end = 38657\n    _globals[\"_AUXHEATWARNINGSARRAYATTRIBUTE\"]._serialized_start = 38659\n    _globals[\"_AUXHEATWARNINGSARRAYATTRIBUTE\"]._serialized_end = 38766\n    _globals[\"_CHARGEFLAPSARRAYATTRIBUTE\"]._serialized_start = 38768\n    _globals[\"_CHARGEFLAPSARRAYATTRIBUTE\"]._serialized_end = 38873\n    _globals[\"_CHARGEINLETSARRAYATTRIBUTE\"]._serialized_start = 38875\n    _globals[\"_CHARGEINLETSARRAYATTRIBUTE\"]._serialized_end = 38982\n    _globals[\"_CHARGEPROGRAMSARRAYATTRIBUTE\"]._serialized_start = 38984\n    _globals[\"_CHARGEPROGRAMSARRAYATTRIBUTE\"]._serialized_end = 39099\n    _globals[\"_CHARGINGPOWERRESTRICTIONARRAYATTRIBUTE\"]._serialized_start = 39101\n    _globals[\"_CHARGINGPOWERRESTRICTIONARRAYATTRIBUTE\"]._serialized_end = 39227\n    _globals[\"_CHARGINGTIMERARRAYATTRIBUTE\"]._serialized_start = 39229\n    _globals[\"_CHARGINGTIMERARRAYATTRIBUTE\"]._serialized_end = 39338\n    _globals[\"_SOCPROFILEARRAYATTRIBUTE\"]._serialized_start = 39340\n    _globals[\"_SOCPROFILEARRAYATTRIBUTE\"]._serialized_end = 39441\n    _globals[\"_SPEEDALERTCONFARRAYATTRIBUTE\"]._serialized_start = 39443\n    _globals[\"_SPEEDALERTCONFARRAYATTRIBUTE\"]._serialized_end = 39558\n    _globals[\"_TEMPERATUREPOINTSARRAYATTRIBUTE\"]._serialized_start = 39560\n    _globals[\"_TEMPERATUREPOINTSARRAYATTRIBUTE\"]._serialized_end = 39671\n    _globals[\"_WEEKLYSETHUARRAYATTRIBUTE\"]._serialized_start = 39673\n    _globals[\"_WEEKLYSETHUARRAYATTRIBUTE\"]._serialized_end = 39775\n    _globals[\"_VEHICLESTATUSUPDATE\"]._serialized_start = 39779\n    _globals[\"_VEHICLESTATUSUPDATE\"]._serialized_end = 58200\n# @@protoc_insertion_point(module_scope)\n"
  },
  {
    "path": "custom_components/mbapi2020/proto/vehicleapi_pb2.py",
    "content": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: vehicleapi.proto\n# Protobuf Python Version: 5.29.5\n\"\"\"Generated protocol buffer code.\"\"\"\n\nfrom google.protobuf import (\n    descriptor as _descriptor,\n    descriptor_pool as _descriptor_pool,\n    symbol_database as _symbol_database,\n)\nfrom google.protobuf.internal import builder as _builder\n\n# @@protoc_insertion_point(imports)\n\n_sym_db = _symbol_database.Default()\n\n\nfrom google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2\n\nimport custom_components.mbapi2020.proto.acp_pb2 as acp__pb2\nimport custom_components.mbapi2020.proto.gogo_pb2 as gogo__pb2\n\nDESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(\n    b'\\n\\x10vehicleapi.proto\\x12\\x05proto\\x1a\\tacp.proto\\x1a\\x1cgoogle/protobuf/struct.proto\\x1a\\ngogo.proto\"F\\n+AcknowledgeAppTwinCommandStatusUpdatesByVIN\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\"\\xec\\x01\\n AppTwinCommandStatusUpdatesByVIN\\x12\\x17\\n\\x0fsequence_number\\x18\\x01 \\x01(\\x05\\x12Q\\n\\x0eupdates_by_vin\\x18\\x02 \\x03(\\x0b\\x32\\x39.proto.AppTwinCommandStatusUpdatesByVIN.UpdatesByVinEntry\\x1a\\\\\\n\\x11UpdatesByVinEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\t\\x12\\x36\\n\\x05value\\x18\\x02 \\x01(\\x0b\\x32\\'.proto.AppTwinCommandStatusUpdatesByPID:\\x02\\x38\\x01\"\\xd4\\x01\\n AppTwinCommandStatusUpdatesByPID\\x12\\x0b\\n\\x03vin\\x18\\x01 \\x01(\\t\\x12Q\\n\\x0eupdates_by_pid\\x18\\x02 \\x03(\\x0b\\x32\\x39.proto.AppTwinCommandStatusUpdatesByPID.UpdatesByPidEntry\\x1aP\\n\\x11UpdatesByPidEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\x03\\x12*\\n\\x05value\\x18\\x02 \\x01(\\x0b\\x32\\x1b.proto.AppTwinCommandStatus:\\x02\\x38\\x01\"\\x91\\x02\\n\\x14\\x41ppTwinCommandStatus\\x12\\x12\\n\\nprocess_id\\x18\\x01 \\x01(\\x03\\x12\\x12\\n\\nrequest_id\\x18\\x02 \\x01(\\t\\x12\\x17\\n\\x0ftimestamp_in_ms\\x18\\x03 \\x01(\\x03\\x12&\\n\\x06\\x65rrors\\x18\\x04 \\x03(\\x0b\\x32\\x16.proto.VehicleAPIError\\x12!\\n\\x15\\x62locking_time_seconds\\x18\\x05 \\x01(\\x03\\x42\\x02\\x18\\x01\\x12\\x18\\n\\x0cpin_attempts\\x18\\x06 \\x01(\\x05\\x42\\x02\\x18\\x01\\x12$\\n\\x04type\\x18\\x07 \\x01(\\x0e\\x32\\x16.proto.ACP.CommandType\\x12-\\n\\x05state\\x18\\x08 \\x01(\\x0e\\x32\\x1e.proto.VehicleAPI.CommandState\"\\xa2\\x01\\n\\x1bVehicleAPICommandPostResult\\x12\\x1d\\n\\nprocess_id\\x18\\x01 \\x01(\\x03R\\tprocessid\\x12.\\n\\x06\\x65rrors\\x18\\x02 \\x03(\\x0b\\x32\\x16.proto.VehicleAPIErrorR\\x06\\x65rrors\\x12\\x34\\n\\x05state\\x18\\x03 \\x01(\\x0e\\x32\\x1e.proto.VehicleAPI.CommandStateR\\x05state\"\\xba\\x01\\n\\x1aVehicleAPICommandGetResult\\x12?\\n\\x07process\\x18\\x01 \\x03(\\x0b\\x32%.proto.VehicleAPICommandProcessStatusR\\x07process\\x12\\x1f\\n\\x0bqueue_count\\x18\\x02 \\x01(\\x05R\\nqueuecount\\x12:\\n\\nqueue_type\\x18\\x03 \\x01(\\x0e\\x32\\x1b.proto.VehicleAPI.QueueTypeR\\tqueuetype\"\\xa0\\x01\\n\\x17VehicleAPIDataGetResult\\x12\\x36\\n\\x04\\x64\\x61ta\\x18\\x01 \\x03(\\x0b\\x32(.proto.VehicleAPIDataGetResult.DataEntry\\x1aM\\n\\tDataEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\t\\x12/\\n\\x05value\\x18\\x02 \\x01(\\x0b\\x32 .proto.VehicleAPIAttributeStatus:\\x02\\x38\\x01\"\\xa1\\x01\\n\\x19VehicleAPIAttributeStatus\\x12,\\n\\x05value\\x18\\x03 \\x01(\\x0b\\x32\\x16.google.protobuf.ValueR\\x05value\\x12\\x1b\\n\\x0ftimestamp_in_ms\\x18\\x02 \\x01(\\x03R\\x02ts\\x12\\x39\\n\\x06Status\\x18\\x01 \\x01(\\x0e\\x32!.proto.VehicleAPI.AttributeStatusR\\x06status\"\\xe7\\x02\\n\\x1eVehicleAPICommandProcessStatus\\x12.\\n\\x06\\x65rrors\\x18\\x01 \\x03(\\x0b\\x32\\x16.proto.VehicleAPIErrorR\\x06\\x65rrors\\x12\\x1f\\n\\x0binstance_id\\x18\\x02 \\x01(\\tR\\ninstanceid\\x12\\x12\\n\\x04name\\x18\\x03 \\x01(\\tR\\x04name\\x12\\x1d\\n\\nprocess_id\\x18\\x04 \\x01(\\x03R\\tprocessid\\x12G\\n\\x13response_parameters\\x18\\x06 \\x01(\\x0b\\x32\\x16.google.protobuf.ValueR\\x12responseparameters\\x12\\x34\\n\\x05state\\x18\\x07 \\x01(\\x0e\\x32\\x1e.proto.VehicleAPI.CommandStateR\\x05state\\x12!\\n\\x0etimestamp_in_s\\x18\\x08 \\x01(\\x03R\\ttimestamp\\x12\\x1f\\n\\x0btracking_id\\x18\\t \\x01(\\tR\\ntrackingid\"\\x96\\x02\\n\\x0fVehicleAPIError\\x12\\x18\\n\\x04\\x63ode\\x18\\x01 \\x01(\\tR\\nerror-code\\x12\\x1e\\n\\x07message\\x18\\x02 \\x01(\\tR\\rerror-message\\x12\\x46\\n\\nattributes\\x18\\x03 \\x03(\\x0b\\x32&.proto.VehicleAPIError.AttributesEntryR\\nattributes\\x12\\x36\\n\\nsub_errors\\x18\\x04 \\x03(\\x0b\\x32\\x16.proto.VehicleAPIErrorR\\nsub-errors\\x1aI\\n\\x0f\\x41ttributesEntry\\x12\\x0b\\n\\x03key\\x18\\x01 \\x01(\\t\\x12%\\n\\x05value\\x18\\x02 \\x01(\\x0b\\x32\\x16.google.protobuf.Value:\\x02\\x38\\x01\"\\x1f\\n\\x1d\\x41ppTwinPendingCommandsRequest\"Q\\n\\x1e\\x41ppTwinPendingCommandsResponse\\x12/\\n\\x10pending_commands\\x18\\x01 \\x03(\\x0b\\x32\\x15.proto.PendingCommand\"k\\n\\x0ePendingCommand\\x12\\x0b\\n\\x03vin\\x18\\x01 \\x01(\\t\\x12\\x12\\n\\nprocess_id\\x18\\x02 \\x01(\\x03\\x12\\x12\\n\\nrequest_id\\x18\\x03 \\x01(\\t\\x12$\\n\\x04type\\x18\\x04 \\x01(\\x0e\\x32\\x16.proto.ACP.CommandTypeB \\n\\x1a\\x63om.daimler.mbcarkit.proto\\xd0\\xe1\\x1e\\x01\\x62\\x06proto3'\n)\n\n_globals = globals()\n_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)\n_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, \"vehicleapi_pb2\", _globals)\nif not _descriptor._USE_C_DESCRIPTORS:\n    _globals[\"DESCRIPTOR\"]._loaded_options = None\n    _globals[\"DESCRIPTOR\"]._serialized_options = b\"\\n\\032com.daimler.mbcarkit.proto\\320\\341\\036\\001\"\n    _globals[\"_APPTWINCOMMANDSTATUSUPDATESBYVIN_UPDATESBYVINENTRY\"]._loaded_options = None\n    _globals[\"_APPTWINCOMMANDSTATUSUPDATESBYVIN_UPDATESBYVINENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_APPTWINCOMMANDSTATUSUPDATESBYPID_UPDATESBYPIDENTRY\"]._loaded_options = None\n    _globals[\"_APPTWINCOMMANDSTATUSUPDATESBYPID_UPDATESBYPIDENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_APPTWINCOMMANDSTATUS\"].fields_by_name[\"blocking_time_seconds\"]._loaded_options = None\n    _globals[\"_APPTWINCOMMANDSTATUS\"].fields_by_name[\"blocking_time_seconds\"]._serialized_options = b\"\\030\\001\"\n    _globals[\"_APPTWINCOMMANDSTATUS\"].fields_by_name[\"pin_attempts\"]._loaded_options = None\n    _globals[\"_APPTWINCOMMANDSTATUS\"].fields_by_name[\"pin_attempts\"]._serialized_options = b\"\\030\\001\"\n    _globals[\"_VEHICLEAPIDATAGETRESULT_DATAENTRY\"]._loaded_options = None\n    _globals[\"_VEHICLEAPIDATAGETRESULT_DATAENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_VEHICLEAPIERROR_ATTRIBUTESENTRY\"]._loaded_options = None\n    _globals[\"_VEHICLEAPIERROR_ATTRIBUTESENTRY\"]._serialized_options = b\"8\\001\"\n    _globals[\"_ACKNOWLEDGEAPPTWINCOMMANDSTATUSUPDATESBYVIN\"]._serialized_start = 80\n    _globals[\"_ACKNOWLEDGEAPPTWINCOMMANDSTATUSUPDATESBYVIN\"]._serialized_end = 150\n    _globals[\"_APPTWINCOMMANDSTATUSUPDATESBYVIN\"]._serialized_start = 153\n    _globals[\"_APPTWINCOMMANDSTATUSUPDATESBYVIN\"]._serialized_end = 389\n    _globals[\"_APPTWINCOMMANDSTATUSUPDATESBYVIN_UPDATESBYVINENTRY\"]._serialized_start = 297\n    _globals[\"_APPTWINCOMMANDSTATUSUPDATESBYVIN_UPDATESBYVINENTRY\"]._serialized_end = 389\n    _globals[\"_APPTWINCOMMANDSTATUSUPDATESBYPID\"]._serialized_start = 392\n    _globals[\"_APPTWINCOMMANDSTATUSUPDATESBYPID\"]._serialized_end = 604\n    _globals[\"_APPTWINCOMMANDSTATUSUPDATESBYPID_UPDATESBYPIDENTRY\"]._serialized_start = 524\n    _globals[\"_APPTWINCOMMANDSTATUSUPDATESBYPID_UPDATESBYPIDENTRY\"]._serialized_end = 604\n    _globals[\"_APPTWINCOMMANDSTATUS\"]._serialized_start = 607\n    _globals[\"_APPTWINCOMMANDSTATUS\"]._serialized_end = 880\n    _globals[\"_VEHICLEAPICOMMANDPOSTRESULT\"]._serialized_start = 883\n    _globals[\"_VEHICLEAPICOMMANDPOSTRESULT\"]._serialized_end = 1045\n    _globals[\"_VEHICLEAPICOMMANDGETRESULT\"]._serialized_start = 1048\n    _globals[\"_VEHICLEAPICOMMANDGETRESULT\"]._serialized_end = 1234\n    _globals[\"_VEHICLEAPIDATAGETRESULT\"]._serialized_start = 1237\n    _globals[\"_VEHICLEAPIDATAGETRESULT\"]._serialized_end = 1397\n    _globals[\"_VEHICLEAPIDATAGETRESULT_DATAENTRY\"]._serialized_start = 1320\n    _globals[\"_VEHICLEAPIDATAGETRESULT_DATAENTRY\"]._serialized_end = 1397\n    _globals[\"_VEHICLEAPIATTRIBUTESTATUS\"]._serialized_start = 1400\n    _globals[\"_VEHICLEAPIATTRIBUTESTATUS\"]._serialized_end = 1561\n    _globals[\"_VEHICLEAPICOMMANDPROCESSSTATUS\"]._serialized_start = 1564\n    _globals[\"_VEHICLEAPICOMMANDPROCESSSTATUS\"]._serialized_end = 1923\n    _globals[\"_VEHICLEAPIERROR\"]._serialized_start = 1926\n    _globals[\"_VEHICLEAPIERROR\"]._serialized_end = 2204\n    _globals[\"_VEHICLEAPIERROR_ATTRIBUTESENTRY\"]._serialized_start = 2131\n    _globals[\"_VEHICLEAPIERROR_ATTRIBUTESENTRY\"]._serialized_end = 2204\n    _globals[\"_APPTWINPENDINGCOMMANDSREQUEST\"]._serialized_start = 2206\n    _globals[\"_APPTWINPENDINGCOMMANDSREQUEST\"]._serialized_end = 2237\n    _globals[\"_APPTWINPENDINGCOMMANDSRESPONSE\"]._serialized_start = 2239\n    _globals[\"_APPTWINPENDINGCOMMANDSRESPONSE\"]._serialized_end = 2320\n    _globals[\"_PENDINGCOMMAND\"]._serialized_start = 2322\n    _globals[\"_PENDINGCOMMAND\"]._serialized_end = 2429\n# @@protoc_insertion_point(module_scope)\n"
  },
  {
    "path": "custom_components/mbapi2020/proto/vin_events_pb2.py",
    "content": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: vin-events.proto\n# Protobuf Python Version: 5.29.5\n\"\"\"Generated protocol buffer code.\"\"\"\n\nfrom google.protobuf import (\n    descriptor as _descriptor,\n    descriptor_pool as _descriptor_pool,\n    symbol_database as _symbol_database,\n)\nfrom google.protobuf.internal import builder as _builder\n\n# @@protoc_insertion_point(imports)\n\n_sym_db = _symbol_database.Default()\n\n\nDESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(\n    b'\\n\\x10vin-events.proto\\x12\\x05proto\"3\\n\\tVINUpdate\\x12\\x11\\n\\taddedVINs\\x18\\x01 \\x03(\\t\\x12\\x13\\n\\x0b\\x64\\x65letedVINs\\x18\\x02 \\x03(\\tB\\x1c\\n\\x1a\\x63om.daimler.mbcarkit.protob\\x06proto3'\n)\n\n_globals = globals()\n_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)\n_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, \"vin_events_pb2\", _globals)\nif not _descriptor._USE_C_DESCRIPTORS:\n    _globals[\"DESCRIPTOR\"]._loaded_options = None\n    _globals[\"DESCRIPTOR\"]._serialized_options = b\"\\n\\032com.daimler.mbcarkit.proto\"\n    _globals[\"_VINUPDATE\"]._serialized_start = 27\n    _globals[\"_VINUPDATE\"]._serialized_end = 78\n# @@protoc_insertion_point(module_scope)\n"
  },
  {
    "path": "custom_components/mbapi2020/repairs.py",
    "content": "\"\"\"Repairs platform for MBAPI2020.\"\"\"\n\nfrom __future__ import annotations\n\nfrom typing import Any\n\nimport voluptuous as vol\n\nfrom homeassistant import data_entry_flow\nfrom homeassistant.components.repairs import RepairsFlow\nfrom homeassistant.core import HomeAssistant\n\nfrom .const import DOMAIN\n\n\nclass RestartRequiredFixFlow(RepairsFlow):\n    \"\"\"Handler for an issue fixing flow.\"\"\"\n\n    def __init__(self, issue_id: str) -> None:\n        self.issue_id = issue_id\n\n    async def async_step_init(self, user_input: dict[str, str] | None = None) -> data_entry_flow.FlowResult:\n        \"\"\"Handle the first step of a fix flow.\"\"\"\n\n        return await self.async_step_confirm_restart()\n\n    async def async_step_confirm_restart(self, user_input: dict[str, str] | None = None) -> data_entry_flow.FlowResult:\n        \"\"\"Handle the confirm step of a fix flow.\"\"\"\n        if user_input is not None:\n            await self.hass.services.async_call(\"homeassistant\", \"restart\")\n            return self.async_create_entry(title=\"\", data={})\n\n        return self.async_show_form(\n            step_id=\"confirm_restart\",\n            data_schema=vol.Schema({}),\n            description_placeholders={\"name\": DOMAIN},\n        )\n\n\nasync def async_create_fix_flow(\n    hass: HomeAssistant,\n    issue_id: str,\n    data: dict[str, str | int | float | None] | None = None,\n    *args: Any,\n    **kwargs: Any,\n) -> RepairsFlow | None:\n    \"\"\"Create flow.\"\"\"\n    if issue_id.startswith(\"restart_required\"):\n        return RestartRequiredFixFlow(issue_id)\n    return None\n"
  },
  {
    "path": "custom_components/mbapi2020/sensor.py",
    "content": "\"\"\"Sensor support for Mercedes cars with Mercedes ME.\n\nFor more details about this component, please refer to the documentation at\nhttps://github.com/ReneNulschDE/mbapi2020/\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom datetime import datetime\n\nfrom homeassistant.components.sensor import RestoreSensor\nfrom homeassistant.config_entries import ConfigEntry\nfrom homeassistant.const import STATE_UNKNOWN\nfrom homeassistant.core import HomeAssistant\nfrom homeassistant.helpers.entity_platform import AddEntitiesCallback\n\nfrom . import MercedesMeEntity\nfrom .const import (\n    CONF_FT_DISABLE_CAPABILITY_CHECK,\n    DOMAIN,\n    LOGGER,\n    SENSORS,\n    SENSORS_POLL,\n    DefaultValueModeType,\n    SensorConfigFields as scf,\n)\nfrom .coordinator import MBAPI2020DataUpdateCoordinator\n\n\ndef _create_sensor_if_eligible(key, config, car, coordinator, should_poll=False, initial_setup=False):\n    \"\"\"Check if sensor should be created and return device if eligible.\"\"\"\n    # Skip special sensors during dynamic loading, but allow during initial setup\n    if key in [\"car\", \"data_mode\"] and not initial_setup:\n        return None\n\n    if (\n        config[scf.CAPABILITIES_LIST.value] is None\n        or coordinator.config_entry.options.get(CONF_FT_DISABLE_CAPABILITY_CHECK, False)\n        or car.features.get(config[scf.CAPABILITIES_LIST.value], False)\n    ):\n        device_class = MercedesMESensorPoll if should_poll else MercedesMESensor\n        device = device_class(\n            internal_name=key,\n            config=config,\n            vin=car.finorvin,\n            coordinator=coordinator,\n            should_poll=should_poll,\n        )\n\n        # Check eligibility\n        status = device.device_retrieval_status()\n        is_eligible = False\n\n        if should_poll:\n            is_eligible = status in [\"VALID\", \"NOT_RECEIVED\"] or (\n                config[scf.DEFAULT_VALUE_MODE.value] is not None\n                and config[scf.DEFAULT_VALUE_MODE.value] != DefaultValueModeType.NONE\n                and str(status) not in [\"4\", \"error\"]\n            )\n        else:\n            is_eligible = status in [\"VALID\", \"NOT_RECEIVED\", \"3\", 3] or (\n                config[scf.DEFAULT_VALUE_MODE.value] is not None\n                and config[scf.DEFAULT_VALUE_MODE.value] != DefaultValueModeType.NONE\n                and str(status) not in [\"4\", \"error\"]\n            )\n\n        if is_eligible:\n            return device\n\n    return None\n\n\nasync def create_missing_sensors_for_car(car, coordinator, async_add_entities):\n    \"\"\"Create missing sensors for a specific car.\"\"\"\n\n    missing_sensors = []\n\n    # Helper function to check and add eligible devices\n    def _check_and_add_device(device, car, sensor_type=\"sensor\"):\n        if device:\n            if f\"sensor.{device.unique_id}\" not in car.sensors:\n                missing_sensors.append(device)\n                LOGGER.debug(\"Sensor added: %s, %s\", device._name, f\"sensor.{device.unique_id}\")\n\n    # Process regular sensors\n    for key, value in sorted(SENSORS.items()):\n        device = _create_sensor_if_eligible(key, value, car, coordinator, False)\n        _check_and_add_device(device, car)\n\n    # Process polling sensors\n    for key, value in sorted(SENSORS_POLL.items()):\n        device = _create_sensor_if_eligible(key, value, car, coordinator, True)\n        _check_and_add_device(device, car)\n\n    if missing_sensors:\n        await async_add_entities(missing_sensors, True)\n        return len(missing_sensors)\n    return 0\n\n\nasync def async_setup_entry(\n    hass: HomeAssistant,\n    config_entry: ConfigEntry,\n    async_add_entities: AddEntitiesCallback,\n) -> None:\n    \"\"\"Setups sensor platform.\"\"\"\n\n    coordinator: MBAPI2020DataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id]\n\n    if not coordinator.client.cars:\n        LOGGER.info(\"No Cars found.\")\n        return\n\n    sensor_list = []\n    for car in coordinator.client.cars.values():\n        for key, value in sorted(SENSORS.items()):\n            device = _create_sensor_if_eligible(key, value, car, coordinator, False, initial_setup=True)\n            if device:\n                sensor_list.append(device)\n\n        for key, value in sorted(SENSORS_POLL.items()):\n            device = _create_sensor_if_eligible(key, value, car, coordinator, True, initial_setup=True)\n            if device:\n                sensor_list.append(device)\n\n    async_add_entities(sensor_list, True)\n\n\nclass MercedesMESensor(MercedesMeEntity, RestoreSensor):\n    \"\"\"Representation of a Sensor.\"\"\"\n\n    @property\n    def native_value(self) -> str | int | float | datetime | None:\n        \"\"\"Return the state.\"\"\"\n        return self.state\n\n    @property\n    def state(self):\n        \"\"\"Return the state of the sensor.\"\"\"\n\n        if self.device_retrieval_status() in (\"NOT_RECEIVED\", \"4\", 4):\n            if self._sensor_config[scf.DEFAULT_VALUE_MODE.value]:\n                if self._sensor_config[scf.DEFAULT_VALUE_MODE.value] == \"Zero\":\n                    return 0\n            return STATE_UNKNOWN\n\n        if self.device_retrieval_status() == 3:\n            if self._sensor_config[scf.DEFAULT_VALUE_MODE.value]:\n                if self._sensor_config[scf.DEFAULT_VALUE_MODE.value] == \"Zero\":\n                    return 0\n                return STATE_UNKNOWN\n            return STATE_UNKNOWN\n\n        if self._internal_name == \"lastParkEvent\":\n            if self._state:\n                return datetime.fromtimestamp(int(self._state))\n        elif self._internal_name == \"chargingpowerecolimit\":\n            if self._state and int(self._state) <= 0:\n                return None\n            return self._state\n        elif self._internal_name == \"chargingpowerkw\":\n            if self._state and isinstance(self._state, (int, float)):\n                return round(float(self._state), 1)\n            if self._state and self._state == \"error\":\n                return STATE_UNKNOWN\n\n        return self._state\n\n    async def async_added_to_hass(self):\n        \"\"\"Add callback after being added to hass.\"\"\"\n\n        self._car.add_sensor(f\"sensor.{self._attr_unique_id}\")\n        await super().async_added_to_hass()\n\n    async def async_will_remove_from_hass(self):\n        \"\"\"Entity being removed from hass.\"\"\"\n\n        self._car.remove_sensor(f\"sensor.{self._attr_unique_id}\")\n        await super().async_will_remove_from_hass()\n\n\nclass MercedesMESensorPoll(MercedesMeEntity, RestoreSensor):\n    \"\"\"Representation of a Sensor.\"\"\"\n\n    @property\n    def native_value(self) -> str | int | float | datetime | None:\n        \"\"\"Return the state.\"\"\"\n        return self.state\n\n    @property\n    def state(self):\n        \"\"\"Return the state of the sensor.\"\"\"\n\n        if self.device_retrieval_status() == \"NOT_RECEIVED\":\n            return STATE_UNKNOWN\n\n        if self.device_retrieval_status() == 3:\n            return STATE_UNKNOWN\n\n        return self._state\n\n    async def async_added_to_hass(self):\n        \"\"\"Add callback after being added to hass.\"\"\"\n\n        self._car.add_sensor(f\"sensor.{self._attr_unique_id}\")\n        await super().async_added_to_hass()\n\n    async def async_will_remove_from_hass(self):\n        \"\"\"Entity being removed from hass.\"\"\"\n\n        self._car.remove_sensor(f\"sensor.{self._attr_unique_id}\")\n        await super().async_will_remove_from_hass()\n"
  },
  {
    "path": "custom_components/mbapi2020/services.py",
    "content": "\"\"\"Services for the Blink integration.\"\"\"\n\nfrom __future__ import annotations\n\nfrom homeassistant.core import HomeAssistant\nfrom homeassistant.exceptions import ServiceValidationError\nfrom homeassistant.helpers.update_coordinator import DataUpdateCoordinator\n\nfrom .const import (\n    CONF_PIN,\n    CONF_TIME,\n    CONF_VIN,\n    DOMAIN,\n    LOGGER,\n    SERVICE_AUXHEAT_CONFIGURE,\n    SERVICE_AUXHEAT_CONFIGURE_SCHEMA,\n    SERVICE_AUXHEAT_START,\n    SERVICE_AUXHEAT_STOP,\n    SERVICE_BATTERY_MAX_SOC_CONFIGURE,\n    SERVICE_BATTERY_MAX_SOC_CONFIGURE_SCHEMA,\n    SERVICE_CHARGE_PROGRAM_CONFIGURE,\n    SERVICE_CHARGING_BREAK_CLOCKTIMER_CONFIGURE,\n    SERVICE_CHARGING_BREAK_CLOCKTIMER_CONFIGURE_SCHEMA,\n    SERVICE_DOORS_LOCK_URL,\n    SERVICE_DOORS_UNLOCK_URL,\n    SERVICE_DOWNLOAD_IMAGES,\n    SERVICE_ENGINE_START,\n    SERVICE_ENGINE_STOP,\n    SERVICE_PRECONDITIONING_CONFIGURE,\n    SERVICE_PRECONDITIONING_CONFIGURE_SCHEMA,\n    SERVICE_PRECONDITIONING_CONFIGURE_SEATS,\n    SERVICE_PRECONDITIONING_CONFIGURE_SEATS_SCHEMA,\n    SERVICE_PREHEAT_START,\n    SERVICE_PREHEAT_START_DEPARTURE_TIME,\n    SERVICE_PREHEAT_START_SCHEMA,\n    SERVICE_PREHEAT_STOP,\n    SERVICE_PREHEAT_STOP_DEPARTURE_TIME,\n    SERVICE_SEND_ROUTE,\n    SERVICE_SEND_ROUTE_SCHEMA,\n    SERVICE_SIGPOS_START,\n    SERVICE_SUNROOF_CLOSE,\n    SERVICE_SUNROOF_OPEN,\n    SERVICE_SUNROOF_TILT,\n    SERVICE_TEMPERATURE_CONFIGURE,\n    SERVICE_TEMPERATURE_CONFIGURE_SCHEMA,\n    SERVICE_VIN_CHARGE_PROGRAM_SCHEMA,\n    SERVICE_VIN_PIN_SCHEMA,\n    SERVICE_VIN_SCHEMA,\n    SERVICE_VIN_TIME_SCHEMA,\n    SERVICE_WINDOWS_CLOSE,\n    SERVICE_WINDOWS_MOVE,\n    SERVICE_WINDOWS_MOVE_SCHEMA,\n    SERVICE_WINDOWS_OPEN,\n)\n\n\ndef setup_services(hass: HomeAssistant) -> None:\n    \"\"\"Set up the services for the MBAPI2020 integration.\"\"\"\n\n    domain = hass.data[DOMAIN]\n\n    def _get_config_entryid(vin: str):\n        for key in iter(domain):\n            if isinstance(domain[key], DataUpdateCoordinator):\n                coordinator = domain[key]\n                if coordinator.client and coordinator.client.cars:\n                    if vin in coordinator.client.cars:\n                        if coordinator.client.cars[vin].data_collection_mode == \"pull\":\n                            raise ServiceValidationError(\n                                \"The connection to the MB-server is in pull mode currently. Actions can't be executed in this mode.\"\n                            )\n                            continue\n                        return key\n\n        raise ServiceValidationError(\n            \"Given VIN/FIN is not managed by any coordinator or excluded in the integration options.\"\n        )\n\n    async def auxheat_configure(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.auxheat_configure(\n            call.data.get(CONF_VIN),\n            call.data.get(\"time_selection\"),\n            call.data.get(\"time_1\"),\n            call.data.get(\"time_2\"),\n            call.data.get(\"time_3\"),\n        )\n\n    async def auxheat_start(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.auxheat_start(call.data.get(CONF_VIN))\n\n    async def auxheat_stop(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.auxheat_stop(call.data.get(CONF_VIN))\n\n    async def doors_unlock(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.doors_unlock(\n            call.data.get(CONF_VIN), call.data.get(CONF_PIN)\n        )\n\n    async def charge_program_configure(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.charge_program_configure(\n            call.data.get(CONF_VIN),\n            call.data.get(\"charge_program\"),\n            call.data.get(\"max_soc\"),\n        )\n\n    async def charging_break_clocktimer_configure(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.charging_break_clocktimer_configure(\n            call.data.get(CONF_VIN),\n            call.data.get(\"status_timer_1\"),\n            call.data.get(\"starttime_timer_1\"),\n            call.data.get(\"stoptime_timer_1\"),\n            call.data.get(\"status_timer_2\"),\n            call.data.get(\"starttime_timer_2\"),\n            call.data.get(\"stoptime_timer_2\"),\n            call.data.get(\"status_timer_3\"),\n            call.data.get(\"starttime_timer_3\"),\n            call.data.get(\"stoptime_timer_3\"),\n            call.data.get(\"status_timer_4\"),\n            call.data.get(\"starttime_timer_4\"),\n            call.data.get(\"stoptime_timer_4\"),\n        )\n\n    async def doors_lock(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.doors_lock(call.data.get(CONF_VIN))\n\n    async def engine_start(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.engine_start(\n            call.data.get(CONF_VIN),\n            call.data.get(CONF_PIN),\n        )\n\n    async def engine_stop(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.engine_stop(call.data.get(CONF_VIN))\n\n    async def hv_battery_start_conditioning(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.hv_battery_start_conditioning(\n            call.data.get(CONF_VIN)\n        )\n\n    async def hv_battery_stop_conditioning(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.hv_battery_stop_conditioning(\n            call.data.get(CONF_VIN)\n        )\n\n    async def sigpos_start(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.sigpos_start(call.data.get(CONF_VIN))\n\n    async def sunroof_open(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.sunroof_open(\n            call.data.get(CONF_VIN),\n            call.data.get(CONF_PIN),\n        )\n\n    async def sunroof_tilt(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.sunroof_tilt(\n            call.data.get(CONF_VIN),\n            call.data.get(CONF_PIN),\n        )\n\n    async def sunroof_close(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.sunroof_close(call.data.get(CONF_VIN))\n\n    async def preconditioning_configure_seats(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.preconditioning_configure_seats(\n            call.data.get(CONF_VIN),\n            call.data.get(\"front_left\"),\n            call.data.get(\"front_right\"),\n            call.data.get(\"rear_left\"),\n            call.data.get(\"rear_right\"),\n        )\n\n    async def preheat_start(call) -> None:\n        if call.data.get(\"type\", 0) == 0:\n            await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.preheat_start(call.data.get(CONF_VIN))\n        else:\n            await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.preheat_start_immediate(\n                call.data.get(CONF_VIN)\n            )\n\n    async def preheat_start_departure_time(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.preheat_start_departure_time(\n            call.data.get(CONF_VIN), call.data.get(CONF_TIME)\n        )\n\n    async def preheat_stop(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.preheat_stop(call.data.get(CONF_VIN))\n\n    async def preheat_stop_departure_time(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.preheat_stop_departure_time(\n            call.data.get(CONF_VIN)\n        )\n\n    async def preconditioning_configure(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.preconditioning_configure(\n            call.data.get(CONF_VIN),\n            call.data.get(\"departure_time_mode\"),\n            call.data.get(\"departure_time\"),\n        )\n\n    async def windows_open(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.windows_open(\n            call.data.get(CONF_VIN), call.data.get(CONF_PIN)\n        )\n\n    async def temperature_configure(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.temperature_configure(\n            call.data.get(CONF_VIN),\n            call.data.get(\"front_left\"),\n            call.data.get(\"front_right\"),\n            call.data.get(\"rear_left\"),\n            call.data.get(\"rear_right\"),\n        )\n\n    async def windows_close(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.windows_close(call.data.get(CONF_VIN))\n\n    async def windows_move(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.windows_move(\n            call.data.get(CONF_VIN),\n            call.data.get(\"front_left\"),\n            call.data.get(\"front_right\"),\n            call.data.get(\"rear_left\"),\n            call.data.get(\"rear_right\"),\n            call.data.get(CONF_PIN),\n        )\n\n    async def send_route_to_car(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.send_route_to_car(\n            call.data.get(CONF_VIN),\n            call.data.get(\"title\"),\n            call.data.get(\"latitude\"),\n            call.data.get(\"longitude\"),\n            call.data.get(\"city\"),\n            call.data.get(\"postcode\"),\n            call.data.get(\"street\"),\n        )\n\n    async def battery_max_soc_configure(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.battery_max_soc_configure(\n            call.data.get(CONF_VIN), call.data.get(\"max_soc\"), call.data.get(\"charge_program\")\n        )\n\n    async def download_images(call) -> None:\n        await domain[_get_config_entryid(call.data.get(CONF_VIN))].client.download_images(call.data.get(CONF_VIN))\n\n    # Register all the above services\n    service_mapping = [\n        (\n            SERVICE_AUXHEAT_CONFIGURE,\n            auxheat_configure,\n            SERVICE_AUXHEAT_CONFIGURE_SCHEMA,\n        ),\n        (SERVICE_AUXHEAT_START, auxheat_start, SERVICE_VIN_SCHEMA),\n        (SERVICE_AUXHEAT_STOP, auxheat_stop, SERVICE_VIN_SCHEMA),\n        (\n            SERVICE_BATTERY_MAX_SOC_CONFIGURE,\n            battery_max_soc_configure,\n            SERVICE_BATTERY_MAX_SOC_CONFIGURE_SCHEMA,\n        ),\n        (SERVICE_CHARGE_PROGRAM_CONFIGURE, charge_program_configure, SERVICE_VIN_CHARGE_PROGRAM_SCHEMA),\n        (\n            SERVICE_CHARGING_BREAK_CLOCKTIMER_CONFIGURE,\n            charging_break_clocktimer_configure,\n            SERVICE_CHARGING_BREAK_CLOCKTIMER_CONFIGURE_SCHEMA,\n        ),\n        (SERVICE_DOORS_LOCK_URL, doors_lock, SERVICE_VIN_SCHEMA),\n        (SERVICE_DOORS_UNLOCK_URL, doors_unlock, SERVICE_VIN_PIN_SCHEMA),\n        (SERVICE_DOWNLOAD_IMAGES, download_images, SERVICE_VIN_SCHEMA),\n        (SERVICE_ENGINE_START, engine_start, SERVICE_VIN_PIN_SCHEMA),\n        (SERVICE_ENGINE_STOP, engine_stop, SERVICE_VIN_SCHEMA),\n        #        (SERVICE_HV_BATTERY_START_CONDITIONING, hv_battery_start_conditioning, SERVICE_VIN_SCHEMA),\n        #        (SERVICE_HV_BATTERY_STOP_CONDITIONING, hv_battery_stop_conditioning, SERVICE_VIN_SCHEMA),\n        (\n            SERVICE_PRECONDITIONING_CONFIGURE,\n            preconditioning_configure,\n            SERVICE_PRECONDITIONING_CONFIGURE_SCHEMA,\n        ),\n        (\n            SERVICE_PRECONDITIONING_CONFIGURE_SEATS,\n            preconditioning_configure_seats,\n            SERVICE_PRECONDITIONING_CONFIGURE_SEATS_SCHEMA,\n        ),\n        (SERVICE_PREHEAT_START, preheat_start, SERVICE_PREHEAT_START_SCHEMA),\n        (\n            SERVICE_PREHEAT_START_DEPARTURE_TIME,\n            preheat_start_departure_time,\n            SERVICE_VIN_TIME_SCHEMA,\n        ),\n        (SERVICE_PREHEAT_STOP, preheat_stop, SERVICE_VIN_SCHEMA),\n        (\n            SERVICE_PREHEAT_STOP_DEPARTURE_TIME,\n            preheat_stop_departure_time,\n            SERVICE_VIN_SCHEMA,\n        ),\n        (SERVICE_SEND_ROUTE, send_route_to_car, SERVICE_SEND_ROUTE_SCHEMA),\n        (SERVICE_SIGPOS_START, sigpos_start, SERVICE_VIN_SCHEMA),\n        (SERVICE_SUNROOF_OPEN, sunroof_open, SERVICE_VIN_PIN_SCHEMA),\n        (SERVICE_SUNROOF_TILT, sunroof_tilt, SERVICE_VIN_PIN_SCHEMA),\n        (SERVICE_SUNROOF_CLOSE, sunroof_close, SERVICE_VIN_SCHEMA),\n        (SERVICE_TEMPERATURE_CONFIGURE, temperature_configure, SERVICE_TEMPERATURE_CONFIGURE_SCHEMA),\n        (SERVICE_WINDOWS_OPEN, windows_open, SERVICE_VIN_PIN_SCHEMA),\n        (SERVICE_WINDOWS_CLOSE, windows_close, SERVICE_VIN_SCHEMA),\n        (SERVICE_WINDOWS_MOVE, windows_move, SERVICE_WINDOWS_MOVE_SCHEMA),\n    ]\n\n    for service_name, service_handler, schema in service_mapping:\n        hass.services.async_register(DOMAIN, service_name, service_handler, schema=schema)\n\n\ndef remove_services(hass: HomeAssistant) -> None:\n    \"\"\"Remove the services for the MBAPI2020 integration.\"\"\"\n\n    LOGGER.debug(\"Start unload component. Services\")\n    hass.services.async_remove(DOMAIN, SERVICE_AUXHEAT_CONFIGURE)\n    hass.services.async_remove(DOMAIN, SERVICE_AUXHEAT_START)\n    hass.services.async_remove(DOMAIN, SERVICE_AUXHEAT_STOP)\n    hass.services.async_remove(DOMAIN, SERVICE_BATTERY_MAX_SOC_CONFIGURE)\n    hass.services.async_remove(DOMAIN, SERVICE_CHARGE_PROGRAM_CONFIGURE)\n    hass.services.async_remove(DOMAIN, SERVICE_CHARGING_BREAK_CLOCKTIMER_CONFIGURE)\n    hass.services.async_remove(DOMAIN, SERVICE_DOORS_LOCK_URL)\n    hass.services.async_remove(DOMAIN, SERVICE_DOORS_UNLOCK_URL)\n    hass.services.async_remove(DOMAIN, SERVICE_DOWNLOAD_IMAGES)\n    hass.services.async_remove(DOMAIN, SERVICE_ENGINE_START)\n    hass.services.async_remove(DOMAIN, SERVICE_ENGINE_STOP)\n    #    hass.services.async_remove(DOMAIN, SERVICE_HV_BATTERY_START_CONDITIONING)\n    #    hass.services.async_remove(DOMAIN, SERVICE_HV_BATTERY_STOP_CONDITIONING)\n    hass.services.async_remove(DOMAIN, SERVICE_PRECONDITIONING_CONFIGURE)\n    hass.services.async_remove(DOMAIN, SERVICE_PRECONDITIONING_CONFIGURE_SEATS)\n    hass.services.async_remove(DOMAIN, SERVICE_PREHEAT_START)\n    hass.services.async_remove(DOMAIN, SERVICE_PREHEAT_START_DEPARTURE_TIME)\n    hass.services.async_remove(DOMAIN, SERVICE_PREHEAT_STOP)\n    hass.services.async_remove(DOMAIN, SERVICE_PREHEAT_STOP_DEPARTURE_TIME)\n    hass.services.async_remove(DOMAIN, SERVICE_SEND_ROUTE)\n    hass.services.async_remove(DOMAIN, SERVICE_SIGPOS_START)\n    hass.services.async_remove(DOMAIN, SERVICE_SUNROOF_OPEN)\n    hass.services.async_remove(DOMAIN, SERVICE_SUNROOF_TILT)\n    hass.services.async_remove(DOMAIN, SERVICE_SUNROOF_CLOSE)\n    hass.services.async_remove(DOMAIN, SERVICE_TEMPERATURE_CONFIGURE)\n    hass.services.async_remove(DOMAIN, SERVICE_WINDOWS_OPEN)\n    hass.services.async_remove(DOMAIN, SERVICE_WINDOWS_CLOSE)\n    hass.services.async_remove(DOMAIN, SERVICE_WINDOWS_MOVE)\n"
  },
  {
    "path": "custom_components/mbapi2020/services.yaml",
    "content": "auxheat_configure:\n  description: \"Command for configuring the auxiliary heating. It is possible to define three daytimes and select one active time.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    time_selection:\n      description: \"The activated auxiliary heating preset time (0=no_selection, 1=time_1, 2=time_2, 3=time_3\"\n      example: \"0\"\n      default: 0\n      selector:\n        select:\n          options:\n            - \"0\"\n            - \"1\"\n            - \"2\"\n            - \"3\"\n    time_1:\n      description: \"Daytime in minutes after midnight. E.g. valid value for 8 am would be 480. Value range is 0 to 1439.\"\n      example: \"480\"\n      default: 0\n      selector:\n        number:\n          min: 0\n          max: 1439\n          step: 1\n          mode: slider\n    time_2:\n      description: \"Daytime in minutes after midnight. E.g. valid value for 8 am would be 480. Value range is 0 to 1439.\"\n      example: \"480\"\n      default: 0\n      selector:\n        number:\n          min: 0\n          max: 1439\n          step: 1\n          mode: slider\n    time_3:\n      description: \"Daytime in minutes after midnight. E.g. valid value for 8 am would be 480. Value range is 0 to 1439.\"\n      example: \"480\"\n      default: 0\n      selector:\n        number:\n          min: 0\n          max: 1439\n          step: 1\n          mode: slider\n\nauxheat_start:\n  description: \"Start the auxiliary heating of a car defined by a vin.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n\nauxheat_stop:\n  description: \"Stop the auxiliary heating of a car defined by a vin.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n\nbattery_max_soc_configure:\n  description: \"Configure the maximum value for the state of charge of the HV battery of a car defined by a vin.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    max_soc:\n      description: \"The maximum value for the state of charge of the HV battery (Value needs to be between 50 and 100 and divisible by ten)\"\n      example: \"100\"\n      default: 100\n      selector:\n        select:\n          options:\n            - label: \"30% (CLA >= 2025)\"\n              value: \"30\"\n            - label: \"40% (CLA >= 2025)\"\n              value: \"40\"\n            - label: \"50%\"\n              value: \"50\"\n            - label: \"60%\"\n              value: \"60\"\n            - label: \"70%\"\n              value: \"70\"\n            - label: \"80%\"\n              value: \"80\"\n            - label: \"90%\"\n              value: \"90\"\n            - label: \"100%\"\n              value: \"100\"\n    charge_program:\n      description: \"(optional) Charge Program - (0=Default, 2=Home, 3=Work)\"\n      example: \"0\"\n      default: 0\n      selector:\n        select:\n          options:\n            - \"0\"\n            - \"2\"\n            - \"3\"\n          translation_key: \"charge_program\"\n\ncharge_program_configure:\n  description: \"Command to select the charge program.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    charge_program:\n      description: \"The activated charge program (0=Default, 2=Home, 3=Work)\"\n      required: True\n      example: \"0\"\n      default: 0\n      selector:\n        select:\n          options:\n            - \"0\"\n            - \"2\"\n            - \"3\"\n    max_soc:\n      description: \"The maximum value for the state of charge of the HV battery (Value needs to be between 50 and 100 and divisible by ten)\"\n      example: \"100\"\n      default: None\n      required: False\n      selector:\n        select:\n          options:\n            - \"50\"\n            - \"60\"\n            - \"70\"\n            - \"80\"\n            - \"90\"\n            - \"100\"\n\ndoors_unlock:\n  description: \"Unlock a car defined by a vin. PIN setup required. See options dialog of the integration.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    pin:\n      description: \"security pin\"\n      example: \"1234\"\n      required: False\n      selector:\n        text:\n\ndoors_lock:\n  description: \"Lock a car defined by a vin.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n\nengine_start:\n  description: \"Start the engine of a car defined by a vin. PIN setup required. See options dialog of the integration.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    pin:\n      description: \"Security pin\"\n      example: \"1234\"\n      required: False\n      selector:\n        text:\n\nengine_stop:\n  description: \"Stop the engine of a car defined by a vin.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n\nhv_battery_start_conditioning:\n  description: \"Start the HV battery conditioning of a car defined by a vin.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n\nhv_battery_stop_conditioninge_stop:\n  description: \"Stop the HV battery conditioning of a car defined by a vin.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n\npreheat_start:\n  description: \"Start the pre-heating of a car defined by a vin.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    type:\n      description: \"Method that is used to initiate the start process. 0=Now (Default), 1=Immediate - Use Immediate in case your does not support now.\"\n      default: \"0\"\n      example: \"0\"\n      selector:\n        select:\n          options:\n            - \"0\"\n            - \"1\"\n\npreheat_start_departure_time:\n  description: \"Start the pre-heating of a car defined by a vin and a given departure time.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    time:\n      description: \"Departure time in minutes after midnight. E.g. valid value for 8 am would be 480. Value range is 0 to 1439\"\n      example: \"480\"\n      default: 0\n      selector:\n        number:\n          min: 0\n          max: 1439\n          step: 1\n          mode: slider\n\npreheat_stop:\n  description: \"Stop the pre-heating of a car defined by a vin.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n\npreheat_stop_departure_time:\n  description: \"Stop the pre-heating (departure mode) of a car defined by a vin.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n\npreconditioning_configure:\n  description: \"Configure preconditioning departure time mode. Use mode 0 to disable scheduled departure preconditioning. Note: WEEKLY_DEPARTURE mode is not available on all car models.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    departure_time_mode:\n      description: \"Departure time mode: 0=DISABLED, 1=SINGLE_DEPARTURE, 2=WEEKLY_DEPARTURE\"\n      example: \"0\"\n      default: 0\n      selector:\n        select:\n          options:\n            - label: \"Disabled\"\n              value: \"0\"\n            - label: \"Single Departure\"\n              value: \"1\"\n            - label: \"Weekly Departure\"\n              value: \"2\"\n    departure_time:\n      description: \"Departure time in minutes after midnight (0-1439). Only used when mode > 0.\"\n      example: \"480\"\n      default: 0\n      required: False\n      selector:\n        number:\n          min: 0\n          max: 1439\n          step: 1\n          mode: slider\n\nsigpos_start:\n  description: \"Start light signaling of a car defined by a vin.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n\nsunroof_open:\n  description: \"Open the sunroof of a car defined by a vin. PIN setup required. See options dialog of the integration.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    pin:\n      description: \"Security pin\"\n      example: \"1234\"\n      required: False\n      selector:\n        text:\n\nsunroof_tilt:\n  description: \"Tilt the sunroof of a car defined by a vin. PIN setup required. See options dialog of the integration.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    pin:\n      description: \"Security pin\"\n      example: \"1234\"\n      required: False\n      selector:\n        text:\n\nsunroof_close:\n  description: \"Close the sunroof of a car defined by a vin.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n\nwindows_open:\n  description: \"Open the windows of a car defined by a vin. PIN setup required. See options dialog of the integration.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    pin:\n      description: \"security pin\"\n      example: \"1234\"\n      required: False\n      selector:\n        text:\n\nwindows_close:\n  description: \"Close the windows of a car defined by a vin.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n\nwindows_move:\n  description: \"Move the windows to the defined positions of a car defined by a vin. PIN setup required. See options dialog of the integration.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    pin:\n      description: \"Security pin\"\n      example: \"1234\"\n      required: False\n      selector:\n        text:\n    front_left:\n      description: \"The new position of the front left window (Value needs to be between 0 and 100 and divisible by ten).\"\n      example: \"80\"\n      required: False\n      selector:\n        select:\n          options:\n            - \"0\"\n            - \"10\"\n            - \"20\"\n            - \"30\"\n            - \"40\"\n            - \"50\"\n            - \"60\"\n            - \"70\"\n            - \"80\"\n            - \"90\"\n            - \"100\"\n    front_right:\n      description: \"The new position of the front right window (Value needs to be between 0 and 100 and divisible by ten).\"\n      example: \"80\"\n      required: False\n      selector:\n        select:\n          options:\n            - \"0\"\n            - \"10\"\n            - \"20\"\n            - \"30\"\n            - \"40\"\n            - \"50\"\n            - \"60\"\n            - \"70\"\n            - \"80\"\n            - \"90\"\n            - \"100\"\n    rear_left:\n      description: \"The new position of the rear left window (Value needs to be between 0 and 100 and divisible by ten).\"\n      example: \"80\"\n      required: False\n      selector:\n        select:\n          options:\n            - \"0\"\n            - \"10\"\n            - \"20\"\n            - \"30\"\n            - \"40\"\n            - \"50\"\n            - \"60\"\n            - \"70\"\n            - \"80\"\n            - \"90\"\n            - \"100\"\n    rear_right:\n      description: \"The new position of the front left window (Value needs to be between 0 and 100 and divisible by ten).\"\n      example: \"80\"\n      required: False\n      selector:\n        select:\n          options:\n            - \"0\"\n            - \"10\"\n            - \"20\"\n            - \"30\"\n            - \"40\"\n            - \"50\"\n            - \"60\"\n            - \"70\"\n            - \"80\"\n            - \"90\"\n            - \"100\"\n\nsend_route:\n  description: \"Sends a route to the car. (Single location only)\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    title:\n      description: \"title of the route\"\n      example: \"Brandenburger Tor\"\n      required: True\n      selector:\n        text:\n    latitude:\n      description: \"Latitude of the location\"\n      example: \"52.5162746\"\n      required: True\n      selector:\n        text:\n    longitude:\n      description: \"Longitude of the location\"\n      example: \"13.3755154\"\n      required: True\n      selector:\n        text:\n    city:\n      description: \"City name of the location\"\n      example: \"Berlin\"\n      required: True\n      selector:\n        text:\n    postcode:\n      description: \"Postcode of the location\"\n      example: \"10117\"\n      required: True\n      selector:\n        text:\n    street:\n      description: \"Streetname of the location\"\n      example: \"Pariser Platz\"\n      required: True\n      selector:\n        text:\n\ndownload_images:\n  description: \"Download the images and save it to the component folder.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n\ncharging_break_clocktimer_configure:\n  description: \"Configure charging breaks (AC only)\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    status_timer_1:\n      description: \"Status Timer 1\"\n      default: \"notset\"\n      selector:\n        select:\n          translation_key: \"charging_break_clocktimer_configure_action\"\n          options:\n            - \"notset\"\n            - \"active\"\n            - \"inactive\"\n    starttime_timer_1:\n      description: \"Start time (Timer 1)\"\n      selector:\n        time:\n    stoptime_timer_1:\n      description: \"Stop time (Timer 1)\"\n      selector:\n        time:\n    status_timer_2:\n      description: \"Status Timer 2\"\n      default: \"notset\"\n      selector:\n        select:\n          translation_key: \"charging_break_clocktimer_configure_action\"\n          options:\n            - \"notset\"\n            - \"active\"\n            - \"inactive\"\n    starttime_timer_2:\n      description: \"Start time (Timer 2)\"\n      selector:\n        time:\n    stoptime_timer_2:\n      description: \"Stop time (Timer 2)\"\n      selector:\n        time:\n    status_timer_3:\n      description: \"Status Timer 3\"\n      default: \"notset\"\n      selector:\n        select:\n          translation_key: \"charging_break_clocktimer_configure_action\"\n          options:\n            - \"notset\"\n            - \"active\"\n            - \"inactive\"\n    starttime_timer_3:\n      description: \"Start time (Timer 3)\"\n      selector:\n        time:\n    stoptime_timer_3:\n      description: \"Stop time (Timer 3)\"\n      selector:\n        time:\n    status_timer_4:\n      description: \"Status Timer 4\"\n      default: \"notset\"\n      selector:\n        select:\n          translation_key: \"charging_break_clocktimer_configure_action\"\n          options:\n            - \"notset\"\n            - \"active\"\n            - \"inactive\"\n    starttime_timer_4:\n      description: \"Start time (Timer 4)\"\n      selector:\n        time:\n    stoptime_timer_4:\n      description: \"Stop time (Timer 4)\"\n      selector:\n        time:\n\npreconditioning_configure_seats:\n  description: \"Configure which seats should be preconditioned of a car defined by a vin.\"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    front_left:\n      description: \"Activate if the front left seat should be preconditioned.\"\n      required: True\n      selector:\n        boolean:\n    front_right:\n      description: \"Activate if the front right seat should be preconditioned.\"\n      required: True\n      selector:\n        boolean:\n    rear_left:\n      description: \"Activate if the rear left seat should be preconditioned.\"\n      required: True\n      selector:\n        boolean:\n    rear_right:\n      description: \"Activate if the rear right seat should be preconditioned.\"\n      required: True\n      selector:\n        boolean:\n\ntemperature_configure:\n  description: \"Configure the temperature for the allowed zones in a car. \"\n  fields:\n    vin:\n      description: \"vin of the car\"\n      example: \"Wxxxxxxxxxxxxxx\"\n      required: True\n      selector:\n        text:\n    front_left:\n      description: \"Target temperature for the zone front_left in CELSIUS\"\n      required: False\n      selector:\n        select:\n          translation_key: \"temperature_configure\"\n          options:\n            - \"0\"\n            - \"16\"\n            - \"16.5\"\n            - \"17\"\n            - \"17.5\"\n            - \"18\"\n            - \"18.5\"\n            - \"19\"\n            - \"19.5\"\n            - \"20\"\n            - \"20.5\"\n            - \"21\"\n            - \"21.5\"\n            - \"22\"\n            - \"22.5\"\n            - \"23\"\n            - \"23.5\"\n            - \"24\"\n            - \"24.5\"\n            - \"25\"\n            - \"25.5\"\n            - \"26\"\n            - \"26.5\"\n            - \"27\"\n            - \"27.5\"\n            - \"28\"\n            - \"30\"\n    front_right:\n      description: \"Target temperature for the zone front_right in CELSIUS\"\n      required: False\n      selector:\n        select:\n          translation_key: \"temperature_configure\"\n          options:\n            - \"0\"\n            - \"16\"\n            - \"16.5\"\n            - \"17\"\n            - \"17.5\"\n            - \"18\"\n            - \"18.5\"\n            - \"19\"\n            - \"19.5\"\n            - \"20\"\n            - \"20.5\"\n            - \"21\"\n            - \"21.5\"\n            - \"22\"\n            - \"22.5\"\n            - \"23\"\n            - \"23.5\"\n            - \"24\"\n            - \"24.5\"\n            - \"25\"\n            - \"25.5\"\n            - \"26\"\n            - \"26.5\"\n            - \"27\"\n            - \"27.5\"\n            - \"28\"\n            - \"30\"\n    rear_left:\n      description: \"Target temperature for the zone rear_left in CELSIUS. (if available)\"\n      required: False\n      selector:\n        select:\n          translation_key: \"temperature_configure\"\n          options:\n            - \"0\"\n            - \"16\"\n            - \"16.5\"\n            - \"17\"\n            - \"17.5\"\n            - \"18\"\n            - \"18.5\"\n            - \"19\"\n            - \"19.5\"\n            - \"20\"\n            - \"20.5\"\n            - \"21\"\n            - \"21.5\"\n            - \"22\"\n            - \"22.5\"\n            - \"23\"\n            - \"23.5\"\n            - \"24\"\n            - \"24.5\"\n            - \"25\"\n            - \"25.5\"\n            - \"26\"\n            - \"26.5\"\n            - \"27\"\n            - \"27.5\"\n            - \"28\"\n            - \"30\"\n    rear_right:\n      description: \"Target temperature for the zone rear_right in CELSIUS. (if available)\"\n      required: False\n      selector:\n        select:\n          translation_key: \"temperature_configure\"\n          options:\n            - \"0\"\n            - \"16\"\n            - \"16.5\"\n            - \"17\"\n            - \"17.5\"\n            - \"18\"\n            - \"18.5\"\n            - \"19\"\n            - \"19.5\"\n            - \"20\"\n            - \"20.5\"\n            - \"21\"\n            - \"21.5\"\n            - \"22\"\n            - \"22.5\"\n            - \"23\"\n            - \"23.5\"\n            - \"24\"\n            - \"24.5\"\n            - \"25\"\n            - \"25.5\"\n            - \"26\"\n            - \"26.5\"\n            - \"27\"\n            - \"27.5\"\n            - \"28\"\n            - \"30\"\n"
  },
  {
    "path": "custom_components/mbapi2020/switch.py",
    "content": "\"\"\"Switch support for Mercedes cars with Mercedes ME.\n\nFor more details about this component, please refer to the documentation at\nhttps://github.com/ReneNulschDE/mbapi2020/\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom collections.abc import Callable, Coroutine\nfrom dataclasses import dataclass\nfrom typing import Any\n\nfrom homeassistant.components.switch import SwitchEntity, SwitchEntityDescription\nfrom homeassistant.config_entries import ConfigEntry\nfrom homeassistant.core import HomeAssistant\nfrom homeassistant.helpers.entity_platform import AddEntitiesCallback\nfrom homeassistant.helpers.event import async_call_later\nfrom homeassistant.helpers.restore_state import RestoreEntity\n\nfrom . import MercedesMeEntity, MercedesMeEntityDescription\nfrom .car import Car\nfrom .const import CONF_FT_DISABLE_CAPABILITY_CHECK, DOMAIN, LOGGER, STATE_CONFIRMATION_DURATION\nfrom .coordinator import MBAPI2020DataUpdateCoordinator\nfrom .helper import LogHelper as loghelper\n\n\n@dataclass(frozen=True, kw_only=True)\nclass MercedesMeSwitchEntityDescription(MercedesMeEntityDescription, SwitchEntityDescription):\n    \"\"\"Configuration class for MercedesMe switch entities.\"\"\"\n\n    is_on_fn: Callable[[MercedesMeSwitch], Callable[[], Coroutine[Any, Any, bool]]]\n    turn_on_fn: Callable[[MercedesMeSwitch], Callable[[], Coroutine[Any, Any, None]]]\n    turn_off_fn: Callable[[MercedesMeSwitch], Callable[[], Coroutine[Any, Any, None]]]\n\n\nSWITCH_DESCRIPTIONS: list[MercedesMeSwitchEntityDescription] = [\n    MercedesMeSwitchEntityDescription(\n        key=\"precond\",\n        translation_key=\"precond\",\n        icon=\"mdi:hvac\",\n        is_on_fn=lambda self: self._get_car_value(\"precond\", \"precondStatus\", \"value\", default_value=False),\n        turn_on_fn=lambda self, **kwargs: self._coordinator.client.preheat_start_universal(self._vin),\n        turn_off_fn=lambda self, **kwargs: self._coordinator.client.preheat_stop(self._vin),\n        check_capability_fn=lambda car: car.check_capabilities(\n            [\"ZEV_PRECONDITIONING_START\", \"ZEV_PRECONDITIONING_STOP\"]\n        ),\n    ),\n    MercedesMeSwitchEntityDescription(\n        key=\"auxheat\",\n        translation_key=\"auxheat\",\n        icon=\"mdi:hvac\",\n        is_on_fn=lambda self: self._get_car_value(\"auxheat\", \"auxheatActive\", \"value\", default_value=False),\n        turn_on_fn=lambda self, **kwargs: self._coordinator.client.auxheat_start(self._vin),\n        turn_off_fn=lambda self, **kwargs: self._coordinator.client.auxheat_stop(self._vin),\n        check_capability_fn=lambda car: car.check_capabilities([\"AUXHEAT_START\", \"AUXHEAT_STOP\", \"auxHeat\"]),\n    ),\n]\n\n\nclass MercedesMeSwitch(MercedesMeEntity, SwitchEntity, RestoreEntity):\n    \"\"\"Representation of a Mercedes Me Switch.\"\"\"\n\n    def __init__(self, description: MercedesMeSwitchEntityDescription, vin, coordinator) -> None:\n        \"\"\"Initialize the switch with methods for handling on/off commands.\"\"\"\n\n        # Initialize command tracking variables\n        self._expected_state = None  # True for on, False for off, or None\n        self._state_confirmation_duration = STATE_CONFIRMATION_DURATION\n        self._confirmation_handle = None\n\n        super().__init__(description.key, description, vin, coordinator)\n\n    async def async_turn_on(self, **kwargs: dict) -> None:\n        \"\"\"Turn the device component on.\"\"\"\n        await self._async_handle_state_change(state=True, **kwargs)\n\n    async def async_turn_off(self, **kwargs: dict) -> None:\n        \"\"\"Turn the device component off.\"\"\"\n        await self._async_handle_state_change(state=False, **kwargs)\n\n    async def _async_handle_state_change(self, state: bool, **kwargs) -> None:\n        \"\"\"Handle changing the device state and manage confirmation duration.\"\"\"\n        # Set the expected state based on the desired state\n        self._expected_state = state\n\n        try:\n            # Execute the appropriate method and handle any exceptions\n            if state:\n                await self.entity_description.turn_on_fn(self, **kwargs)\n            else:\n                await self.entity_description.turn_off_fn(self, **kwargs)\n\n            # Cancel any existing confirmation handle\n            if self._confirmation_handle:\n                self._confirmation_handle()\n\n            # Schedule state reset after confirmation duration\n            self._confirmation_handle = async_call_later(\n                self.hass, self._state_confirmation_duration, self._reset_expected_state\n            )\n\n        except Exception as e:\n            # Log the error and reset state if needed\n            LOGGER.error(\n                \"Error changing state to %s for entity '%s': %s\",\n                \"on\" if state else \"off\",\n                self.entity_description.translation_key,\n                str(e),\n            )\n            self._expected_state = None\n            if self._confirmation_handle:\n                self._confirmation_handle()\n                self._confirmation_handle = None\n            self.async_write_ha_state()\n\n    async def _reset_expected_state(self, _):\n        \"\"\"Reset the expected state after confirmation duration and update the state.\"\"\"\n        self._attr_is_on = not self._expected_state\n        self._expected_state = None\n        self._confirmation_handle = None\n        self.async_write_ha_state()\n\n    def _mercedes_me_update(self) -> None:\n        \"\"\"Update Mercedes Me entity.\"\"\"\n        try:\n            actual_state = self.entity_description.is_on_fn(self)\n        except Exception as e:\n            LOGGER.error(\"Error getting actual state for %s: %s\", self.name, str(e))\n            self._attr_available = False\n            return\n\n        if self._expected_state is not None:\n            if actual_state == self._expected_state:\n                # Expected state reached, cancel confirmation duration\n                if self._confirmation_handle:\n                    self._confirmation_handle()\n                    self._confirmation_handle = None\n                self._expected_state = None\n            else:\n                # Return expected state during the confirmation duration\n                self._attr_is_on = self._expected_state\n        else:\n            self._attr_is_on = actual_state\n        self.async_write_ha_state()\n\n    @property\n    def assumed_state(self) -> bool:\n        \"\"\"Return True if the state is assumed.\"\"\"\n        return self._expected_state is not None\n\n\nasync def async_setup_entry(\n    hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities: AddEntitiesCallback\n) -> None:\n    \"\"\"Set up the switch platform for Mercedes Me.\"\"\"\n\n    coordinator: MBAPI2020DataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id]\n    skip_capability_check: bool = config_entry.options.get(CONF_FT_DISABLE_CAPABILITY_CHECK, False)\n\n    def check_capability(car: Car, description: MercedesMeSwitchEntityDescription) -> bool:\n        \"\"\"Check if the car supports the necessary capability for the given feature description.\"\"\"\n        if not skip_capability_check and not description.check_capability_fn(car):\n            vin_masked = loghelper.Mask_VIN(car.finorvin)\n            LOGGER.debug(\n                \"Skipping feature '%s' for VIN '%s' due to lack of required capability\", description.key, vin_masked\n            )\n            return False\n        return True\n\n    def create_entity(description: MercedesMeSwitchEntityDescription, car: Car) -> MercedesMeSwitch | None:\n        \"\"\"Create a MercedesMeSwitch entity for the car based on the given description.\"\"\"\n        vin_masked = loghelper.Mask_VIN(car.finorvin)\n        try:\n            entity = MercedesMeSwitch(description, car.finorvin, coordinator)\n            LOGGER.debug(\"Created switch entity for VIN: '%s', feature: '%s'\", vin_masked, description.key)\n        except Exception:\n            LOGGER.error(\n                \"Error creating switch entity for VIN: '%s', feature: '%s'. Exception:\",\n                vin_masked,\n                description.key,\n                exc_info=True,\n            )\n            return None\n        else:\n            return entity\n\n    entities: list[MercedesMeSwitch] = [\n        entity\n        for car in coordinator.client.cars.values()  # Iterate over all cars\n        for description in SWITCH_DESCRIPTIONS  # Iterate over all feature descriptions\n        if check_capability(car, description)  # Check if the car supports the feature\n        and (entity := create_entity(description, car))  # Create the entity if possible\n    ]\n\n    async_add_entities(entities)\n"
  },
  {
    "path": "custom_components/mbapi2020/system_health.py",
    "content": "\"\"\"Provide info to system health.\"\"\"\n\nfrom __future__ import annotations\n\nfrom homeassistant.components import system_health\nfrom homeassistant.core import HomeAssistant, callback\nfrom homeassistant.loader import async_get_integration\n\nfrom .const import DOMAIN, REST_API_BASE\nfrom .coordinator import MBAPI2020DataUpdateCoordinator\n\n\n@callback\ndef async_register(hass: HomeAssistant, register: system_health.SystemHealthRegistration) -> None:\n    \"\"\"Register system health callbacks.\"\"\"\n    register.async_register_info(system_health_info)\n\n\nasync def system_health_info(hass: HomeAssistant):\n    \"\"\"Get info for the info page.\"\"\"\n\n    integration = await async_get_integration(hass, DOMAIN)\n\n    if DOMAIN in hass.data:\n        domain = hass.data[DOMAIN]\n        first_coordinator: MBAPI2020DataUpdateCoordinator = None\n        used_cars: int = 0\n\n        for key in iter(domain):\n            if isinstance(domain[key], MBAPI2020DataUpdateCoordinator):\n                coordinator = domain[key]\n                if not first_coordinator:\n                    first_coordinator = coordinator\n\n                if coordinator.client and coordinator.client.cars:\n                    used_cars += len(coordinator.client.cars)\n\n        if first_coordinator and first_coordinator.client and first_coordinator.client.websocket:\n            websocket_connection_state = str(first_coordinator.client.websocket.connection_state)\n        else:\n            websocket_connection_state = \"unknown\"\n\n        return {\n            \"api_endpoint_reachable\": system_health.async_check_can_reach_url(hass, REST_API_BASE),\n            \"websocket_connection_state\": websocket_connection_state,\n            \"cars_connected\": used_cars,\n            \"version\": integration.manifest.get(\"version\"),\n        }\n\n    return {\n        \"status\": \"Disabled/Deleted\",\n        \"version\": integration.manifest.get(\"version\"),\n    }\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/cs.json",
    "content": "{\n  \"config\": {\n    \"abort\": {\n      \"already_configured\": \"Komponenta je již nakonfigurována.\",\n      \"reauth_successful\": \"Opětovné ověření úspěšné! Probíhá načítání komponenty.\"\n    },\n    \"error\": {\n      \"cannot_connect\": \"cannot_connect\",\n      \"invalid_auth\": \"invalid_auth\",\n      \"unknown\": \"Neznámá chyba. Pro více informací zkontrolujte logy Home Assistant.\",\n      \"2fa_required\": \"Účty s dvoufaktorovým ověřením (2FA) nejsou podporovány.\",\n      \"legal_terms\": \"Nejprve musíte přijmout právní podmínky na webových stránkách Mercedes\"\n    },\n    \"step\": {\n      \"user\": {\n        \"data\": {\n          \"region\": \"Region\"\n        },\n        \"description\": \"Vyberte svůj region.\",\n        \"title\": \"Nastavení připojení Mercedes ME 2020\"\n      },\n      \"credentials\": {\n        \"data\": {\n          \"username\": \"MB uživatelské jméno (e-mailová adresa)\",\n          \"password\": \"Heslo\"\n        },\n        \"description\": \"Zadejte údaje svého účtu.\",\n        \"title\": \"Mercedes ME 2020 - Přihlášení\"\n      },\n      \"pin\": {\n        \"data\": {\n          \"password\": \"TAN (přijatý e-mailem nebo SMS)\"\n        },\n        \"description\": \"Zadejte TAN, který jste obdrželi e-mailem nebo SMS, pro dokončení ověření. Pokud jste TAN neobdrželi, zkontrolujte prosím svou e-mailovou schránku (včetně spamu) nebo SMS zprávy.\",\n        \"title\": \"Mercedes ME 2020 - TAN\"\n      }\n    }\n  },\n  \"issues\": {\n    \"restart_required\": {\n      \"fix_flow\": {\n        \"step\": {\n          \"confirm_restart\": {\n            \"description\": \"Pro dokončení aktualizace ověření je vyžadován restart Home Assistant. Kliknutím na Odeslat restartujte nyní.\",\n            \"title\": \"Vyžadován restart\"\n          }\n        }\n      },\n      \"title\": \"Vyžadován restart\"\n    }\n  },\n  \"options\": {\n    \"abort\": {\n      \"already_configured\": \"Komponenta je již nakonfigurována.\",\n      \"reauth_successful\": \"Opětovné ověření úspěšné! Probíhá znovunačítání komponenty.\"\n    },\n    \"step\": {\n      \"init\": {\n        \"data\": {\n          \"cap_check_disabled\": \"Zakázat kontrolu funkcí\",\n          \"enable_china_gcj_02\": \"Povolit překlad GCJ-02 (pouze Čína)\",\n          \"delete_auth_file\": \"Odstranit autentizační token. Vyžaduje restart Home Assistant po uložení.\",\n          \"excluded_cars\": \"Vyloučené VINy (oddělené čárkou)\",\n          \"pin\": \"Bezpečnostní PIN (vytvořený v mobilní aplikaci)\",\n          \"save_files\": \"POUZE PRO DEBUG: Povolit ukládání zpráv serveru do složky zpráv\",\n          \"overwrite_cap_precondnow\": \"Exp: Přepsat schopnost precondnow (nastavit na true)\"\n        },\n        \"description\": \"Nakonfigurujte své možnosti. Některé změny vyžadují restart Home Assistant.\",\n        \"title\": \"Možnosti Mercedes ME 2020\"\n      }\n    }\n  },\n  \"system_health\": {\n    \"info\": {\n      \"api_endpoint_reachable\": \"MB API dostupné\",\n      \"websocket_connection_state\": \"MB WS stav\",\n      \"cars_connected\": \"Připojené vozy\",\n      \"version\": \"Verze\"\n    }\n  },\n  \"services\": {\n    \"refresh_access_token\": {\n      \"name\": \"Obnovit přístupový token\",\n      \"description\": \"Obnovit přístupový token API\"\n    },\n    \"auxheat_configure\": {\n      \"name\": \"Konfigurace přídavného topení\",\n      \"description\": \"Příkaz pro nastavení přídavného topení. Je možné definovat tři časy během dne a vybrat jeden aktivní čas.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"time_selection\": {\n          \"name\": \"Výběr času\",\n          \"description\": \"Aktivovaný přednastavený čas přídavného topení (0=žádný_výběr, 1=čas_1, 2=čas_2, 3=čas_3)\"\n        },\n        \"time_1\": {\n          \"name\": \"time_1\",\n          \"description\": \"Denní doba v minutách po půlnoci. Např. platná hodnota pro 8 hodin ráno je 480. Rozsah hodnot 0-1439.\"\n        },\n        \"time_2\": {\n          \"name\": \"time_2\",\n          \"description\": \"Denní doba v minutách po půlnoci. Např. platná hodnota pro 8 hodin ráno je 480. Rozsah hodnot 0-1439.\"\n        },\n        \"time_3\": {\n          \"name\": \"time_3\",\n          \"description\": \"Denní doba v minutách po půlnoci. Např. platná hodnota pro 8 hodin ráno je 480. Rozsah hodnot 0-1439.\"\n        }\n      }\n    },\n    \"auxheat_start\": {\n      \"name\": \"Spustit přídavné topení\",\n      \"description\": \"Spustit přídavné topení vozu definovaného pomocí VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        }\n      }\n    },\n    \"auxheat_stop\": {\n      \"name\": \"Zastavit přídavné topení\",\n      \"description\": \"Zastavit přídavné topení vozu definovaného pomocí VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        }\n      }\n    },\n    \"battery_max_soc_configure\": {\n      \"name\": \"Konfigurace maximálního stavu nabití baterie\",\n      \"description\": \"Konfigurace maximální hodnoty pro stav nabití HV baterie vozu definovaného pomocí VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"max_soc\": {\n          \"name\": \"Maximální stav nabití\",\n          \"description\": \"Maximální hodnota pro stav nabití HV baterie (hodnota musí být mezi 50 (některé novější vozy jako 2025 CLA podporují 30) a 100 a dělitelná deseti)\"\n        },\n        \"charge_program\": {\n          \"name\": \"Nabíjecí program\",\n          \"description\": \"(Volitelné, Výchozí=0) Nabíjecí program ke změně (0=Výchozí, 2=Domov, 3=Práce) (nepoužívá se pro 2025 CLA)\"\n        }\n      }\n    },\n    \"charge_program_configure\": {\n      \"name\": \"Konfigurace nabíjecího programu\",\n      \"description\": \"Příkaz pro výběr nabíjecího programu.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"charge_program\": {\n          \"name\": \"Nabíjecí program\",\n          \"description\": \"Aktivovaný nabíjecí program (0=Výchozí, 2=Domov, 3=Práce)\"\n        },\n        \"max_soc\": {\n          \"name\": \"Maximální stav nabití\",\n          \"description\": \"Maximální hodnota pro stav nabití HV baterie (hodnota musí být mezi 50 a 100 a dělitelná deseti)\"\n        }\n      }\n    },\n    \"doors_unlock\": {\n      \"name\": \"Odemknout dveře\",\n      \"description\": \"Odemknutí vozu definovaného pomocí VIN. Vyžaduje nastavení PINu. Viz dialog s možnostmi integrace.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"pin\": {\n          \"name\": \"PIN\",\n          \"description\": \"Bezpečnostní PIN, vyžadován, pokud není uložen v nastavení.\"\n        }\n      }\n    },\n    \"doors_lock\": {\n      \"name\": \"Zamknout dveře\",\n      \"description\": \"Zamknutí vozu definovaného pomocí VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        }\n      }\n    },\n    \"download_images\": {\n      \"name\": \"Stáhnout obrázky\",\n      \"description\": \"Stáhnout obrázky do složky zdrojů komponenty pro vůz definovaný pomocí VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        }\n      }\n    },\n    \"engine_start\": {\n      \"name\": \"Spustit motor\",\n      \"description\": \"Spustit motor vozu definovaného pomocí VIN. Vyžaduje nastavení PINu. Viz dialog s možnostmi integrace.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"pin\": {\n          \"name\": \"PIN\",\n          \"description\": \"Bezpečnostní PIN, vyžadován, pokud není uložen v nastavení.\"\n        }\n      }\n    },\n    \"engine_stop\": {\n      \"name\": \"Zastavit motor\",\n      \"description\": \"Zastavit motor vozu definovaného pomocí VIN. Vyžaduje nastavení PINu. Viz dialog s možnostmi integrace.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        }\n      }\n    },\n    \"hv_battery_start_conditioning\": {\n      \"name\": \"Spustit kondicionování HV baterie\",\n      \"description\": \"Spustit kondicionování HV baterie vozu definovaného pomocí VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        }\n      }\n    },\n    \"hv_battery_stop_conditioning\": {\n      \"name\": \"Zastavit kondicionování HV baterie\",\n      \"description\": \"Zastavit kondicionování HV baterie vozu definovaného pomocí VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        }\n      }\n    },\n    \"preconditioning_configure_seats\": {\n      \"name\": \"Konfigurace předkondicionování sedadel\",\n      \"description\": \"Odeslat příkaz k předkondicionování sedadel do vozu definovaného podle VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"front_left\": {\n          \"name\": \"Přední levé\",\n          \"description\": \"Aktivovat, pokud by mělo být předkondicionováno přední levé sedadlo.\"\n        },\n        \"front_right\": {\n          \"name\": \"Přední pravé\",\n          \"description\": \"Aktivovat, pokud by mělo být předkondicionováno přední pravé sedadlo.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Zadní levé\",\n          \"description\": \"Aktivovat, pokud by mělo být předkondicionováno zadní levé sedadlo.\"\n        },\n        \"rear_right\": {\n          \"name\": \"Zadní pravé\",\n          \"description\": \"Aktivovat, pokud by mělo být předkondicionováno zadní pravé sedadlo.\"\n        }\n      }\n    },\n    \"preheat_start\": {\n      \"name\": \"Spustit předkondicionování\",\n      \"description\": \"Spustit předkondicionování vozu definovaného pomocí VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"type\": {\n          \"name\": \"Typ\",\n          \"description\": \"Metoda použitá pro zahájení procesu. 0=Nyní (Výchozí), 1=Okamžitě - Použijte Okamžitě v případě, že váš vůz nepodporuje Nyní.\"\n        }\n      }\n    },\n    \"preheat_start_departure_time\": {\n      \"name\": \"Spustit předkondicionování s časem odjezdu\",\n      \"description\": \"Spustit předkondicionování vozu definovaného pomocí VIN a zadaného času odjezdu.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"time\": {\n          \"name\": \"Čas\",\n          \"description\": \"Čas odjezdu v minutách po půlnoci. Např. platná hodnota pro 8 hodin ráno je 480. Rozsah hodnot 0-1439.\"\n        }\n      }\n    },\n    \"preheat_stop\": {\n      \"name\": \"Zastavit předkondicionování\",\n      \"description\": \"Zastavit předkondicionování vozu definovaného pomocí VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        }\n      }\n    },\n    \"preheat_stop_departure_time\": {\n      \"name\": \"Zastavit předkondicionování s časem odjezdu\",\n      \"description\": \"Zastavit předkondicionování s nastaveným časem odjezdu vozu definovaného pomocí VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        }\n      }\n    },\n    \"preconditioning_configure\": {\n      \"name\": \"Konfigurace předkondicionování odjezdu\",\n      \"description\": \"Konfigurace režimu času odjezdu předkondicionování. Použijte režim 0 (Deaktivováno) pro zrušení naplánovaného předkondicionování.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"departure_time_mode\": {\n          \"name\": \"Režim času odjezdu\",\n          \"description\": \"0=Deaktivováno, 1=Jednorázový odjezd, 2=Týdenní odjezd\"\n        },\n        \"departure_time\": {\n          \"name\": \"Čas odjezdu\",\n          \"description\": \"Čas odjezdu v minutách po půlnoci (0-1439). Použije se pouze při režimu > 0.\"\n        }\n      }\n    },\n    \"sigpos_start\": {\n      \"name\": \"Spustit světelnou signalizaci\",\n      \"description\": \"Spustit světelnou signalizaci vozu definovaného pomocí VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        }\n      }\n    },\n    \"sunroof_open\": {\n      \"name\": \"Otevřít střešní okno\",\n      \"description\": \"Otevřít střešní okno vozu definovaného pomocí VIN. Vyžaduje nastavení PINu. Viz dialog s možnostmi integrace.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"pin\": {\n          \"name\": \"PIN\",\n          \"description\": \"Bezpečnostní PIN, vyžadován, pokud není uložen v nastavení.\"\n        }\n      }\n    },\n    \"sunroof_tilt\": {\n      \"name\": \"Naklonit střešní okno\",\n      \"description\": \"Naklonit střešní okno vozu definovaného pomocí VIN. Vyžaduje nastavení PINu. Viz dialog s možnostmi integrace.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"pin\": {\n          \"name\": \"PIN\",\n          \"description\": \"Bezpečnostní PIN, vyžadován, pokud není uložen v nastavení.\"\n        }\n      }\n    },\n    \"sunroof_close\": {\n      \"name\": \"Zavřít střešní okno\",\n      \"description\": \"Zavřít střešní okno vozu definovaného pomocí VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        }\n      }\n    },\n    \"temperature_configure\": {\n      \"name\": \"Nastavení cílové teploty (předkondicionování/přídavné topení)\",\n      \"description\": \"Nakonfigurujte cílové teploty pro předkondicionování/přídavné topení pro zóny ve voze definovaném podle VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"front_left\": {\n          \"name\": \"Přední levé\",\n          \"description\": \"Cílová teplota pro zónu přední levé ve stupních CELSIA.\"\n        },\n        \"front_right\": {\n          \"name\": \"Přední pravé\",\n          \"description\": \"Cílová teplota pro zónu přední pravé ve stupních CELSIA.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Zadní levé\",\n          \"description\": \"Cílová teplota pro zónu zadní levé ve stupních CELSIA. (pokud je k dispozici)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Zadní pravé\",\n          \"description\": \"Cílová teplota pro zónu zadní pravé ve stupních CELSIA. (pokud je k dispozici)\"\n        }\n      }\n    },\n    \"windows_open\": {\n      \"name\": \"Otevřít okna\",\n      \"description\": \"Otevřít okna vozu definovaného pomocí VIN. Vyžaduje nastavení PINu. Viz dialog s možnostmi integrace.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"pin\": {\n          \"name\": \"PIN\",\n          \"description\": \"Bezpečnostní PIN, vyžadován, pokud není uložen v nastavení.\"\n        }\n      }\n    },\n    \"windows_close\": {\n      \"name\": \"Zavřít okna\",\n      \"description\": \"Zavřít okna vozu definovaného pomocí VIN. Vyžaduje nastavení PINu. Viz dialog s možnostmi integrace.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        }\n      }\n    },\n    \"windows_move\": {\n      \"name\": \"Pohyb oken\",\n      \"description\": \"Přesunout okna vozu definovaného pomocí VIN na novou pozici. Vyžaduje nastavení PINu. Viz dialog s možnostmi integrace.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"pin\": {\n          \"name\": \"PIN\",\n          \"description\": \"Bezpečnostní PIN, vyžadován, pokud není uložen v nastavení.\"\n        },\n        \"front_left\": {\n          \"name\": \"Přední levé\",\n          \"description\": \"Nová pozice předního levého okna (0=zavřené, 10=ventilace, 100=otevřené)\"\n        },\n        \"front_right\": {\n          \"name\": \"Přední pravé\",\n          \"description\": \"Nová pozice předního pravého okna (0=zavřené, 10=ventilace, 100=otevřené)\"\n        },\n        \"rear_left\": {\n          \"name\": \"Zadní levé\",\n          \"description\": \"Nová pozice zadního levého okna (0=zavřené, 10=ventilace, 100=otevřené)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Zadní pravé\",\n          \"description\": \"Nová pozice zadního pravého okna (0=zavřené, 10=ventilace, 100=otevřené)\"\n        }\n      }\n    },\n    \"send_route\": {\n      \"name\": \"Odeslat trasu\",\n      \"description\": \"Poslat trasu do vozu. (Pouze jedna poloha)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"title\": {\n          \"name\": \"Název\",\n          \"description\": \"Název trasy\"\n        },\n        \"latitude\": {\n          \"name\": \"Zeměpisná šířka\",\n          \"description\": \"Zeměpisná šířka místa\"\n        },\n        \"longitude\": {\n          \"name\": \"Zeměpisná délka\",\n          \"description\": \"Zeměpisná délka místa\"\n        },\n        \"city\": {\n          \"name\": \"Město\",\n          \"description\": \"Název města\"\n        },\n        \"postcode\": {\n          \"name\": \"PSČ\",\n          \"description\": \"PSČ místa\"\n        },\n        \"street\": {\n          \"name\": \"Ulice\",\n          \"description\": \"Název ulice\"\n        }\n      }\n    },\n    \"charging_break_clocktimer_configure\": {\n      \"name\": \"Nastavení časovače přestávky nabíjení\",\n      \"description\": \"Nastavte přestávky při nabíjení (pouze AC). Tímto přepíšete celé nastavení pro všechny časové sloty ve vašem voze.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN vozu\"\n        },\n        \"status_timer_1\": {\n          \"name\": \"Stav (Časovač 1)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_1\": {\n          \"name\": \"Čas začátku (Časovač 1)\",\n          \"description\": \"Čas začátku okna přestávky nabíjení (Časovač 1)\"\n        },\n        \"stoptime_timer_1\": {\n          \"name\": \"Čas ukončení (Časovač 1)\",\n          \"description\": \"Čas ukončení okna přestávky nabíjení (Časovač 1)\"\n        },\n        \"status_timer_2\": {\n          \"name\": \"Stav (Časovač 2)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_2\": {\n          \"name\": \"Čas začátku (Časovač 2)\",\n          \"description\": \"Čas začátku okna přestávky nabíjení (Časovač 2)\"\n        },\n        \"stoptime_timer_2\": {\n          \"name\": \"Čas ukončení (Časovač 2)\",\n          \"description\": \"Čas ukončení okna přestávky nabíjení (Časovač 2)\"\n        },\n        \"status_timer_3\": {\n          \"name\": \"Stav (Časovač 3)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_3\": {\n          \"name\": \"Čas začátku (Časovač 3)\",\n          \"description\": \"Čas začátku okna přestávky nabíjení (Časovač 3)\"\n        },\n        \"stoptime_timer_3\": {\n          \"name\": \"Čas ukončení (Časovač 3)\",\n          \"description\": \"Čas ukončení okna přestávky nabíjení (Časovač 3)\"\n        },\n        \"status_timer_4\": {\n          \"name\": \"Stav (Časovač 4)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_4\": {\n          \"name\": \"Čas začátku (Časovač 4)\",\n          \"description\": \"Čas začátku okna přestávky nabíjení (Časovač 4)\"\n        },\n        \"stoptime_timer_4\": {\n          \"name\": \"Čas ukončení (Časovač 4)\",\n          \"description\": \"Čas ukončení okna přestávky nabíjení (Časovač 4)\"\n        }\n      }\n    }\n  },\n  \"entity\": {\n    \"binary_sensor\": {\n      \"chargingactive\": {\n        \"name\": \"Nabíjení aktivní\"\n      }\n    },\n    \"sensor\": {\n      \"chargingpowerecolimit\": {\n        \"name\": \"Limit nabíjecího výkonu\"\n      },\n      \"auxheatstatus\": {\n        \"state\": {\n          \"0\": \"Neaktivní\",\n          \"1\": \"Normální vytápění\",\n          \"2\": \"Normální větrání\",\n          \"3\": \"Manuální vytápění\",\n          \"4\": \"Dodatečné vytápění\",\n          \"5\": \"Dodatečné větrání\",\n          \"6\": \"Automatické vytápění\"\n        }\n      },\n      \"chargeflapacstatus\": {\n        \"state\": {\n          \"0\": \"Otevřené\",\n          \"1\": \"Zavřené\",\n          \"2\": \"Klapka stisknuta\",\n          \"3\": \"Neznámé\"\n        }\n      },\n      \"chargeflapdcstatus\": {\n        \"state\": {\n          \"0\": \"Otevřené\",\n          \"1\": \"Zavřené\",\n          \"2\": \"Klapka stisknuta\",\n          \"3\": \"Neznámé\"\n        }\n      },\n      \"chargingstatus\": {\n        \"state\": {\n          \"0\": \"Nabíjení\",\n          \"1\": \"Nabíjení ukončeno\",\n          \"2\": \"Přestávka nabíjení\",\n          \"3\": \"Odpojeno\",\n          \"4\": \"Chyba\",\n          \"5\": \"Pomalé\",\n          \"6\": \"Rychlé\",\n          \"7\": \"Vybíjení\",\n          \"8\": \"Nenabíjí se\",\n          \"9\": \"Pomalé nabíjení po dosažení cíle\",\n          \"10\": \"Nabíjení po dosažení cíle\",\n          \"11\": \"Rychlé nabíjení po dosažení cíle\",\n          \"12\": \"Připojeno\",\n          \"13\": \"AC nabíjení\",\n          \"14\": \"DC nabíjení\",\n          \"15\": \"Kalibrace baterie aktivní\",\n          \"16\": \"Neznámé\"\n        }\n      },\n      \"departuretimemode\": {\n        \"state\": {\n          \"0\": \"Deaktivováno\",\n          \"1\": \"Denně\",\n          \"2\": \"Týdně\"\n        }\n      },\n      \"ignitionstate\": {\n        \"state\": {\n          \"0\": \"Zamknuté\",\n          \"1\": \"Vypnuté\",\n          \"2\": \"Příslušenství\",\n          \"4\": \"Zapnuté\",\n          \"5\": \"Start\"\n        }\n      },\n      \"interiorprotectionsensorstatus\": {\n        \"state\": {\n          \"0\": \"Neaktivní\",\n          \"1\": \"Neaktivní\",\n          \"2\": \"Aktivní\"\n        },\n        \"state_attributes\": {}\n      },\n      \"lock\": {\n        \"state\": {\n          \"0\": \"Odemčeno\",\n          \"1\": \"Zamčeno interně\",\n          \"2\": \"Zamčeno\",\n          \"3\": \"Částečně odemčeno\",\n          \"4\": \"Neznámé\"\n        },\n        \"state_attributes\": {\n          \"decklidstatus\": {\n            \"name\": \"Zavazadlový prostor\",\n            \"state\": {\n              \"false\": \"zavřené\",\n              \"true\": \"otevřené\"\n            }\n          },\n          \"doorstatusfrontleft\": {\n            \"name\": \"Přední levé dveře\",\n            \"state\": {\n              \"false\": \"zavřené\",\n              \"true\": \"otevřené\"\n            }\n          },\n          \"doorstatusfrontright\": {\n            \"name\": \"Přední pravé dveře\",\n            \"state\": {\n              \"false\": \"zavřené\",\n              \"true\": \"otevřené\"\n            }\n          },\n          \"doorstatusrearleft\": {\n            \"name\": \"Zadní levé dveře\",\n            \"state\": {\n              \"false\": \"zavřené\",\n              \"true\": \"otevřené\"\n            }\n          },\n          \"doorstatusrearright\": {\n            \"name\": \"Zadní pravé dveře\",\n            \"state\": {\n              \"false\": \"zavřené\",\n              \"true\": \"otevřené\"\n            }\n          },\n          \"doorlockstatusfrontleft\": {\n            \"name\": \"Zámek předních levých dveří\",\n            \"state\": {\n              \"false\": \"zamčeno\",\n              \"true\": \"odemčeno\"\n            }\n          },\n          \"doorlockstatusfrontright\": {\n            \"name\": \"Zámek předních pravých dveří\",\n            \"state\": {\n              \"false\": \"zamčeno\",\n              \"true\": \"odemčeno\"\n            }\n          },\n          \"doorlockstatusrearleft\": {\n            \"name\": \"Zámek zadních levých dveří\",\n            \"state\": {\n              \"false\": \"zamčeno\",\n              \"true\": \"odemčeno\"\n            }\n          },\n          \"doorlockstatusrearright\": {\n            \"name\": \"Zámek zadních pravých dveří\",\n            \"state\": {\n              \"false\": \"zamčeno\",\n              \"true\": \"odemčeno\"\n            }\n          },\n          \"doorlockstatusgas\": {\n            \"name\": \"Zámek palivové nádrže\",\n            \"state\": {\n              \"false\": \"zamčeno\",\n              \"true\": \"odemčeno\"\n            }\n          },\n          \"enginehoodstatus\": {\n            \"name\": \"Kapota\",\n            \"state\": {\n              \"false\": \"zavřené\",\n              \"true\": \"otevřené\"\n            }\n          },\n          \"doorstatusoverall\": {\n            \"name\": \"Celkový stav dveří\",\n            \"state\": {\n              \"0\": \"otevřené\",\n              \"1\": \"zavřené\",\n              \"2\": \"neexistující\",\n              \"3\": \"neznámé\"\n            }\n          },\n          \"sunroofstatus\": {\n            \"name\": \"Stav střešního okna\",\n            \"state\": {\n              \"0\": \"zavřené\",\n              \"1\": \"otevřené\",\n              \"2\": \"ventilace otevřená\",\n              \"3\": \"v pohybu\",\n              \"4\": \"protihluková pozice\",\n              \"5\": \"posuvné střední\",\n              \"6\": \"zvedání střední\",\n              \"7\": \"otevírání\",\n              \"8\": \"zavírání\",\n              \"9\": \"zvedání protihlukové\",\n              \"10\": \"střední poloha\",\n              \"11\": \"zvedání otevírání\",\n              \"12\": \"zvedání zavírání\"\n            }\n          }\n        }\n      },\n      \"sunroofstatus\": {\n        \"state\": {\n          \"0\": \"Zavřeno\",\n          \"1\": \"Otevřeno\",\n          \"2\": \"Otevřená ventilace\",\n          \"3\": \"V pohybu\",\n          \"4\": \"Protihluková pozice\",\n          \"5\": \"Střední posuv\",\n          \"6\": \"Střední zvedání\",\n          \"7\": \"Otevírání\",\n          \"8\": \"Zavírání\",\n          \"9\": \"Zvednutí protihlukové\",\n          \"10\": \"Střední poloha\",\n          \"11\": \"Otevírání ventilace\",\n          \"12\": \"Zavírání ventilace\"\n        },\n        \"state_attributes\": {}\n      },\n      \"starterbatterystate\": {\n        \"state\": {\n          \"0\": \"Zelená\",\n          \"1\": \"Žlutá\",\n          \"2\": \"Červená\"\n        }\n      },\n      \"tirewarningsrdk\": {\n        \"state\": {\n          \"0\": \"Žádné varování\",\n          \"1\": \"Mírné varování\",\n          \"2\": \"Nízký tlak\",\n          \"3\": \"Defekt\"\n        }\n      },\n      \"selectedchargeprogram\": {\n        \"state\": {\n          \"0\": \"Standardní\",\n          \"2\": \"Domov\",\n          \"3\": \"Práce\",\n          \"4\": \"Nepodporováno\"\n        }\n      }\n    },\n    \"switch\": {\n      \"auxheat\": {\n        \"name\": \"Přídavné topení\"\n      },\n      \"precond\": {\n        \"name\": \"Předkondicionování\"\n      }\n    },\n    \"button\": {\n      \"btn_preheat_start_now\": {\n        \"name\": \"Spustit předkondicionování\"\n      },\n      \"btn_preheat_stop_now\": {\n        \"name\": \"Zastavit předkondicionování\"\n      },\n      \"btn_sigpos_start_now\": {\n        \"name\": \"Blikat světly\"\n      }\n    }\n  },\n  \"selector\": {\n    \"charge_program\": {\n      \"options\": {\n        \"0\": \"Výchozí\",\n        \"2\": \"Domov\",\n        \"3\": \"Práce\"\n      }\n    },\n    \"charging_break_clocktimer_configure_action\": {\n      \"options\": {\n        \"notset\": \"Nenastaveno\",\n        \"active\": \"Aktivní\",\n        \"inactive\": \"Neaktivní\"\n      }\n    },\n    \"temperature_configure\": {\n      \"options\": {\n        \"0\": \"Nízká\",\n        \"30\": \"Vysoká\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/da.json",
    "content": "{\n  \"config\": {\n    \"abort\": {\n      \"already_configured\": \"Komponenten er allerede konfigureret.\",\n      \"reauth_successful\": \"Genautentificering lykkedes! Komponent genindlæses.\"\n    },\n    \"error\": {\n      \"cannot_connect\": \"cannot_connect\",\n      \"invalid_auth\": \"invalid_auth\",\n      \"unknown\": \"Ukendt fejl. Kontroller venligst Home Assistant-loggen for mere information.\",\n      \"2fa_required\": \"Tofaktorautentificering (2FA)-konti understøttes ikke.\",\n      \"legal_terms\": \"Du skal først acceptere de juridiske vilkår på Mercedes' hjemmeside\"\n    },\n    \"step\": {\n      \"user\": {\n        \"data\": {\n          \"region\": \"Region\"\n        },\n        \"description\": \"Vælg din region.\",\n        \"title\": \"Opsæt Mercedes ME 2020-forbindelsen\"\n      },\n      \"credentials\": {\n        \"data\": {\n          \"username\": \"MB brugernavn (e-mailadresse)\",\n          \"password\": \"Adgangskode\"\n        },\n        \"description\": \"Indtast dine kontooplysninger.\",\n        \"title\": \"Mercedes ME 2020 - Login\"\n      },\n      \"pin\": {\n        \"data\": {\n          \"password\": \"TAN (modtaget via e-mail eller SMS)\"\n        },\n        \"description\": \"Indtast den TAN-kode, du har modtaget via e-mail eller SMS, for at fuldføre autentificeringen. Hvis du ikke har modtaget en TAN-kode, skal du kontrollere din e-mail-indbakke (og spam-mappen) eller dine SMS-beskeder.\",\n        \"title\": \"Mercedes ME 2020 - TAN\"\n      }\n    }\n  },\n  \"issues\": {\n    \"restart_required\": {\n      \"fix_flow\": {\n        \"step\": {\n          \"confirm_restart\": {\n            \"description\": \"Genstart af Home Assistant er påkrævet for at fuldføre autentificeringsopdateringen. Klik på send for at genstarte nu.\",\n            \"title\": \"Genstart påkrævet\"\n          }\n        }\n      },\n      \"title\": \"Genstart påkrævet\"\n    }\n  },\n  \"options\": {\n    \"abort\": {\n      \"already_configured\": \"Komponenten er allerede konfigureret.\",\n      \"reauth_successful\": \"Genautentificering lykkedes! Komponent genindlæses.\"\n    },\n    \"step\": {\n      \"init\": {\n        \"data\": {\n          \"cap_check_disabled\": \"Deaktiver kapabilitetskontrol\",\n          \"enable_china_gcj_02\": \"Aktiver GCJ-02-oversættelse (kun Kina)\",\n          \"delete_auth_file\": \"Slet autentificeringstoken nu. Kræver en genstart af Home Assistant efter gem.\",\n          \"excluded_cars\": \"Ekskluderede VIN-numre (kommasepareret)\",\n          \"pin\": \"Sikkerheds-PIN (skal oprettes i mobilappen)\",\n          \"save_files\": \"KUN FEJLSØGNING: Aktiver gemning af serverbeskeder i meddelelsesmappen\",\n          \"overwrite_cap_precondnow\": \"Eks: Overskriv kapabilitet precondnow (sæt til sand)\"\n        },\n        \"description\": \"Konfigurer dine indstillinger. Nogle ændringer kræver en genstart af Home Assistant.\",\n        \"title\": \"Mercedes ME 2020 Indstillinger\"\n      }\n    }\n  },\n  \"system_health\": {\n    \"info\": {\n      \"api_endpoint_reachable\": \"MB API tilgængelig\",\n      \"websocket_connection_state\": \"MB WS-tilstand\",\n      \"cars_connected\": \"Tilsluttede biler\",\n      \"version\": \"Version\"\n    }\n  },\n  \"services\": {\n    \"refresh_access_token\": {\n      \"name\": \"Opdater adgangstoken\",\n      \"description\": \"Opdater API-adgangstoken\"\n    },\n    \"auxheat_configure\": {\n      \"name\": \"Konfigurer ekstravarme\",\n      \"description\": \"Kommando til konfiguration af ekstravarmen. Det er muligt at definere tre tidspunkter og vælge et aktivt tidspunkt.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"time_selection\": {\n          \"name\": \"Tidsvalg\",\n          \"description\": \"Det aktiverede forudindstillede tidspunkt for ekstravarmen (0=intet_valg, 1=tid_1, 2=tid_2, 3=tid_3)\"\n        },\n        \"time_1\": {\n          \"name\": \"time_1\",\n          \"description\": \"Tidspunkt i minutter efter midnat. F.eks. er 480 en gyldig værdi for kl. 08.00. Værdiområdet er 0 til 1439.\"\n        },\n        \"time_2\": {\n          \"name\": \"time_2\",\n          \"description\": \"Tidspunkt i minutter efter midnat. F.eks. er 480 en gyldig værdi for kl. 08.00. Værdiområdet er 0 til 1439.\"\n        },\n        \"time_3\": {\n          \"name\": \"time_3\",\n          \"description\": \"Tidspunkt i minutter efter midnat. F.eks. er 480 en gyldig værdi for kl. 08.00. Værdiområdet er 0 til 1439.\"\n        }\n      }\n    },\n    \"auxheat_start\": {\n      \"name\": \"Start ekstravarme\",\n      \"description\": \"Start ekstravarmen for en bil defineret af et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"auxheat_stop\": {\n      \"name\": \"Stop ekstravarme\",\n      \"description\": \"Stop ekstravarmen for en bil defineret af et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"battery_max_soc_configure\": {\n      \"name\": \"Konfigurer batteriets maksimale ladeniveau (SoC)\",\n      \"description\": \"Konfigurer den maksimale værdi for ladeniveauet (SoC) i højspændingsbatteriet for en bil defineret af et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"max_soc\": {\n          \"name\": \"Maks SoC\",\n          \"description\": \"Den maksimale værdi for højspændingsbatteriets ladeniveau (SoC). Værdien skal være mellem 50 (nogle nye biler som 2025 CLA understøtter 30) og 100 og delelig med ti.\"\n        },\n        \"charge_program\": {\n          \"name\": \"Ladeprogram\",\n          \"description\": \"(Valgfri, Standard=0) Ladeprogram der skal ændres (0=Standard, 2=Hjem, 3=Arbejde) (bruges ikke til 2025 CLA)\"\n        }\n      }\n    },\n    \"charge_program_configure\": {\n      \"name\": \"Konfigurer ladeprogram\",\n      \"description\": \"Kommando til at vælge ladeprogrammet.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"charge_program\": {\n          \"name\": \"Ladeprogram\",\n          \"description\": \"Det aktiverede ladeprogram (0=Standard, 2=Hjem, 3=Arbejde)\"\n        },\n        \"max_soc\": {\n          \"name\": \"Maks SoC\",\n          \"description\": \"Den maksimale værdi for højspændingsbatteriets ladeniveau (SoC). Værdien skal være mellem 50 og 100 og delelig med ti.\"\n        }\n      }\n    },\n    \"doors_unlock\": {\n      \"name\": \"Lås døre op\",\n      \"description\": \"Lås en bil op defineret af et VIN-nummer. PIN-kode opsætning påkrævet. Se indstillingsdialogen for integrationen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kode\",\n          \"description\": \"Sikkerhedskode (PIN), påkrævet hvis den ikke er gemt i indstillingerne.\"\n        }\n      }\n    },\n    \"doors_lock\": {\n      \"name\": \"Lås døre\",\n      \"description\": \"Lås en bil defineret af et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"download_images\": {\n      \"name\": \"Download billeder\",\n      \"description\": \"Downloader app-billeder til komponentens ressourcemappe for en bil defineret af et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"engine_start\": {\n      \"name\": \"Start motor\",\n      \"description\": \"Start motoren på en bil defineret af et VIN-nummer. PIN-kode opsætning påkrævet. Se indstillingsdialogen for integrationen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kode\",\n          \"description\": \"Sikkerhedskode (PIN), påkrævet hvis den ikke er gemt i indstillingerne.\"\n        }\n      }\n    },\n    \"engine_stop\": {\n      \"name\": \"Stop motor\",\n      \"description\": \"Stop motoren på en bil defineret af et VIN-nummer. PIN-kode opsætning påkrævet. Se indstillingsdialogen for integrationen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"hv_battery_start_conditioning\": {\n      \"name\": \"Start konditionering af højspændingsbatteri\",\n      \"description\": \"Start konditioneringen af højspændingsbatteriet for en bil defineret af et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"hv_battery_stop_conditioning\": {\n      \"name\": \"Stop konditionering af højspændingsbatteri\",\n      \"description\": \"Stop konditioneringen af højspændingsbatteriet for en bil defineret af et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"preconditioning_configure_seats\": {\n      \"name\": \"Konfigurer sæder til forklimatisering\",\n      \"description\": \"Send en konfigurationskommando for sædeforklimatisering til en bil defineret af et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"front_left\": {\n          \"name\": \"Venstre for\",\n          \"description\": \"Aktiver hvis det venstre forsæde skal forklimatiseres.\"\n        },\n        \"front_right\": {\n          \"name\": \"Højre for\",\n          \"description\": \"Aktiver hvis det højre forsæde skal forklimatiseres.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Venstre bag\",\n          \"description\": \"Aktiver hvis det venstre bagsæde skal forklimatiseres.\"\n        },\n        \"rear_right\": {\n          \"name\": \"Højre bag\",\n          \"description\": \"Aktiver hvis det højre bagsæde skal forklimatiseres.\"\n        }\n      }\n    },\n    \"preheat_start\": {\n      \"name\": \"Start forklimatisering\",\n      \"description\": \"Start forklimatiseringen for en bil defineret af et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"type\": {\n          \"name\": \"Type\",\n          \"description\": \"Metode der bruges til at starte processen. 0=Nu (Standard), 1=Øjeblikkelig - Brug Øjeblikkelig hvis din bil ikke understøtter Nu.\"\n        }\n      }\n    },\n    \"preheat_start_departure_time\": {\n      \"name\": \"Start forklimatisering med afgangstid\",\n      \"description\": \"Start forklimatiseringen for en bil defineret af et VIN-nummer og en given afgangstid.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"time\": {\n          \"name\": \"Tid\",\n          \"description\": \"Afgangstid i minutter efter midnat. F.eks. er 480 en gyldig værdi for kl. 08.00. Værdiområdet er 0 til 1439.\"\n        }\n      }\n    },\n    \"preheat_stop\": {\n      \"name\": \"Stop forklimatisering\",\n      \"description\": \"Stop forklimatiseringen for en bil defineret af et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"preheat_stop_departure_time\": {\n      \"name\": \"Stop forklimatisering for afgangstid\",\n      \"description\": \"Stop den konfigurerede afgangstid-forklimatisering for en bil defineret af et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"preconditioning_configure\": {\n      \"name\": \"Konfigurer forklimatisering ved afgang\",\n      \"description\": \"Konfigurer forklimatiseringstilstand ved afgang. Brug tilstand 0 (Deaktiveret) for at annullere planlagt afgangsforklimatisering.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"departure_time_mode\": {\n          \"name\": \"Afgangstidstilstand\",\n          \"description\": \"0=Deaktiveret, 1=Enkelt afgang, 2=Ugentlig afgang\"\n        },\n        \"departure_time\": {\n          \"name\": \"Afgangstid\",\n          \"description\": \"Afgangstid i minutter efter midnat (0-1439). Bruges kun når tilstand > 0.\"\n        }\n      }\n    },\n    \"sigpos_start\": {\n      \"name\": \"Start signalposition\",\n      \"description\": \"Start lyssignalering for en bil defineret af et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"sunroof_open\": {\n      \"name\": \"Åbn soltag\",\n      \"description\": \"Åbn soltaget på en bil defineret af et VIN-nummer. PIN-kode opsætning påkrævet. Se indstillingsdialogen for integrationen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kode\",\n          \"description\": \"Sikkerhedskode (PIN), påkrævet hvis den ikke er gemt i indstillingerne.\"\n        }\n      }\n    },\n    \"sunroof_tilt\": {\n      \"name\": \"Vip soltag\",\n      \"description\": \"Vip soltaget på en bil defineret af et VIN-nummer. PIN-kode opsætning påkrævet. Se indstillingsdialogen for integrationen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kode\",\n          \"description\": \"Sikkerhedskode (PIN), påkrævet hvis den ikke er gemt i indstillingerne.\"\n        }\n      }\n    },\n    \"sunroof_close\": {\n      \"name\": \"Luk soltag\",\n      \"description\": \"Luk soltaget på en bil defineret af et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"temperature_configure\": {\n      \"name\": \"Konfigurer måltemperatur (forklimatisering/ekstravarme)\",\n      \"description\": \"Konfigurer måltemperaturer for forklimatisering/ekstravarme for zoner i en bil defineret af et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"front_left\": {\n          \"name\": \"Venstre for\",\n          \"description\": \"Måltemperatur for zonen venstre for i CELSIUS.\"\n        },\n        \"front_right\": {\n          \"name\": \"Højre for\",\n          \"description\": \"Måltemperatur for zonen højre for i CELSIUS.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Venstre bag\",\n          \"description\": \"Måltemperatur for zonen venstre bag i CELSIUS. (hvis tilgængelig)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Højre bag\",\n          \"description\": \"Måltemperatur for zonen højre bag i CELSIUS. (hvis tilgængelig)\"\n        }\n      }\n    },\n    \"windows_open\": {\n      \"name\": \"Åbn vinduer\",\n      \"description\": \"Åbn vinduerne på en bil defineret af et VIN-nummer. PIN-kode opsætning påkrævet. Se indstillingsdialogen for integrationen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kode\",\n          \"description\": \"Sikkerhedskode (PIN), påkrævet hvis den ikke er gemt i indstillingerne.\"\n        }\n      }\n    },\n    \"windows_close\": {\n      \"name\": \"Luk vinduer\",\n      \"description\": \"Luk vinduerne på en bil defineret af et VIN-nummer. PIN-kode opsætning påkrævet. Se indstillingsdialogen for integrationen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"windows_move\": {\n      \"name\": \"Flyt vinduer\",\n      \"description\": \"Flyt vinduerne på en bil defineret af et VIN-nummer til en ny position. PIN-kode opsætning påkrævet. Se indstillingsdialogen for integrationen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kode\",\n          \"description\": \"Sikkerhedskode (PIN), påkrævet hvis den ikke er gemt i indstillingerne.\"\n        },\n        \"front_left\": {\n          \"name\": \"Venstre for\",\n          \"description\": \"Den nye position for det venstre forvindue (0=lukket, 10=udluftning, 100=åbent)\"\n        },\n        \"front_right\": {\n          \"name\": \"Højre for\",\n          \"description\": \"Den nye position for det højre forvindue (0=lukket, 10=udluftning, 100=åbent)\"\n        },\n        \"rear_left\": {\n          \"name\": \"Venstre bag\",\n          \"description\": \"Den nye position for det venstre bagvindue (0=lukket, 10=udluftning, 100=åbent)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Højre bag\",\n          \"description\": \"Den nye position for det højre bagvindue (0=lukket, 10=udluftning, 100=åbent)\"\n        }\n      }\n    },\n    \"send_route\": {\n      \"name\": \"Send rute\",\n      \"description\": \"Sender en rute til bilen. (Kun enkelt placering)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"title\": {\n          \"name\": \"Titel\",\n          \"description\": \"Rutens titel\"\n        },\n        \"latitude\": {\n          \"name\": \"Breddegrad\",\n          \"description\": \"Placeringens breddegrad\"\n        },\n        \"longitude\": {\n          \"name\": \"Længdegrad\",\n          \"description\": \"Placeringens længdegrad\"\n        },\n        \"city\": {\n          \"name\": \"By\",\n          \"description\": \"Placeringens bynavn\"\n        },\n        \"postcode\": {\n          \"name\": \"Postnummer\",\n          \"description\": \"Placeringens postnummer\"\n        },\n        \"street\": {\n          \"name\": \"Gade\",\n          \"description\": \"Placeringens gadenavn\"\n        }\n      }\n    },\n    \"charging_break_clocktimer_configure\": {\n      \"name\": \"Konfigurer tidsstyring for ladepause\",\n      \"description\": \"Konfigurer ladepauser (kun AC). Dette vil overskrive hele konfigurationen for alle pladser i din bil.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"status_timer_1\": {\n          \"name\": \"Status (Timer 1)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_1\": {\n          \"name\": \"Starttid (Timer 1)\",\n          \"description\": \"Starttid for ladepausevinduet (Timer 1)\"\n        },\n        \"stoptime_timer_1\": {\n          \"name\": \"Sluttid (Timer 1)\",\n          \"description\": \"Sluttid for ladepausevinduet (Timer 1)\"\n        },\n        \"status_timer_2\": {\n          \"name\": \"Status (Timer 2)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_2\": {\n          \"name\": \"Starttid (Timer 2)\",\n          \"description\": \"Starttid for ladepausevinduet (Timer 2)\"\n        },\n        \"stoptime_timer_2\": {\n          \"name\": \"Sluttid (Timer 2)\",\n          \"description\": \"Sluttid for ladepausevinduet (Timer 2)\"\n        },\n        \"status_timer_3\": {\n          \"name\": \"Status (Timer 3)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_3\": {\n          \"name\": \"Starttid (Timer 3)\",\n          \"description\": \"Starttid for ladepausevinduet (Timer 3)\"\n        },\n        \"stoptime_timer_3\": {\n          \"name\": \"Sluttid (Timer 3)\",\n          \"description\": \"Sluttid for ladepausevinduet (Timer 3)\"\n        },\n        \"status_timer_4\": {\n          \"name\": \"Status (Timer 4)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_4\": {\n          \"name\": \"Starttid (Timer 4)\",\n          \"description\": \"Starttid for ladepausevinduet (Timer 4)\"\n        },\n        \"stoptime_timer_4\": {\n          \"name\": \"Sluttid (Timer 4)\",\n          \"description\": \"Sluttid for ladepausevinduet (Timer 4)\"\n        }\n      }\n    }\n  },\n  \"entity\": {\n    \"binary_sensor\": {\n      \"chargingactive\": {\n        \"name\": \"Opladning aktiv\"\n      }\n    },\n    \"sensor\": {\n      \"chargingpowerecolimit\": {\n        \"name\": \"Ladeeffektgrænse\"\n      },\n      \"auxheatstatus\": {\n        \"state\": {\n          \"0\": \"Inaktiv\",\n          \"1\": \"Normal opvarmning\",\n          \"2\": \"Normal ventilation\",\n          \"3\": \"Manuel opvarmning\",\n          \"4\": \"Efteropvarmning\",\n          \"5\": \"Efterventilation\",\n          \"6\": \"Automatisk opvarmning\"\n        }\n      },\n      \"chargeflapacstatus\": {\n        \"state\": {\n          \"0\": \"Åben\",\n          \"1\": \"Lukket\",\n          \"2\": \"Klap trykket\",\n          \"3\": \"Ukendt\"\n        }\n      },\n      \"chargeflapdcstatus\": {\n        \"state\": {\n          \"0\": \"Åben\",\n          \"1\": \"Lukket\",\n          \"2\": \"Klap trykket\",\n          \"3\": \"Ukendt\"\n        }\n      },\n      \"chargingstatus\": {\n        \"state\": {\n          \"0\": \"oplader\",\n          \"1\": \"opladning slutter\",\n          \"2\": \"Ladepause\",\n          \"3\": \"frakoblet\",\n          \"4\": \"fejl\",\n          \"5\": \"langsom\",\n          \"6\": \"hurtig\",\n          \"7\": \"aflader\",\n          \"8\": \"oplader ikke\",\n          \"9\": \"langsom opladning efter nået rejsemål\",\n          \"10\": \"opladning efter nået rejsemål\",\n          \"11\": \"hurtig opladning efter nået rejsemål\",\n          \"12\": \"Tilsluttet\",\n          \"13\": \"AC-opladning\",\n          \"14\": \"DC-opladning\",\n          \"15\": \"Batterikalibrering aktiv\",\n          \"16\": \"ukendt\"\n        }\n      },\n      \"departuretimemode\": {\n        \"state\": {\n          \"0\": \"Deaktiveret\",\n          \"1\": \"Daglig\",\n          \"2\": \"Ugentlig\"\n        }\n      },\n      \"ignitionstate\": {\n        \"state\": {\n          \"0\": \"Låst\",\n          \"1\": \"Slukket\",\n          \"2\": \"Tilbehør\",\n          \"4\": \"Tændt\",\n          \"5\": \"Start\"\n        }\n      },\n      \"interiorprotectionsensorstatus\": {\n        \"state\": {\n          \"0\": \"Ikke aktiv\",\n          \"1\": \"Ikke aktiv\",\n          \"2\": \"Aktiv\"\n        },\n        \"state_attributes\": {}\n      },\n      \"lock\": {\n        \"state\": {\n          \"0\": \"Ulåst\",\n          \"1\": \"Låst internt\",\n          \"2\": \"Låst\",\n          \"3\": \"Delvist ulåst\",\n          \"4\": \"Ukendt\"\n        },\n        \"state_attributes\": {\n          \"decklidstatus\": {\n            \"name\": \"Bagklap\",\n            \"state\": {\n              \"false\": \"lukket\",\n              \"true\": \"åben\"\n            }\n          },\n          \"doorstatusfrontleft\": {\n            \"name\": \"Dør venstre for\",\n            \"state\": {\n              \"false\": \"lukket\",\n              \"true\": \"åben\"\n            }\n          },\n          \"doorstatusfrontright\": {\n            \"name\": \"Dør højre for\",\n            \"state\": {\n              \"false\": \"lukket\",\n              \"true\": \"åben\"\n            }\n          },\n          \"doorstatusrearleft\": {\n            \"name\": \"Dør venstre bag\",\n            \"state\": {\n              \"false\": \"lukket\",\n              \"true\": \"åben\"\n            }\n          },\n          \"doorstatusrearright\": {\n            \"name\": \"Dør højre bag\",\n            \"state\": {\n              \"false\": \"lukket\",\n              \"true\": \"åben\"\n            }\n          },\n          \"doorlockstatusfrontleft\": {\n            \"name\": \"Dørlås venstre for\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"ulåst\"\n            }\n          },\n          \"doorlockstatusfrontright\": {\n            \"name\": \"Dørlås højre for\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"ulåst\"\n            }\n          },\n          \"doorlockstatusrearleft\": {\n            \"name\": \"Dørlås venstre bag\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"ulåst\"\n            }\n          },\n          \"doorlockstatusrearright\": {\n            \"name\": \"Dørlås højre bag\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"ulåst\"\n            }\n          },\n          \"doorlockstatusgas\": {\n            \"name\": \"Tanklåg\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"ulåst\"\n            }\n          },\n          \"enginehoodstatus\": {\n            \"name\": \"Motorhjelm\",\n            \"state\": {\n              \"false\": \"lukket\",\n              \"true\": \"åben\"\n            }\n          },\n          \"doorstatusoverall\": {\n            \"name\": \"Samlet dørstatus\",\n            \"state\": {\n              \"0\": \"åben\",\n              \"1\": \"lukket\",\n              \"2\": \"findes ikke\",\n              \"3\": \"ukendt\"\n            }\n          },\n          \"sunroofstatus\": {\n            \"name\": \"Soltagsstatus\",\n            \"state\": {\n              \"0\": \"lukket\",\n              \"1\": \"åben\",\n              \"2\": \"løft åben\",\n              \"3\": \"kører\",\n              \"4\": \"vindstøjsposition\",\n              \"5\": \"glidende mellemposition\",\n              \"6\": \"løftende mellemposition\",\n              \"7\": \"åbner\",\n              \"8\": \"lukker\",\n              \"9\": \"vindstøjsløft\",\n              \"10\": \"mellemposition\",\n              \"11\": \"åbner løft\",\n              \"12\": \"lukker løft\"\n            }\n          }\n        }\n      },\n      \"sunroofstatus\": {\n        \"state\": {\n          \"0\": \"Lukket\",\n          \"1\": \"Åben\",\n          \"2\": \"Åben løft\",\n          \"3\": \"Kører\",\n          \"4\": \"Vindstøjsposition\",\n          \"5\": \"Glidende mellemposition\",\n          \"6\": \"Løftende mellemposition\",\n          \"7\": \"Åbner\",\n          \"8\": \"Lukker\",\n          \"9\": \"Vindstøjsløft\",\n          \"10\": \"Mellemposition\",\n          \"11\": \"Åbner løft\",\n          \"12\": \"Lukker løft\"\n        },\n        \"state_attributes\": {}\n      },\n      \"starterbatterystate\": {\n        \"state\": {\n          \"0\": \"Grøn\",\n          \"1\": \"Gul\",\n          \"2\": \"Rød\"\n        }\n      },\n      \"tirewarningsrdk\": {\n        \"state\": {\n          \"0\": \"Ingen advarsel\",\n          \"1\": \"Blød advarsel\",\n          \"2\": \"Lavt tryk\",\n          \"3\": \"Punktering\"\n        }\n      },\n      \"selectedchargeprogram\": {\n        \"state\": {\n          \"0\": \"Standard\",\n          \"2\": \"Hjem\",\n          \"3\": \"Arbejde\",\n          \"4\": \"Ikke understøttet\"\n        }\n      }\n    },\n    \"switch\": {\n      \"auxheat\": {\n        \"name\": \"Ekstravarme\"\n      },\n      \"precond\": {\n        \"name\": \"Forklimatisering\"\n      }\n    },\n    \"button\": {\n      \"btn_preheat_start_now\": {\n        \"name\": \"Start forklimatisering\"\n      },\n      \"btn_preheat_stop_now\": {\n        \"name\": \"Stop forklimatisering\"\n      },\n      \"btn_sigpos_start_now\": {\n        \"name\": \"Blink lygter\"\n      }\n    }\n  },\n  \"selector\": {\n    \"charge_program\": {\n      \"options\": {\n        \"0\": \"Standard\",\n        \"2\": \"Hjem\",\n        \"3\": \"Arbejde\"\n      }\n    },\n    \"charging_break_clocktimer_configure_action\": {\n      \"options\": {\n        \"notset\": \"Ikke indstillet\",\n        \"active\": \"Aktiv\",\n        \"inactive\": \"Inaktiv\"\n      }\n    },\n    \"temperature_configure\": {\n      \"options\": {\n        \"0\": \"Lav\",\n        \"30\": \"Høj\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/de.json",
    "content": "{\n  \"config\": {\n    \"abort\": {\n      \"already_configured\": \"Komponente ist bereits konfiguriert.\",\n      \"reauth_successful\": \"Neuanmeldung erfolgreich! Komponente wird neu geladen.\"\n    },\n    \"error\": {\n      \"cannot_connect\": \"cannot_connect\",\n      \"invalid_auth\": \"invalid_auth\",\n      \"unknown\": \"Unbekannter Fehler. Bitte prüfe das Home Assistant Log für weitere Informationen.\",\n      \"2fa_required\": \"Zwei-Faktor-Authentifizierung (2FA) Konten werden nicht unterstützt.\",\n      \"legal_terms\": \"Du musst die rechtlichen Bedingungen auf der Mercedes-Website zuerst akzeptieren\"\n    },\n    \"step\": {\n      \"user\": {\n        \"data\": {\n          \"region\": \"Region\"\n        },\n        \"description\": \"Wähle deine Region aus.\",\n        \"title\": \"Mercedes ME 2020 Verbindung einrichten\"\n      },\n      \"credentials\": {\n        \"data\": {\n          \"username\": \"MB Benutzername (E-Mail)\",\n          \"password\": \"Passwort\"\n        },\n        \"description\": \"Gib deine Kontodaten ein.\",\n        \"title\": \"Mercedes ME 2020 - Anmeldung\"\n      },\n      \"pin\": {\n        \"data\": {\n          \"password\": \"TAN (per E-Mail oder SMS erhalten)\"\n        },\n        \"description\": \"Gib die TAN ein, die du per E-Mail oder SMS erhalten hast, um die Authentifizierung abzuschließen. Falls du keine TAN erhalten hast, prüfe bitte deinen E-Mail-Posteingang (und Spam-Ordner) oder deine SMS-Nachrichten.\",\n        \"title\": \"Mercedes ME 2020 - TAN\"\n      }\n    }\n  },\n  \"issues\": {\n    \"restart_required\": {\n      \"fix_flow\": {\n        \"step\": {\n          \"confirm_restart\": {\n            \"description\": \"Ein Neustart von Home Assistant ist erforderlich, um das Auth-Update abzuschließen. Klicke auf Senden, um jetzt neu zu starten.\",\n            \"title\": \"Neustart erforderlich\"\n          }\n        }\n      },\n      \"title\": \"Neustart erforderlich\"\n    }\n  },\n  \"options\": {\n    \"abort\": {\n      \"already_configured\": \"Komponente ist bereits konfiguriert.\",\n      \"reauth_successful\": \"Reauth erfolgreich! Komponente wird neu geladen.\"\n    },\n    \"step\": {\n      \"init\": {\n        \"data\": {\n          \"cap_check_disabled\": \"Verfügbarkeitsprüfung deaktivieren\",\n          \"enable_china_gcj_02\": \"GCJ-02 Übersetzung aktivieren (nur China)\",\n          \"delete_auth_file\": \"Authentifizierungs-Token jetzt löschen. Erfordert nach dem Speichern einen Neustart von Home Assistant.\",\n          \"excluded_cars\": \"Ausgeschlossene VINs (kommagetrennt)\",\n          \"pin\": \"Sicherheits-PIN (in der Mobile-App zu erstellen)\",\n          \"save_files\": \"NUR DEBUG: Servernachrichten in den Messages-Ordner speichern\",\n          \"overwrite_cap_precondnow\": \"Exp: Capability precondnow überschreiben (auf true setzen)\"\n        },\n        \"description\": \"Konfiguriere deine Optionen. Einige Änderungen erfordern einen Neustart von Home Assistant.\",\n        \"title\": \"Mercedes ME 2020 Optionen\"\n      }\n    }\n  },\n  \"system_health\": {\n    \"info\": {\n      \"api_endpoint_reachable\": \"MB API erreichbar\",\n      \"websocket_connection_state\": \"MB WS Status\",\n      \"cars_connected\": \"Verbundene Fahrzeuge\",\n      \"version\": \"Version\"\n    }\n  },\n  \"services\": {\n    \"refresh_access_token\": {\n      \"name\": \"Access-Token erneuern\",\n      \"description\": \"Erneuert das API Zugriffstoken\"\n    },\n    \"auxheat_configure\": {\n      \"name\": \"Standheizung konfigurieren\",\n      \"description\": \"Befehl zum Konfigurieren der Standheizung. Es ist möglich, drei Tageszeiten zu definieren und eine aktive Zeit auszuwählen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"time_selection\": {\n          \"name\": \"Zeit Auswahl\",\n          \"description\": \"Aktiviertes Standheizungs-Preset (0=no_selection, 1=time_1, 2=time_2, 3=time_3)\"\n        },\n        \"time_1\": {\n          \"name\": \"time_1\",\n          \"description\": \"Tageszeit in Minuten nach Mitternacht. Z. B. 8 Uhr = 480. Wertebereich 0-1439.\"\n        },\n        \"time_2\": {\n          \"name\": \"time_2\",\n          \"description\": \"Tageszeit in Minuten nach Mitternacht. Z. B. 8 Uhr = 480. Wertebereich 0-1439.\"\n        },\n        \"time_3\": {\n          \"name\": \"time_3\",\n          \"description\": \"Tageszeit in Minuten nach Mitternacht. Z. B. 8 Uhr = 480. Wertebereich 0-1439.\"\n        }\n      }\n    },\n    \"auxheat_start\": {\n      \"name\": \"Standheizung starten\",\n      \"description\": \"Startet die Standheizung eines Fahrzeugs (VIN)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        }\n      }\n    },\n    \"auxheat_stop\": {\n      \"name\": \"Standheizung stoppen\",\n      \"description\": \"Stoppt die Standheizung eines Fahrzeugs (VIN)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        }\n      }\n    },\n    \"battery_max_soc_configure\": {\n      \"name\": \"Maximale Akku-Ladezustand konfigurieren\",\n      \"description\": \"Konfiguriert den maximalen Ladezustand der HV-Batterie für ein Fahrzeug (VIN).\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"max_soc\": {\n          \"name\": \"Max Soc\",\n          \"description\": \"Maximaler Ladezustand (muss zwischen 50 (einige neue Fahrzeuge wie der 2025 CLA unterstützen 30) und 100 liegen und durch 10 teilbar sein)\"\n        },\n        \"charge_program\": {\n          \"name\": \"Ladeprogramm\",\n          \"description\": \"(Optional, Standard=0) Zu änderndes Ladeprogramm (0=Standard, 2=Zuhause, 3=Arbeit) (nicht für 2025 CLA verwendet)\"\n        }\n      }\n    },\n    \"charge_program_configure\": {\n      \"name\": \"Ladeprogramm auswählen\",\n      \"description\": \"Befehl zum Auswählen des Ladeprogramms.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"charge_program\": {\n          \"name\": \"Ladeprogramm\",\n          \"description\": \"Aktiviertes Ladeprogramm (0=Standard, 2=Zuhause, 3=Arbeit)\"\n        },\n        \"max_soc\": {\n          \"name\": \"Max Soc\",\n          \"description\": \"Maximaler Ladezustand (muss zwischen 50 und 100 liegen und durch 10 teilbar sein)\"\n        }\n      }\n    },\n    \"doors_unlock\": {\n      \"name\": \"Türen entriegeln\",\n      \"description\": \"Entriegelt ein Fahrzeug (VIN). PIN-Einrichtung erforderlich.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Sicherheits-PIN, erforderlich wenn nicht in den Einstellungen gespeichert\"\n        }\n      }\n    },\n    \"doors_lock\": {\n      \"name\": \"Türen verriegeln\",\n      \"description\": \"Verriegelt ein Fahrzeug (VIN)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        }\n      }\n    },\n    \"download_images\": {\n      \"name\": \"Bilder herunterladen\",\n      \"description\": \"Lädt App-Bilder in den Ressourcenordner des Components herunter.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        }\n      }\n    },\n    \"engine_start\": {\n      \"name\": \"Motor starten\",\n      \"description\": \"Startet den Motor eines Fahrzeugs (VIN). PIN-Einrichtung erforderlich.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Sicherheits-PIN, erforderlich wenn nicht in den Einstellungen gespeichert\"\n        }\n      }\n    },\n    \"engine_stop\": {\n      \"name\": \"Motor stoppen\",\n      \"description\": \"Stoppt den Motor eines Fahrzeugs (VIN). PIN-Einrichtung erforderlich.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        }\n      }\n    },\n    \"hv_battery_start_conditioning\": {\n      \"name\": \"HV-Batterie Konditionierung starten\",\n      \"description\": \"Startet die HV-Batterie-Konditionierung eines Fahrzeugs (VIN).\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        }\n      }\n    },\n    \"hv_battery_stop_conditioning\": {\n      \"name\": \"HV-Batterie Konditionierung stoppen\",\n      \"description\": \"Stoppt die HV-Batterie-Konditionierung eines Fahrzeugs (VIN).\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        }\n      }\n    },\n    \"preconditioning_configure_seats\": {\n      \"name\": \"Sitze vorklimatisieren konfigurieren\",\n      \"description\": \"Sendet Sitzkonfigurationsbefehl für Vorklimatisierung an ein Fahrzeug (VIN).\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"front_left\": {\n          \"name\": \"Vorne links\",\n          \"description\": \"Aktivieren wenn Sitz vorne links vorklimatisiert werden soll\"\n        },\n        \"front_right\": {\n          \"name\": \"Vorne rechts\",\n          \"description\": \"Aktivieren wenn Sitz vorne rechts vorklimatisiert werden soll\"\n        },\n        \"rear_left\": {\n          \"name\": \"Hinten links\",\n          \"description\": \"Aktivieren wenn Sitz hinten links vorklimatisiert werden soll\"\n        },\n        \"rear_right\": {\n          \"name\": \"Hinten rechts\",\n          \"description\": \"Aktivieren wenn Sitz hinten rechts vorklimatisiert werden soll\"\n        }\n      }\n    },\n    \"preheat_start\": {\n      \"name\": \"Vorklimatisierung starten\",\n      \"description\": \"Startet die Vorklimatisierung eines Fahrzeugs (VIN).\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"type\": {\n          \"name\": \"Typ\",\n          \"description\": \"Methode zum Starten (0=Jetzt (Standard), 1=Sofort - Verwende 'Sofort' falls Fahrzeug 'Jetzt' nicht unterstützt)\"\n        }\n      }\n    },\n    \"preheat_start_departure_time\": {\n      \"name\": \"Vorklimatisierung mit Abfahrtszeit starten\",\n      \"description\": \"Startet die Vorklimatisierung mit gegebener Abfahrtszeit.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"time\": {\n          \"name\": \"Zeit\",\n          \"description\": \"Abfahrtszeit in Minuten nach Mitternacht (z. B. 8 Uhr = 480). Wertebereich 0-1439.\"\n        }\n      }\n    },\n    \"preheat_stop\": {\n      \"name\": \"Vorklimatisierung stoppen\",\n      \"description\": \"Stoppt die Vorklimatisierung eines Fahrzeugs (VIN).\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        }\n      }\n    },\n    \"preheat_stop_departure_time\": {\n      \"name\": \"Vorklimatisierung mit Abfahrtszeit stoppen\",\n      \"description\": \"Stoppt konfigurierte Vorklimatisierung mit Abfahrtszeit.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        }\n      }\n    },\n    \"preconditioning_configure\": {\n      \"name\": \"Vorklimatisierung Abfahrt konfigurieren\",\n      \"description\": \"Konfiguriert den Abfahrtszeit-Modus der Vorklimatisierung. Verwende Modus 0 (Deaktiviert) um die geplante Abfahrts-Vorklimatisierung abzubrechen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"departure_time_mode\": {\n          \"name\": \"Abfahrtszeit-Modus\",\n          \"description\": \"0=Deaktiviert, 1=Einzelne Abfahrt, 2=Wöchentliche Abfahrt\"\n        },\n        \"departure_time\": {\n          \"name\": \"Abfahrtszeit\",\n          \"description\": \"Abfahrtszeit in Minuten nach Mitternacht (0-1439). Wird nur bei Modus > 0 verwendet.\"\n        }\n      }\n    },\n    \"sigpos_start\": {\n      \"name\": \"Signalposition starten\",\n      \"description\": \"Startet Lichtsignal eines Fahrzeugs (VIN).\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        }\n      }\n    },\n    \"sunroof_open\": {\n      \"name\": \"Schiebedach öffnen\",\n      \"description\": \"Öffnet das Schiebedach eines Fahrzeugs (VIN). PIN-Einrichtung erforderlich.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Sicherheits-PIN, erforderlich wenn nicht in den Einstellungen gespeichert\"\n        }\n      }\n    },\n    \"sunroof_tilt\": {\n      \"name\": \"Schiebedach kippen\",\n      \"description\": \"Kippt das Schiebedach eines Fahrzeugs (VIN). PIN-Einrichtung erforderlich.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Sicherheits-PIN, erforderlich wenn nicht in den Einstellungen gespeichert\"\n        }\n      }\n    },\n    \"sunroof_close\": {\n      \"name\": \"Schiebedach schließen\",\n      \"description\": \"Schließt das Schiebedach eines Fahrzeugs (VIN).\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        }\n      }\n    },\n    \"temperature_configure\": {\n      \"name\": \"Zieltemperatur konfigurieren (precond/auxheat)\",\n      \"description\": \"Konfiguriert Zieltemperaturen für Zonen in einem Fahrzeug (VIN).\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"front_left\": {\n          \"name\": \"Vorne links\",\n          \"description\": \"Zieltemperatur für Zone vorne links in CELSIUS.\"\n        },\n        \"front_right\": {\n          \"name\": \"Vorne rechts\",\n          \"description\": \"Zieltemperatur für Zone vorne rechts in CELSIUS.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Hinten links\",\n          \"description\": \"Zieltemperatur für Zone hinten links in CELSIUS. (falls vorhanden)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Hinten rechts\",\n          \"description\": \"Zieltemperatur für Zone hinten rechts in CELSIUS. (falls vorhanden)\"\n        }\n      }\n    },\n    \"windows_open\": {\n      \"name\": \"Fenster öffnen\",\n      \"description\": \"Öffnet die Fenster eines Fahrzeugs (VIN). PIN-Einrichtung erforderlich.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Sicherheits-PIN, erforderlich wenn nicht in den Einstellungen gespeichert\"\n        }\n      }\n    },\n    \"windows_close\": {\n      \"name\": \"Fenster schließen\",\n      \"description\": \"Schließt die Fenster eines Fahrzeugs (VIN). PIN-Einrichtung erforderlich.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        }\n      }\n    },\n    \"windows_move\": {\n      \"name\": \"Fenster bewegen\",\n      \"description\": \"Bewegt die Fenster eines Fahrzeugs (VIN) auf eine neue Position. PIN-Einrichtung erforderlich.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Sicherheits-PIN, erforderlich wenn nicht in den Einstellungen gespeichert\"\n        },\n        \"front_left\": {\n          \"name\": \"Vorne links\",\n          \"description\": \"Neue Position des vorderen linken Fensters (0=geschlossen, 10=belüftet, 100=offen)\"\n        },\n        \"front_right\": {\n          \"name\": \"Vorne rechts\",\n          \"description\": \"Neue Position des vorderen rechten Fensters (0=geschlossen, 10=belüftet, 100=offen)\"\n        },\n        \"rear_left\": {\n          \"name\": \"Hinten links\",\n          \"description\": \"Neue Position des hinteren linken Fensters (0=geschlossen, 10=belüftet, 100=offen)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Hinten rechts\",\n          \"description\": \"Neue Position des hinteren rechten Fensters (0=geschlossen, 10=belüftet, 100=offen)\"\n        }\n      }\n    },\n    \"send_route\": {\n      \"name\": \"Route senden\",\n      \"description\": \"Sendet eine Route an das Fahrzeug. (Nur ein Standort)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"title\": {\n          \"name\": \"Titel\",\n          \"description\": \"Titel der Route\"\n        },\n        \"latitude\": {\n          \"name\": \"Breitengrad\",\n          \"description\": \"Breitengrad des Standorts\"\n        },\n        \"longitude\": {\n          \"name\": \"Längengrad\",\n          \"description\": \"Längengrad des Standorts\"\n        },\n        \"city\": {\n          \"name\": \"Stadt\",\n          \"description\": \"Stadt des Standorts\"\n        },\n        \"postcode\": {\n          \"name\": \"Postleitzahl\",\n          \"description\": \"Postleitzahl des Standorts\"\n        },\n        \"street\": {\n          \"name\": \"Straße\",\n          \"description\": \"Straßenname des Standorts\"\n        }\n      }\n    },\n    \"charging_break_clocktimer_configure\": {\n      \"name\": \"Ladepausen Timer konfigurieren\",\n      \"description\": \"Konfiguriert Ladepausen (nur AC). Überschreibt die komplette Konfiguration für alle Slots im Fahrzeug.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin des Fahrzeugs\"\n        },\n        \"status_timer_1\": {\n          \"name\": \"Status (Timer 1)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_1\": {\n          \"name\": \"Startzeit (Timer 1)\",\n          \"description\": \"Startzeit des Ladepausefensters (Timer 1)\"\n        },\n        \"stoptime_timer_1\": {\n          \"name\": \"Endzeit (Timer 1)\",\n          \"description\": \"Endzeit des Ladepausefensters (Timer 1)\"\n        },\n        \"status_timer_2\": {\n          \"name\": \"Status (Timer 2)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_2\": {\n          \"name\": \"Startzeit (Timer 2)\",\n          \"description\": \"Startzeit des Ladepausefensters (Timer 2)\"\n        },\n        \"stoptime_timer_2\": {\n          \"name\": \"Endzeit (Timer 2)\",\n          \"description\": \"Endzeit des Ladepausefensters (Timer 2)\"\n        },\n        \"status_timer_3\": {\n          \"name\": \"Status (Timer 3)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_3\": {\n          \"name\": \"Startzeit (Timer 3)\",\n          \"description\": \"Startzeit des Ladepausefensters (Timer 3)\"\n        },\n        \"stoptime_timer_3\": {\n          \"name\": \"Endzeit (Timer 3)\",\n          \"description\": \"Endzeit des Ladepausefensters (Timer 3)\"\n        },\n        \"status_timer_4\": {\n          \"name\": \"Status (Timer 4)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_4\": {\n          \"name\": \"Startzeit (Timer 4)\",\n          \"description\": \"Startzeit des Ladepausefensters (Timer 4)\"\n        },\n        \"stoptime_timer_4\": {\n          \"name\": \"Endzeit (Timer 4)\",\n          \"description\": \"Endzeit des Ladepausefensters (Timer 4)\"\n        }\n      }\n    }\n  },\n  \"entity\": {\n    \"binary_sensor\": {\n      \"chargingactive\": {\n        \"name\": \"Ladevorgang aktiv\"\n      }\n    },\n    \"sensor\": {\n      \"chargingpowerecolimit\": {\n        \"name\": \"Ladeleistungsbegrenzung\"\n      },\n      \"auxheatstatus\": {\n        \"state\": {\n          \"0\": \"Inaktiv\",\n          \"1\": \"Normal heizen\",\n          \"2\": \"Normal belüften\",\n          \"3\": \"Manuelles Heizen\",\n          \"4\": \"Nachheizen\",\n          \"5\": \"Nachlüften\",\n          \"6\": \"Automatisch heizen\"\n        }\n      },\n      \"chargeflapacstatus\": {\n        \"state\": {\n          \"0\": \"Offen\",\n          \"1\": \"Geschlossen\",\n          \"2\": \"Klappe gedrückt\",\n          \"3\": \"Unbekannt\"\n        }\n      },\n      \"chargeflapdcstatus\": {\n        \"state\": {\n          \"0\": \"Offen\",\n          \"1\": \"Geschlossen\",\n          \"2\": \"Klappe gedrückt\",\n          \"3\": \"Unbekannt\"\n        }\n      },\n      \"chargingstatus\": {\n        \"state\": {\n          \"0\": \"Lädt\",\n          \"1\": \"Ladevorgang beendet\",\n          \"2\": \"Ladepause\",\n          \"3\": \"Gekappt\",\n          \"4\": \"Fehler\",\n          \"5\": \"Langsam\",\n          \"6\": \"Schnell\",\n          \"7\": \"Entladung\",\n          \"8\": \"Nicht ladend\",\n          \"9\": \"Langsam nach Ziel erreicht\",\n          \"10\": \"Laden nach Ziel erreicht\",\n          \"11\": \"Schnell nach Ziel erreicht\",\n          \"12\": \"Verbunden\",\n          \"13\": \"AC Laden\",\n          \"14\": \"DC Laden\",\n          \"15\": \"Batteriekalibrierung aktiv\",\n          \"16\": \"Unbekannt\"\n        }\n      },\n      \"departuretimemode\": {\n        \"state\": {\n          \"0\": \"Deaktiviert\",\n          \"1\": \"Täglich\",\n          \"2\": \"Wöchentlich\"\n        }\n      },\n      \"ignitionstate\": {\n        \"state\": {\n          \"0\": \"Verriegelt\",\n          \"1\": \"Aus\",\n          \"2\": \"Zubehör\",\n          \"4\": \"Ein\",\n          \"5\": \"Start\"\n        }\n      },\n      \"interiorprotectionsensorstatus\": {\n        \"state\": {\n          \"0\": \"Nicht aktiv\",\n          \"1\": \"Nicht aktiv\",\n          \"2\": \"Aktiv\"\n        },\n        \"state_attributes\": {}\n      },\n      \"lock\": {\n        \"state\": {\n          \"0\": \"Entriegelt\",\n          \"1\": \"Intern verriegelt\",\n          \"2\": \"Verriegelt\",\n          \"3\": \"Teilweise entriegelt\",\n          \"4\": \"Unbekannt\"\n        },\n        \"state_attributes\": {\n          \"decklidstatus\": {\n            \"name\": \"Kofferraumklappe\",\n            \"state\": {\n              \"false\": \"geschlossen\",\n              \"true\": \"offen\"\n            }\n          },\n          \"doorstatusfrontleft\": {\n            \"name\": \"Tür vorne links\",\n            \"state\": {\n              \"false\": \"geschlossen\",\n              \"true\": \"offen\"\n            }\n          },\n          \"doorstatusfrontright\": {\n            \"name\": \"Tür vorne rechts\",\n            \"state\": {\n              \"false\": \"geschlossen\",\n              \"true\": \"offen\"\n            }\n          },\n          \"doorstatusrearleft\": {\n            \"name\": \"Tür hinten links\",\n            \"state\": {\n              \"false\": \"geschlossen\",\n              \"true\": \"offen\"\n            }\n          },\n          \"doorstatusrearright\": {\n            \"name\": \"Tür hinten rechts\",\n            \"state\": {\n              \"false\": \"geschlossen\",\n              \"true\": \"offen\"\n            }\n          },\n          \"doorlockstatusfrontleft\": {\n            \"name\": \"Türschloss vorne links\",\n            \"state\": {\n              \"false\": \"verriegelt\",\n              \"true\": \"entriegelt\"\n            }\n          },\n          \"doorlockstatusfrontright\": {\n            \"name\": \"Türschloss vorne rechts\",\n            \"state\": {\n              \"false\": \"verriegelt\",\n              \"true\": \"entriegelt\"\n            }\n          },\n          \"doorlockstatusrearleft\": {\n            \"name\": \"Türschloss hinten links\",\n            \"state\": {\n              \"false\": \"verriegelt\",\n              \"true\": \"entriegelt\"\n            }\n          },\n          \"doorlockstatusrearright\": {\n            \"name\": \"Türschloss hinten rechts\",\n            \"state\": {\n              \"false\": \"verriegelt\",\n              \"true\": \"entriegelt\"\n            }\n          },\n          \"doorlockstatusgas\": {\n            \"name\": \"Tankklappenschloss\",\n            \"state\": {\n              \"false\": \"verriegelt\",\n              \"true\": \"entriegelt\"\n            }\n          },\n          \"enginehoodstatus\": {\n            \"name\": \"Motorhaube\",\n            \"state\": {\n              \"false\": \"geschlossen\",\n              \"true\": \"offen\"\n            }\n          },\n          \"doorstatusoverall\": {\n            \"name\": \"Allgemeiner Türstatus\",\n            \"state\": {\n              \"0\": \"offen\",\n              \"1\": \"geschlossen\",\n              \"2\": \"nicht vorhanden\",\n              \"3\": \"unbekannt\"\n            }\n          },\n          \"sunroofstatus\": {\n            \"name\": \"Schiebedachstatus\",\n            \"state\": {\n              \"0\": \"geschlossen\",\n              \"1\": \"offen\",\n              \"2\": \"gekippt offen\",\n              \"3\": \"in Bewegung\",\n              \"4\": \"Anti-Bump Position\",\n              \"5\": \"Zwischenposition Schiebe\",\n              \"6\": \"Zwischenposition Kipp\",\n              \"7\": \"Öffnet\",\n              \"8\": \"Schließt\",\n              \"9\": \"Anti-Bump Kipp\",\n              \"10\": \"Zwischenposition\",\n              \"11\": \"Öffnet (Kipp)\",\n              \"12\": \"Schließt (Kipp)\"\n            }\n          }\n        }\n      },\n      \"sunroofstatus\": {\n        \"state\": {\n          \"0\": \"Geschlossen\",\n          \"1\": \"Offen\",\n          \"2\": \"Geöffnet gekippt\",\n          \"3\": \"In Bewegung\",\n          \"4\": \"Anti-Bump\",\n          \"5\": \"Zwischenposition Schiebe\",\n          \"6\": \"Zwischenposition Kipp\",\n          \"7\": \"Öffnet\",\n          \"8\": \"Schließt\",\n          \"9\": \"Anti-Bump Kipp\",\n          \"10\": \"Zwischenposition\",\n          \"11\": \"Öffnet (Kipp)\",\n          \"12\": \"Schließt (Kipp)\"\n        },\n        \"state_attributes\": {}\n      },\n      \"starterbatterystate\": {\n        \"state\": {\n          \"0\": \"Grün\",\n          \"1\": \"Gelb\",\n          \"2\": \"Rot\"\n        }\n      },\n      \"tirewarningsrdk\": {\n        \"state\": {\n          \"0\": \"Keine Warnung\",\n          \"1\": \"Leichte Warnung\",\n          \"2\": \"Niedriger Druck\",\n          \"3\": \"Plattfuß\"\n        }\n      },\n      \"selectedchargeprogram\": {\n        \"state\": {\n          \"0\": \"Standard\",\n          \"2\": \"Zuhause\",\n          \"3\": \"Arbeit\",\n          \"4\": \"Nicht unterstützt\"\n        }\n      }\n    },\n    \"switch\": {\n      \"auxheat\": {\n        \"name\": \"Standheizung\"\n      },\n      \"precond\": {\n        \"name\": \"Vorklimatisierung\"\n      }\n    },\n    \"button\": {\n      \"btn_preheat_start_now\": {\n        \"name\": \"Vorklimatisierung starten\"\n      },\n      \"btn_preheat_stop_now\": {\n        \"name\": \"Vorklimatisierung stoppen\"\n      },\n      \"btn_sigpos_start_now\": {\n        \"name\": \"Signallicht blinken\"\n      }\n    }\n  },\n  \"selector\": {\n    \"charge_program\": {\n      \"options\": {\n        \"0\": \"Standard\",\n        \"2\": \"Zuhause\",\n        \"3\": \"Arbeit\"\n      }\n    },\n    \"charging_break_clocktimer_configure_action\": {\n      \"options\": {\n        \"notset\": \"Nicht gesetzt\",\n        \"active\": \"Aktiv\",\n        \"inactive\": \"Inaktiv\"\n      }\n    },\n    \"temperature_configure\": {\n      \"options\": {\n        \"0\": \"Niedrig\",\n        \"30\": \"Hoch\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/en.json",
    "content": "{\n  \"config\": {\n    \"abort\": {\n      \"already_configured\": \"Component is configured already.\",\n      \"reauth_successful\": \"Reauth successful! Component reload in progress.\"\n    },\n    \"error\": {\n      \"cannot_connect\": \"cannot_connect\",\n      \"invalid_auth\": \"invalid_auth\",\n      \"unknown\": \"Unknown error. Please check the Home Assistant log for more information.\",\n      \"2fa_required\": \"Two-factor authentication (2FA) accounts are not supported.\",\n      \"legal_terms\": \"You need to accept the legal terms in the Mercedes website first\"\n    },\n    \"step\": {\n      \"user\": {\n        \"data\": {\n          \"region\": \"Region\"\n        },\n        \"description\": \"Select your region.\",\n        \"title\": \"Set up the Mercedes ME 2020 connection\"\n      },\n      \"credentials\": {\n        \"data\": {\n          \"username\": \"MB username (email address)\",\n          \"password\": \"Password\"\n        },\n        \"description\": \"Enter your account details.\",\n        \"title\": \"Mercedes ME 2020 - Login\"\n      },\n      \"pin\": {\n        \"data\": {\n          \"password\": \"TAN (received via eMail or SMS)\"\n        },\n        \"description\": \"Enter the TAN you have received via eMail or SMS to complete the authentication. If you have not received a TAN, please check your email inbox (and spam folder) or your SMS messages.\",\n        \"title\": \"Mercedes ME 2020 - TAN\"\n      }\n    }\n  },\n  \"issues\": {\n    \"restart_required\": {\n      \"fix_flow\": {\n        \"step\": {\n          \"confirm_restart\": {\n            \"description\": \"Restart of Home Assistant is required to finish auth update click submit to restart now.\",\n            \"title\": \"Restart required\"\n          }\n        }\n      },\n      \"title\": \"Restart required\"\n    }\n  },\n  \"options\": {\n    \"abort\": {\n      \"already_configured\": \"Component is configured already.\",\n      \"reauth_successful\": \"Reauth successful! Component reload in progress.\"\n    },\n    \"step\": {\n      \"init\": {\n        \"data\": {\n          \"cap_check_disabled\": \"Disable capabilities check\",\n          \"enable_china_gcj_02\": \"Enable GCJ-02 translation (China only)\",\n          \"delete_auth_file\": \"Delete authentication token now. Requires a restart of Home Assistant after save.\",\n          \"excluded_cars\": \"VINs excluded (comma-sep)\",\n          \"pin\": \"Security PIN (to be created in mobile app)\",\n          \"save_files\": \"DEBUG ONLY: Enable save server messages to the messages folder\",\n          \"overwrite_cap_precondnow\": \"Exp: Overwrite capability precondnow (set to true)\"\n        },\n        \"description\": \"Configure your options. Some changes require a restart of Home Assistant.\",\n        \"title\": \"Mercedes ME 2020 Options\"\n      }\n    }\n  },\n  \"system_health\": {\n    \"info\": {\n      \"api_endpoint_reachable\": \"MB API reachable\",\n      \"websocket_connection_state\": \"MB WS state\",\n      \"cars_connected\": \"Connected cars\",\n      \"version\": \"Version\"\n    }\n  },\n  \"services\": {\n    \"refresh_access_token\": {\n      \"name\": \"Refresh access token\",\n      \"description\": \"Refresh the API access token\"\n    },\n    \"auxheat_configure\": {\n      \"name\": \"Auxheat configure\",\n      \"description\": \"Command for configuring the auxiliary heating. It is possible to define three daytimes and select one active time.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"time_selection\": {\n          \"name\": \"Time selection\",\n          \"description\": \"The activated auxiliary heating preset time (0=no_selection, 1=time_1, 2=time_2, 3=time_3)\"\n        },\n        \"time_1\": {\n          \"name\": \"time_1\",\n          \"description\": \"Daytime in minutes after midnight. E.g. valid value for 8 am would be 480. Value range is 0 to 1439.\"\n        },\n        \"time_2\": {\n          \"name\": \"time_2\",\n          \"description\": \"Daytime in minutes after midnight. E.g. valid value for 8 am would be 480. Value range is 0 to 1439.\"\n        },\n        \"time_3\": {\n          \"name\": \"time_3\",\n          \"description\": \"Daytime in minutes after midnight. E.g. valid value for 8 am would be 480. Value range is 0 to 1439.\"\n        }\n      }\n    },\n    \"auxheat_start\": {\n      \"name\": \"Auxheat start\",\n      \"description\": \"Start the auxiliary heating of a car defined by a vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        }\n      }\n    },\n    \"auxheat_stop\": {\n      \"name\": \"Auxheat stop\",\n      \"description\": \"Stop the auxiliary heating of a car defined by a vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        }\n      }\n    },\n    \"battery_max_soc_configure\": {\n      \"name\": \"Battery max soc configure\",\n      \"description\": \"Configure the maximum value for the state of charge of the HV battery of a car defined by a vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"max_soc\": {\n          \"name\": \"Max Soc\",\n          \"description\": \"The maximum value for the state of charge of the HV battery (Value needs to be between 50 (some new cars like 2025 CLA supporting 30) and 100 and divisible by ten)\"\n        },\n        \"charge_program\": {\n          \"name\": \"Charge program\",\n          \"description\": \"(Optional, Default=0) Charge program to change (0=Default, 2=Home, 3=Work) (not used for 2025 CLA)\"\n        }\n      }\n    },\n    \"charge_program_configure\": {\n      \"name\": \"Charge program configure\",\n      \"description\": \"Command to select the charge program.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"charge_program\": {\n          \"name\": \"Charge program\",\n          \"description\": \"The activated charging program (0=Default, 2=Home, 3=Work)\"\n        },\n        \"max_soc\": {\n          \"name\": \"Max Soc\",\n          \"description\": \"The maximum value for the state of charge of the HV battery (Value needs to be between 50 and 100 and divisible by ten)\"\n        }\n      }\n    },\n    \"doors_unlock\": {\n      \"name\": \"Doors unlock\",\n      \"description\": \"Unlock a car defined by a vin. PIN setup required. See options dialog of the integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"security pin, required if not stored in the settings.\"\n        }\n      }\n    },\n    \"doors_lock\": {\n      \"name\": \"Doors lock\",\n      \"description\": \"Lock a car defined by a vin\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        }\n      }\n    },\n    \"download_images\": {\n      \"name\": \"Download images\",\n      \"description\": \"Downloads the app images to the components resource folder for a car defined by a vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        }\n      }\n    },\n    \"engine_start\": {\n      \"name\": \"Engine start\",\n      \"description\": \"Start the engine of a car defined by a vin. PIN setup required. See options dialog of the integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Security pin, required if not stored in the settings.\"\n        }\n      }\n    },\n    \"engine_stop\": {\n      \"name\": \"Engine stop\",\n      \"description\": \"Stop the engine of a car defined by a vin. PIN setup required. See options dialog of the integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        }\n      }\n    },\n    \"hv_battery_start_conditioning\": {\n      \"name\": \"HV Battery start conditioning\",\n      \"description\": \"Start the HV battery conditioning of a car defined by a vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        }\n      }\n    },\n    \"hv_battery_stop_conditioning\": {\n      \"name\": \"HV Battery stop conditioning\",\n      \"description\": \"Stop the HV battery conditioning of a car defined by a vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        }\n      }\n    },\n    \"preconditioning_configure_seats\": {\n      \"name\": \"Preconditioning configure seats\",\n      \"description\": \"Send a preconditioning seat configuration command to a car defined by a VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"front_left\": {\n          \"name\": \"Front left\",\n          \"description\": \"Activate if the front left seat should be preconditioned.\"\n        },\n        \"front_right\": {\n          \"name\": \"Front right\",\n          \"description\": \"Activate if the front right seat should be preconditioned.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Rear left\",\n          \"description\": \"Activate if the rear left seat should be preconditioned.\"\n        },\n        \"rear_right\": {\n          \"name\": \"Rear right\",\n          \"description\": \"Activate if the rear right seat should be preconditioned.\"\n        }\n      }\n    },\n    \"preheat_start\": {\n      \"name\": \"Preconditioning start\",\n      \"description\": \"Start the preconditioning of a car defined by a vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"type\": {\n          \"name\": \"Type\",\n          \"description\": \"Method that is used to initiate the start process. 0=Now (Default), 1=Immediate - Use Immediate in case your car does not support now.\"\n        }\n      }\n    },\n    \"preheat_start_departure_time\": {\n      \"name\": \"Preconditioning start with departure time\",\n      \"description\": \"Start the preconditioning of a car defined by a vin and a given departure time.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"time\": {\n          \"name\": \"Time\",\n          \"description\": \"Departure time in minutes after midnight. E.g. valid value for 8 am would be 480. Value range is 0 to 1439.\"\n        }\n      }\n    },\n    \"preheat_stop\": {\n      \"name\": \"Preconditioning stop\",\n      \"description\": \"Stop the preconditioning of a car defined by a vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        }\n      }\n    },\n    \"preheat_stop_departure_time\": {\n      \"name\": \"Preconditioning stop mode departuretime\",\n      \"description\": \"Stop the configured departure time preconditioning of a car defined by a vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        }\n      }\n    },\n    \"preconditioning_configure\": {\n      \"name\": \"Configure preconditioning departure\",\n      \"description\": \"Configure preconditioning departure time mode. Use mode 0 (Disabled) to cancel scheduled departure preconditioning.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"departure_time_mode\": {\n          \"name\": \"Departure Time Mode\",\n          \"description\": \"0=Disabled, 1=Single Departure, 2=Weekly Departure\"\n        },\n        \"departure_time\": {\n          \"name\": \"Departure Time\",\n          \"description\": \"Departure time in minutes after midnight (0-1439). Only used when mode > 0.\"\n        }\n      }\n    },\n    \"sigpos_start\": {\n      \"name\": \"Start signal position\",\n      \"description\": \"Start light signaling of a car defined by a vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        }\n      }\n    },\n    \"sunroof_open\": {\n      \"name\": \"Sunroof open\",\n      \"description\": \"Open the sunroof of a car defined by a vin. PIN setup required. See options dialog of the integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Security pin, required if not stored in the settings.\"\n        }\n      }\n    },\n    \"sunroof_tilt\": {\n      \"name\": \"Sunroof tilt\",\n      \"description\": \"Tilt the sunroof of a car defined by a vin. PIN setup required. See options dialog of the integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Security pin, required if not stored in the settings.\"\n        }\n      }\n    },\n    \"sunroof_close\": {\n      \"name\": \"Sunroof close\",\n      \"description\": \"Close the sunroof of a car defined by a vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        }\n      }\n    },\n    \"temperature_configure\": {\n      \"name\": \"Target temperature configure (precond/auxheat)\",\n      \"description\": \"Configure the target preconditioning/auxheat temperatures for zones in a car defined by a VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"front_left\": {\n          \"name\": \"Front left\",\n          \"description\": \"Target temperature for the zone front_left in CELSIUS.\"\n        },\n        \"front_right\": {\n          \"name\": \"Front right\",\n          \"description\": \"Target temperature for the zone front_right in CELSIUS.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Rear left\",\n          \"description\": \"Target temperature for the zone rear_left in CELSIUS. (if available)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Rear right\",\n          \"description\": \"Target temperature for the zone rear_right in CELSIUS. (if available)\"\n        }\n      }\n    },\n    \"windows_open\": {\n      \"name\": \"Windows open\",\n      \"description\": \"Open the windows of a car defined by a vin. PIN setup required. See options dialog of the integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Security pin, required if not stored in the settings.\"\n        }\n      }\n    },\n    \"windows_close\": {\n      \"name\": \"Windows close\",\n      \"description\": \"Close the windows of a car defined by a vin. PIN setup required. See options dialog of the integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        }\n      }\n    },\n    \"windows_move\": {\n      \"name\": \"Windows move\",\n      \"description\": \"Move the windows of a car defined by a vin to a new position. PIN setup required. See options dialog of the integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Security pin, required if not stored in the settings.\"\n        },\n        \"front_left\": {\n          \"name\": \"Front left\",\n          \"description\": \"The new position of the front left window (0=closed, 10=ventilating, 100=open)\"\n        },\n        \"front_right\": {\n          \"name\": \"Front right\",\n          \"description\": \"The new position of the front left window (0=closed, 10=ventilating, 100=open)\"\n        },\n        \"rear_left\": {\n          \"name\": \"Rear left\",\n          \"description\": \"The new position of the front left window (0=closed, 10=ventilating, 100=open)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Rear right\",\n          \"description\": \"The new position of the front left window (0=closed, 10=ventilating, 100=open)\"\n        }\n      }\n    },\n    \"send_route\": {\n      \"name\": \"Route send\",\n      \"description\": \"Sends a route to the car. (Single location only)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"title\": {\n          \"name\": \"Title\",\n          \"description\": \"Title of the route\"\n        },\n        \"latitude\": {\n          \"name\": \"Latitude\",\n          \"description\": \"Latitude of the location\"\n        },\n        \"longitude\": {\n          \"name\": \"Longitude\",\n          \"description\": \"Longitude of the location\"\n        },\n        \"city\": {\n          \"name\": \"City\",\n          \"description\": \"City name of the location\"\n        },\n        \"postcode\": {\n          \"name\": \"Postcode\",\n          \"description\": \"Postcode of the location\"\n        },\n        \"street\": {\n          \"name\": \"Street\",\n          \"description\": \"Street name of the location\"\n        }\n      }\n    },\n    \"charging_break_clocktimer_configure\": {\n      \"name\": \"Charging Break Clocktimer Configure\",\n      \"description\": \"Configure charging breaks (AC only). This will overwrite the complete config for all slots in your car.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin of the car\"\n        },\n        \"status_timer_1\": {\n          \"name\": \"Status (Timer 1)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_1\": {\n          \"name\": \"Start time (Timer 1)\",\n          \"description\": \"Start time of the charge break window (Timer 1)\"\n        },\n        \"stoptime_timer_1\": {\n          \"name\": \"End Time (Timer 1)\",\n          \"description\": \"End time of the charge break window (Timer 1)\"\n        },\n        \"status_timer_2\": {\n          \"name\": \"Status (Timer 2)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_2\": {\n          \"name\": \"Start time (Timer 2)\",\n          \"description\": \"Start time of the charge break window (Timer 2)\"\n        },\n        \"stoptime_timer_2\": {\n          \"name\": \"End Time (Timer 2)\",\n          \"description\": \"End time of the charge break window (Timer 2)\"\n        },\n        \"status_timer_3\": {\n          \"name\": \"Status (Timer 3)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_3\": {\n          \"name\": \"Start time (Timer 3)\",\n          \"description\": \"Start time of the charge break window (Timer 3)\"\n        },\n        \"stoptime_timer_3\": {\n          \"name\": \"End Time (Timer 3)\",\n          \"description\": \"End time of the charge break window (Timer 3)\"\n        },\n        \"status_timer_4\": {\n          \"name\": \"Status (Timer 4)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_4\": {\n          \"name\": \"Start time (Timer 4)\",\n          \"description\": \"Start time of the charge break window (Timer 4)\"\n        },\n        \"stoptime_timer_4\": {\n          \"name\": \"End Time (Timer 4)\",\n          \"description\": \"End time of the charge break window (Timer 4)\"\n        }\n      }\n    }\n  },\n  \"entity\": {\n    \"binary_sensor\": {\n      \"chargingactive\": {\n        \"name\": \"Charging active\"\n      }\n    },\n    \"sensor\": {\n      \"chargingpowerecolimit\": {\n        \"name\": \"Charging power limit\"\n      },\n      \"auxheatstatus\": {\n        \"state\": {\n          \"0\": \"Inactive\",\n          \"1\": \"Normal heating\",\n          \"2\": \"Normal ventilation\",\n          \"3\": \"Manual heating\",\n          \"4\": \"Post heating\",\n          \"5\": \"Post ventilation\",\n          \"6\": \"Auto heating\"\n        }\n      },\n      \"chargeflapacstatus\": {\n        \"state\": {\n          \"0\": \"Open\",\n          \"1\": \"Closed\",\n          \"2\": \"Flap pressed\",\n          \"3\": \"Unknown\"\n        }\n      },\n      \"chargeflapdcstatus\": {\n        \"state\": {\n          \"0\": \"Open\",\n          \"1\": \"Closed\",\n          \"2\": \"Flap pressed\",\n          \"3\": \"Unknown\"\n        }\n      },\n      \"chargingstatus\": {\n        \"state\": {\n          \"0\": \"charging\",\n          \"1\": \"charging ends\",\n          \"2\": \"Charge break\",\n          \"3\": \"unplugged\",\n          \"4\": \"failure\",\n          \"5\": \"slow\",\n          \"6\": \"fast\",\n          \"7\": \"discharging\",\n          \"8\": \"not charging\",\n          \"9\": \"slow charging after reaching trip target\",\n          \"10\": \"charging after reaching trip target\",\n          \"11\": \"fast charging after reaching trip target\",\n          \"12\": \"Connected\",\n          \"13\": \"AC Charging\",\n          \"14\": \"DC Charging\",\n          \"15\": \"Battery calibration active\",\n          \"16\": \"unknown\"\n        }\n      },\n      \"departuretimemode\": {\n        \"state\": {\n          \"0\": \"Disabled\",\n          \"1\": \"Daily\",\n          \"2\": \"Weekly\"\n        }\n      },\n      \"ignitionstate\": {\n        \"state\": {\n          \"0\": \"Locked\",\n          \"1\": \"Off\",\n          \"2\": \"Accessory\",\n          \"4\": \"On\",\n          \"5\": \"Start\"\n        }\n      },\n      \"interiorprotectionsensorstatus\": {\n        \"state\": {\n          \"0\": \"Not active\",\n          \"1\": \"Not active\",\n          \"2\": \"Active\"\n        },\n        \"state_attributes\": {}\n      },\n      \"lock\": {\n        \"state\": {\n          \"0\": \"Unlocked\",\n          \"1\": \"Locked int\",\n          \"2\": \"Locked\",\n          \"3\": \"Partly unlocked\",\n          \"4\": \"Unknown\"\n        },\n        \"state_attributes\": {\n          \"decklidstatus\": {\n            \"name\": \"Deck lid\",\n            \"state\": {\n              \"false\": \"closed\",\n              \"true\": \"open\"\n            }\n          },\n          \"doorstatusfrontleft\": {\n            \"name\": \"Door front left\",\n            \"state\": {\n              \"false\": \"closed\",\n              \"true\": \"open\"\n            }\n          },\n          \"doorstatusfrontright\": {\n            \"name\": \"Door front right\",\n            \"state\": {\n              \"false\": \"closed\",\n              \"true\": \"open\"\n            }\n          },\n          \"doorstatusrearleft\": {\n            \"name\": \"Door rear left\",\n            \"state\": {\n              \"false\": \"closed\",\n              \"true\": \"open\"\n            }\n          },\n          \"doorstatusrearright\": {\n            \"name\": \"Door rear right\",\n            \"state\": {\n              \"false\": \"closed\",\n              \"true\": \"open\"\n            }\n          },\n          \"doorlockstatusfrontleft\": {\n            \"name\": \"Door lock front left\",\n            \"state\": {\n              \"false\": \"locked\",\n              \"true\": \"unlocked\"\n            }\n          },\n          \"doorlockstatusfrontright\": {\n            \"name\": \"Door lock front right\",\n            \"state\": {\n              \"false\": \"locked\",\n              \"true\": \"unlocked\"\n            }\n          },\n          \"doorlockstatusrearleft\": {\n            \"name\": \"Door lock rear left\",\n            \"state\": {\n              \"false\": \"locked\",\n              \"true\": \"unlocked\"\n            }\n          },\n          \"doorlockstatusrearright\": {\n            \"name\": \"Door lock rear right\",\n            \"state\": {\n              \"false\": \"locked\",\n              \"true\": \"unlocked\"\n            }\n          },\n          \"doorlockstatusgas\": {\n            \"name\": \"Gas lock\",\n            \"state\": {\n              \"false\": \"locked\",\n              \"true\": \"unlocked\"\n            }\n          },\n          \"enginehoodstatus\": {\n            \"name\": \"Engine hood\",\n            \"state\": {\n              \"false\": \"closed\",\n              \"true\": \"open\"\n            }\n          },\n          \"doorstatusoverall\": {\n            \"name\": \"Door status overall\",\n            \"state\": {\n              \"0\": \"open\",\n              \"1\": \"closed\",\n              \"2\": \"not existing\",\n              \"3\": \"unknown\"\n            }\n          },\n          \"sunroofstatus\": {\n            \"name\": \"Sunroof status\",\n            \"state\": {\n              \"0\": \"closed\",\n              \"1\": \"open\",\n              \"2\": \"lifting open\",\n              \"3\": \"running\",\n              \"4\": \"anti-booming position\",\n              \"5\": \"sliding intermediate\",\n              \"6\": \"lifting intermediate\",\n              \"7\": \"opening\",\n              \"8\": \"closing\",\n              \"9\": \"anti-booming lifting\",\n              \"10\": \"intermediate position\",\n              \"11\": \"opening lifting\",\n              \"12\": \"closing lifting\"\n            }\n          }\n        }\n      },\n      \"sunroofstatus\": {\n        \"state\": {\n          \"0\": \"Closed\",\n          \"1\": \"Open\",\n          \"2\": \"Open lifting\",\n          \"3\": \"Running\",\n          \"4\": \"Anti booming\",\n          \"5\": \"Intermediate sliding\",\n          \"6\": \"Intermediate lifting\",\n          \"7\": \"Opening\",\n          \"8\": \"Closing\",\n          \"9\": \"Anti booming lifting\",\n          \"10\": \"Intermediate position\",\n          \"11\": \"Opening lifting\",\n          \"12\": \"Closing lifting\"\n        },\n        \"state_attributes\": {}\n      },\n      \"starterbatterystate\": {\n        \"state\": {\n          \"0\": \"Green\",\n          \"1\": \"Yellow\",\n          \"2\": \"Red\"\n        }\n      },\n      \"tirewarningsrdk\": {\n        \"state\": {\n          \"0\": \"No warning\",\n          \"1\": \"Soft warning\",\n          \"2\": \"Low pressure\",\n          \"3\": \"Deflation\"\n        }\n      },\n      \"selectedchargeprogram\": {\n        \"state\": {\n          \"0\": \"Standard\",\n          \"2\": \"Home\",\n          \"3\": \"Work\",\n          \"4\": \"Not supported\"\n        }\n      }\n    },\n    \"switch\": {\n      \"auxheat\": {\n        \"name\": \"Auxiliary Heating\"\n      },\n      \"precond\": {\n        \"name\": \"Pre-entry climate control\"\n      }\n    },\n    \"button\": {\n      \"btn_preheat_start_now\": {\n        \"name\": \"Preclimate start\"\n      },\n      \"btn_preheat_stop_now\": {\n        \"name\": \"Preclimate stop\"\n      },\n      \"btn_sigpos_start_now\": {\n        \"name\": \"Flash lights\"\n      }\n    }\n  },\n  \"selector\": {\n    \"charge_program\": {\n      \"options\": {\n        \"0\": \"Default\",\n        \"2\": \"Home\",\n        \"3\": \"Work\"\n      }\n    },\n    \"charging_break_clocktimer_configure_action\": {\n      \"options\": {\n        \"notset\": \"Not set\",\n        \"active\": \"Active\",\n        \"inactive\": \"Inactive\"\n      }\n    },\n    \"temperature_configure\": {\n      \"options\": {\n        \"0\": \"Low\",\n        \"30\": \"High\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/es.json",
    "content": "{\n  \"config\": {\n    \"abort\": {\n      \"already_configured\": \"El componente ya está configurado.\",\n      \"reauth_successful\": \"¡Reautenticación exitosa! Recargando el componente.\"\n    },\n    \"error\": {\n      \"cannot_connect\": \"cannot_connect\",\n      \"invalid_auth\": \"invalid_auth\",\n      \"unknown\": \"Error desconocido. Por favor, revisa el registro de Home Assistant para más información.\",\n      \"2fa_required\": \"Las cuentas con autenticación de dos factores (2FA) no son compatibles.\",\n      \"legal_terms\": \"Primero debes aceptar los términos legales en el sitio web de Mercedes\"\n    },\n    \"step\": {\n      \"user\": {\n        \"data\": {\n          \"region\": \"Región\"\n        },\n        \"description\": \"Selecciona tu región.\",\n        \"title\": \"Configurar la conexión Mercedes ME 2020\"\n      },\n      \"credentials\": {\n        \"data\": {\n          \"username\": \"Usuario MB (dirección de correo electrónico)\",\n          \"password\": \"Contraseña\"\n        },\n        \"description\": \"Introduce los datos de tu cuenta.\",\n        \"title\": \"Mercedes ME 2020 - Iniciar sesión\"\n      },\n      \"pin\": {\n        \"data\": {\n          \"password\": \"TAN (recibido por correo electrónico o SMS)\"\n        },\n        \"description\": \"Introduce el TAN que has recibido por correo electrónico o SMS para completar la autenticación. Si no has recibido un TAN, por favor revisa tu bandeja de entrada de correo electrónico (y la carpeta de spam) o tus mensajes SMS.\",\n        \"title\": \"Mercedes ME 2020 - TAN\"\n      }\n    }\n  },\n  \"issues\": {\n    \"restart_required\": {\n      \"fix_flow\": {\n        \"step\": {\n          \"confirm_restart\": {\n            \"description\": \"Se requiere reiniciar Home Assistant para finalizar la actualización de autenticación, haz clic en enviar para reiniciar ahora.\",\n            \"title\": \"Reinicio requerido\"\n          }\n        }\n      },\n      \"title\": \"Reinicio requerido\"\n    }\n  },\n  \"options\": {\n    \"abort\": {\n      \"already_configured\": \"El componente ya está configurado.\",\n      \"reauth_successful\": \"¡Reautenticación exitosa! Recargando el componente.\"\n    },\n    \"step\": {\n      \"init\": {\n        \"data\": {\n          \"cap_check_disabled\": \"Deshabilitar verificación de capacidades\",\n          \"enable_china_gcj_02\": \"Habilitar traducción GCJ-02 (solo China)\",\n          \"delete_auth_file\": \"Eliminar el token de autenticación ahora. Se requiere un reinicio de Home Assistant después de guardar.\",\n          \"excluded_cars\": \"VINs excluidos (separados por comas)\",\n          \"pin\": \"PIN de seguridad (a crear en la aplicación móvil)\",\n          \"save_files\": \"SOLO PARA DEBUG: Habilitar guardar mensajes del servidor en la carpeta de mensajes\",\n          \"overwrite_cap_precondnow\": \"Exp: Sobrescribir capacidad precondnow (establecer en verdadero)\"\n        },\n        \"description\": \"Configura tus opciones. Algunos cambios requieren un reinicio de Home Assistant.\",\n        \"title\": \"Opciones Mercedes ME 2020\"\n      }\n    }\n  },\n  \"system_health\": {\n    \"info\": {\n      \"api_endpoint_reachable\": \"API MB accesible\",\n      \"websocket_connection_state\": \"Estado WS MB\",\n      \"cars_connected\": \"Coches conectados\",\n      \"version\": \"Versión\"\n    }\n  },\n  \"services\": {\n    \"refresh_access_token\": {\n      \"name\": \"Actualizar token de acceso\",\n      \"description\": \"Actualizar el token de acceso a la API\"\n    },\n    \"auxheat_configure\": {\n      \"name\": \"Configurar calefacción auxiliar\",\n      \"description\": \"Comando para configurar la calefacción auxiliar. Es posible definir tres horarios y seleccionar un tiempo activo.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"time_selection\": {\n          \"name\": \"Selección de tiempo\",\n          \"description\": \"El tiempo de calefacción auxiliar preestablecido activado (0=no_selection, 1=time_1, 2=time_2, 3=time_3)\"\n        },\n        \"time_1\": {\n          \"name\": \"time_1\",\n          \"description\": \"Tiempo en minutos después de la medianoche. Por ejemplo, un valor válido para las 8 a.m. sería 480. El rango de valores es de 0 a 1439.\"\n        },\n        \"time_2\": {\n          \"name\": \"time_2\",\n          \"description\": \"Tiempo en minutos después de la medianoche. Por ejemplo, un valor válido para las 8 a.m. sería 480. El rango de valores es de 0 a 1439.\"\n        },\n        \"time_3\": {\n          \"name\": \"time_3\",\n          \"description\": \"Tiempo en minutos después de la medianoche. Por ejemplo, un valor válido para las 8 a.m. sería 480. El rango de valores es de 0 a 1439.\"\n        }\n      }\n    },\n    \"auxheat_start\": {\n      \"name\": \"Iniciar calefacción auxiliar\",\n      \"description\": \"Iniciar la calefacción auxiliar de un coche definido por un vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        }\n      }\n    },\n    \"auxheat_stop\": {\n      \"name\": \"Detener calefacción auxiliar\",\n      \"description\": \"Detener la calefacción auxiliar de un coche definido por un vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        }\n      }\n    },\n    \"battery_max_soc_configure\": {\n      \"name\": \"Configurar máximo soc de batería\",\n      \"description\": \"Configurar el valor máximo para el estado de carga de la batería HV de un coche definido por un vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"max_soc\": {\n          \"name\": \"Máx Soc\",\n          \"description\": \"El valor máximo para el estado de carga de la batería HV (el valor debe estar entre 50 (algunos coches nuevos como el CLA 2025 admiten 30) y 100 y ser divisible por diez)\"\n        },\n        \"charge_program\": {\n          \"name\": \"Programa de carga\",\n          \"description\": \"(Opcional, Predeterminado=0) Programa de carga a cambiar (0=Predeterminado, 2=Casa, 3=Trabajo) (no usado para CLA 2025)\"\n        }\n      }\n    },\n    \"charge_program_configure\": {\n      \"name\": \"Configurar programa de carga\",\n      \"description\": \"Comando para seleccionar el programa de carga.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"charge_program\": {\n          \"name\": \"Programa de carga\",\n          \"description\": \"El programa de carga activado (0=Predeterminado, 2=Casa, 3=Trabajo)\"\n        },\n        \"max_soc\": {\n          \"name\": \"Máx Soc\",\n          \"description\": \"El valor máximo para el estado de carga de la batería HV (el valor debe estar entre 50 y 100 y ser divisible por diez)\"\n        }\n      }\n    },\n    \"doors_unlock\": {\n      \"name\": \"Desbloquear puertas\",\n      \"description\": \"Desbloquear un coche definido por un vin. Se requiere configuración de PIN. Consulta el diálogo de opciones de la integración.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de seguridad, requerido si no está almacenado en la configuración.\"\n        }\n      }\n    },\n    \"doors_lock\": {\n      \"name\": \"Bloquear puertas\",\n      \"description\": \"Bloquear un coche definido por un vin\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        }\n      }\n    },\n    \"download_images\": {\n      \"name\": \"Descargar imágenes\",\n      \"description\": \"Descarga las imágenes de la aplicación a la carpeta de recursos del componente para un coche definido por un vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        }\n      }\n    },\n    \"engine_start\": {\n      \"name\": \"Iniciar motor\",\n      \"description\": \"Iniciar el motor de un coche definido por un vin. Se requiere configuración de PIN. Consulta el diálogo de opciones de la integración.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de seguridad, requerido si no está almacenado en la configuración.\"\n        }\n      }\n    },\n    \"engine_stop\": {\n      \"name\": \"Detener motor\",\n      \"description\": \"Detener el motor de un coche definido por un vin. Se requiere configuración de PIN. Consulta el diálogo de opciones de la integración.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        }\n      }\n    },\n    \"hv_battery_start_conditioning\": {\n      \"name\": \"Iniciar acondicionamiento de batería HV\",\n      \"description\": \"Iniciar el acondicionamiento de la batería HV de un coche definido por un vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        }\n      }\n    },\n    \"hv_battery_stop_conditioning\": {\n      \"name\": \"Detener acondicionamiento de batería HV\",\n      \"description\": \"Detener el acondicionamiento de la batería HV de un coche definido por un vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        }\n      }\n    },\n    \"preconditioning_configure_seats\": {\n      \"name\": \"Configurar preacondicionamiento de asientos\",\n      \"description\": \"Enviar un comando de configuración de preacondicionamiento de asientos a un coche definido por un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"front_left\": {\n          \"name\": \"Frente izquierdo\",\n          \"description\": \"Activar si el asiento delantero izquierdo debe ser preacondicionado.\"\n        },\n        \"front_right\": {\n          \"name\": \"Frente derecho\",\n          \"description\": \"Activar si el asiento delantero derecho debe ser preacondicionado.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Detrás izquierdo\",\n          \"description\": \"Activar si el asiento trasero izquierdo debe ser preacondicionado.\"\n        },\n        \"rear_right\": {\n          \"name\": \"Detrás derecho\",\n          \"description\": \"Activar si el asiento trasero derecho debe ser preacondicionado.\"\n        }\n      }\n    },\n    \"preheat_start\": {\n      \"name\": \"Iniciar preacondicionamiento\",\n      \"description\": \"Iniciar el preacondicionamiento de un coche definido por un vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"type\": {\n          \"name\": \"Tipo\",\n          \"description\": \"Método que se utiliza para iniciar el proceso de arranque. 0=Ahora (por defecto), 1=Inmediato - Utilice Inmediato en caso de que su coche no admita ahora.\"\n        }\n      }\n    },\n    \"preheat_start_departure_time\": {\n      \"name\": \"Iniciar preacondicionamiento con hora de salida\",\n      \"description\": \"Iniciar el preacondicionamiento de un coche definido por un vin y una hora de salida dada.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"time\": {\n          \"name\": \"Hora\",\n          \"description\": \"Hora de salida en minutos después de la medianoche. Por ejemplo, un valor válido para las 8 a.m. sería 480. El rango de valores es de 0 a 1439.\"\n        }\n      }\n    },\n    \"preheat_stop\": {\n      \"name\": \"Detener preacondicionamiento\",\n      \"description\": \"Detener el preacondicionamiento de un coche definido por un vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        }\n      }\n    },\n    \"preheat_stop_departure_time\": {\n      \"name\": \"Detener modo de preacondicionamiento con hora de salida\",\n      \"description\": \"Detener el preacondicionamiento configurado con hora de salida de un coche definido por un vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        }\n      }\n    },\n    \"preconditioning_configure\": {\n      \"name\": \"Configurar salida de preacondicionamiento\",\n      \"description\": \"Configurar el modo de hora de salida del preacondicionamiento. Usa el modo 0 (Deshabilitado) para cancelar el preacondicionamiento de salida programado.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"departure_time_mode\": {\n          \"name\": \"Modo de hora de salida\",\n          \"description\": \"0=Deshabilitado, 1=Salida única, 2=Salida semanal\"\n        },\n        \"departure_time\": {\n          \"name\": \"Hora de salida\",\n          \"description\": \"Hora de salida en minutos después de la medianoche (0-1439). Solo se usa cuando el modo > 0.\"\n        }\n      }\n    },\n    \"sigpos_start\": {\n      \"name\": \"Iniciar señal de posición\",\n      \"description\": \"Iniciar señalización de luz de un coche definido por un vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        }\n      }\n    },\n    \"sunroof_open\": {\n      \"name\": \"Abrir techo solar\",\n      \"description\": \"Abrir el techo solar de un coche definido por un vin. Se requiere configuración de PIN. Consulta el diálogo de opciones de la integración.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de seguridad, requerido si no está almacenado en la configuración.\"\n        }\n      }\n    },\n    \"sunroof_tilt\": {\n      \"name\": \"Inclinación del techo solar\",\n      \"description\": \"Inclinar el techo solar de un coche definido por un vin. Se requiere configuración de PIN. Consulta el diálogo de opciones de la integración.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de seguridad, requerido si no está almacenado en la configuración.\"\n        }\n      }\n    },\n    \"sunroof_close\": {\n      \"name\": \"Cerrar techo solar\",\n      \"description\": \"Cerrar el techo solar de un coche definido por un vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        }\n      }\n    },\n    \"temperature_configure\": {\n      \"name\": \"Configurar temperatura objetivo (preacond/auxheat)\",\n      \"description\": \"Configurar las temperaturas objetivo de preacondicionamiento/calefacción auxiliar para zonas en un coche definido por un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"front_left\": {\n          \"name\": \"Frente izquierdo\",\n          \"description\": \"Temperatura objetivo para la zona frontal izquierda en CELSIUS.\"\n        },\n        \"front_right\": {\n          \"name\": \"Frente derecho\",\n          \"description\": \"Temperatura objetivo para la zona frontal derecha en CELSIUS.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Detrás izquierdo\",\n          \"description\": \"Temperatura objetivo para la zona trasera izquierda en CELSIUS. (si está disponible)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Detrás derecho\",\n          \"description\": \"Temperatura objetivo para la zona trasera derecha en CELSIUS. (si está disponible)\"\n        }\n      }\n    },\n    \"windows_open\": {\n      \"name\": \"Abrir ventanas\",\n      \"description\": \"Abrir las ventanas de un coche definido por un vin. Se requiere configuración de PIN. Consulta el diálogo de opciones de la integración.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de seguridad, requerido si no está almacenado en la configuración.\"\n        }\n      }\n    },\n    \"windows_close\": {\n      \"name\": \"Cerrar ventanas\",\n      \"description\": \"Cerrar las ventanas de un coche definido por un vin. Se requiere configuración de PIN. Consulta el diálogo de opciones de la integración.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        }\n      }\n    },\n    \"windows_move\": {\n      \"name\": \"Mover ventanas\",\n      \"description\": \"Mover las ventanas de un coche definido por un vin a una nueva posición. Se requiere configuración de PIN. Consulta el diálogo de opciones de la integración.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de seguridad, requerido si no está almacenado en la configuración.\"\n        },\n        \"front_left\": {\n          \"name\": \"Frente izquierdo\",\n          \"description\": \"La nueva posición de la ventana delantera izquierda (0=cerrada, 10=ventilando, 100=abierta)\"\n        },\n        \"front_right\": {\n          \"name\": \"Frente derecho\",\n          \"description\": \"La nueva posición de la ventana delantera derecha (0=cerrada, 10=ventilando, 100=abierta)\"\n        },\n        \"rear_left\": {\n          \"name\": \"Detrás izquierdo\",\n          \"description\": \"La nueva posición de la ventana trasera izquierda (0=cerrada, 10=ventilando, 100=abierta)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Detrás derecho\",\n          \"description\": \"La nueva posición de la ventana trasera derecha (0=cerrada, 10=ventilando, 100=abierta)\"\n        }\n      }\n    },\n    \"send_route\": {\n      \"name\": \"Enviar ruta\",\n      \"description\": \"Envía una ruta al coche. (Ubicación única solamente)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"title\": {\n          \"name\": \"Título\",\n          \"description\": \"Título de la ruta\"\n        },\n        \"latitude\": {\n          \"name\": \"Latitud\",\n          \"description\": \"Latitud de la ubicación\"\n        },\n        \"longitude\": {\n          \"name\": \"Longitud\",\n          \"description\": \"Longitud de la ubicación\"\n        },\n        \"city\": {\n          \"name\": \"Ciudad\",\n          \"description\": \"Nombre de la ciudad de la ubicación\"\n        },\n        \"postcode\": {\n          \"name\": \"Código postal\",\n          \"description\": \"Código postal de la ubicación\"\n        },\n        \"street\": {\n          \"name\": \"Calle\",\n          \"description\": \"Nombre de la calle de la ubicación\"\n        }\n      }\n    },\n    \"charging_break_clocktimer_configure\": {\n      \"name\": \"Configurar temporizador de pausa de carga\",\n      \"description\": \"Configurar pausas de carga (solo AC). Esto sobrescribirá la configuración completa para todos los slots en tu coche.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin del coche\"\n        },\n        \"status_timer_1\": {\n          \"name\": \"Estado (Temporizador 1)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_1\": {\n          \"name\": \"Hora de inicio (Temporizador 1)\",\n          \"description\": \"Hora de inicio de la ventana de pausa de carga (Temporizador 1)\"\n        },\n        \"stoptime_timer_1\": {\n          \"name\": \"Hora de fin (Temporizador 1)\",\n          \"description\": \"Hora de fin de la ventana de pausa de carga (Temporizador 1)\"\n        },\n        \"status_timer_2\": {\n          \"name\": \"Estado (Temporizador 2)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_2\": {\n          \"name\": \"Hora de inicio (Temporizador 2)\",\n          \"description\": \"Hora de inicio de la ventana de pausa de carga (Temporizador 2)\"\n        },\n        \"stoptime_timer_2\": {\n          \"name\": \"Hora de fin (Temporizador 2)\",\n          \"description\": \"Hora de fin de la ventana de pausa de carga (Temporizador 2)\"\n        },\n        \"status_timer_3\": {\n          \"name\": \"Estado (Temporizador 3)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_3\": {\n          \"name\": \"Hora de inicio (Temporizador 3)\",\n          \"description\": \"Hora de inicio de la ventana de pausa de carga (Temporizador 3)\"\n        },\n        \"stoptime_timer_3\": {\n          \"name\": \"Hora de fin (Temporizador 3)\",\n          \"description\": \"Hora de fin de la ventana de pausa de carga (Temporizador 3)\"\n        },\n        \"status_timer_4\": {\n          \"name\": \"Estado (Temporizador 4)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_4\": {\n          \"name\": \"Hora de inicio (Temporizador 4)\",\n          \"description\": \"Hora de inicio de la ventana de pausa de carga (Temporizador 4)\"\n        },\n        \"stoptime_timer_4\": {\n          \"name\": \"Hora de fin (Temporizador 4)\",\n          \"description\": \"Hora de fin de la ventana de pausa de carga (Temporizador 4)\"\n        }\n      }\n    }\n  },\n  \"entity\": {\n    \"binary_sensor\": {\n      \"chargingactive\": {\n        \"name\": \"Carga activa\"\n      }\n    },\n    \"sensor\": {\n      \"chargingpowerecolimit\": {\n        \"name\": \"Límite de potencia de carga\"\n      },\n      \"auxheatstatus\": {\n        \"state\": {\n          \"0\": \"Inactivo\",\n          \"1\": \"Calefacción normal\",\n          \"2\": \"Ventilación normal\",\n          \"3\": \"Calefacción manual\",\n          \"4\": \"Calefacción posterior\",\n          \"5\": \"Ventilación posterior\",\n          \"6\": \"Calefacción automática\"\n        }\n      },\n      \"chargeflapacstatus\": {\n        \"state\": {\n          \"0\": \"Abierto\",\n          \"1\": \"Cerrado\",\n          \"2\": \"Aleta presionada\",\n          \"3\": \"Desconocido\"\n        }\n      },\n      \"chargeflapdcstatus\": {\n        \"state\": {\n          \"0\": \"Abierto\",\n          \"1\": \"Cerrado\",\n          \"2\": \"Aleta presionada\",\n          \"3\": \"Desconocido\"\n        }\n      },\n      \"chargingstatus\": {\n        \"state\": {\n          \"0\": \"Cargando\",\n          \"1\": \"Carga finalizada\",\n          \"2\": \"Pausa de carga\",\n          \"3\": \"Desenchufado\",\n          \"4\": \"Fallo\",\n          \"5\": \"Lenta\",\n          \"6\": \"Rápida\",\n          \"7\": \"Descargando\",\n          \"8\": \"No cargando\",\n          \"9\": \"Carga lenta después de alcanzar el objetivo del viaje\",\n          \"10\": \"Cargando después de alcanzar el objetivo del viaje\",\n          \"11\": \"Carga rápida después de alcanzar el objetivo del viaje\",\n          \"12\": \"Conectado\",\n          \"13\": \"Carga AC\",\n          \"14\": \"Carga DC\",\n          \"15\": \"Calibración de batería activa\",\n          \"16\": \"Desconocido\"\n        }\n      },\n      \"departuretimemode\": {\n        \"state\": {\n          \"0\": \"Deshabilitado\",\n          \"1\": \"Diario\",\n          \"2\": \"Semanal\"\n        }\n      },\n      \"ignitionstate\": {\n        \"state\": {\n          \"0\": \"Bloqueado\",\n          \"1\": \"Apagado\",\n          \"2\": \"Accesorio\",\n          \"4\": \"Encendido\",\n          \"5\": \"Inicio\"\n        }\n      },\n      \"interiorprotectionsensorstatus\": {\n        \"state\": {\n          \"0\": \"No activo\",\n          \"1\": \"No activo\",\n          \"2\": \"Activo\"\n        },\n        \"state_attributes\": {}\n      },\n      \"lock\": {\n        \"state\": {\n          \"0\": \"Desbloqueado\",\n          \"1\": \"Bloqueado int\",\n          \"2\": \"Bloqueado\",\n          \"3\": \"Parcialmente desbloqueado\",\n          \"4\": \"Desconocido\"\n        },\n        \"state_attributes\": {\n          \"decklidstatus\": {\n            \"name\": \"Tapa del maletero\",\n            \"state\": {\n              \"false\": \"cerrada\",\n              \"true\": \"abierta\"\n            }\n          },\n          \"doorstatusfrontleft\": {\n            \"name\": \"Puerta delantera izquierda\",\n            \"state\": {\n              \"false\": \"cerrada\",\n              \"true\": \"abierta\"\n            }\n          },\n          \"doorstatusfrontright\": {\n            \"name\": \"Puerta delantera derecha\",\n            \"state\": {\n              \"false\": \"cerrada\",\n              \"true\": \"abierta\"\n            }\n          },\n          \"doorstatusrearleft\": {\n            \"name\": \"Puerta trasera izquierda\",\n            \"state\": {\n              \"false\": \"cerrada\",\n              \"true\": \"abierta\"\n            }\n          },\n          \"doorstatusrearright\": {\n            \"name\": \"Puerta trasera derecha\",\n            \"state\": {\n              \"false\": \"cerrada\",\n              \"true\": \"abierta\"\n            }\n          },\n          \"doorlockstatusfrontleft\": {\n            \"name\": \"Bloqueo de puerta delantera izquierda\",\n            \"state\": {\n              \"false\": \"bloqueada\",\n              \"true\": \"desbloqueada\"\n            }\n          },\n          \"doorlockstatusfrontright\": {\n            \"name\": \"Bloqueo de puerta delantera derecha\",\n            \"state\": {\n              \"false\": \"bloqueada\",\n              \"true\": \"desbloqueada\"\n            }\n          },\n          \"doorlockstatusrearleft\": {\n            \"name\": \"Bloqueo de puerta trasera izquierda\",\n            \"state\": {\n              \"false\": \"bloqueada\",\n              \"true\": \"desbloqueada\"\n            }\n          },\n          \"doorlockstatusrearright\": {\n            \"name\": \"Bloqueo de puerta trasera derecha\",\n            \"state\": {\n              \"false\": \"bloqueada\",\n              \"true\": \"desbloqueada\"\n            }\n          },\n          \"doorlockstatusgas\": {\n            \"name\": \"Bloqueo de gasolina\",\n            \"state\": {\n              \"false\": \"bloqueada\",\n              \"true\": \"desbloqueada\"\n            }\n          },\n          \"enginehoodstatus\": {\n            \"name\": \"Capó del motor\",\n            \"state\": {\n              \"false\": \"cerrado\",\n              \"true\": \"abierto\"\n            }\n          },\n          \"doorstatusoverall\": {\n            \"name\": \"Estado general de la puerta\",\n            \"state\": {\n              \"0\": \"abierta\",\n              \"1\": \"cerrada\",\n              \"2\": \"no existente\",\n              \"3\": \"desconocido\"\n            }\n          },\n          \"sunroofstatus\": {\n            \"name\": \"Estado del techo solar\",\n            \"state\": {\n              \"0\": \"cerrado\",\n              \"1\": \"abierto\",\n              \"2\": \"abriendo\",\n              \"3\": \"en funcionamiento\",\n              \"4\": \"posición anti-bumping\",\n              \"5\": \"intermedio deslizante\",\n              \"6\": \"intermedio levantando\",\n              \"7\": \"abriendo\",\n              \"8\": \"cerrando\",\n              \"9\": \"levantando anti-bumping\",\n              \"10\": \"posición intermedia\",\n              \"11\": \"levantando abriendo\",\n              \"12\": \"cerrando levantando\"\n            }\n          }\n        }\n      },\n      \"sunroofstatus\": {\n        \"state\": {\n          \"0\": \"Cerrado\",\n          \"1\": \"Abierto\",\n          \"2\": \"Levantando abierto\",\n          \"3\": \"En funcionamiento\",\n          \"4\": \"Anti-bumping\",\n          \"5\": \"Deslizante intermedio\",\n          \"6\": \"Levantando intermedio\",\n          \"7\": \"Abriendo\",\n          \"8\": \"Cerrando\",\n          \"9\": \"Levantando anti-bumping\",\n          \"10\": \"Posición intermedia\",\n          \"11\": \"Levantando abriendo\",\n          \"12\": \"Cerrando levantando\"\n        },\n        \"state_attributes\": {}\n      },\n      \"starterbatterystate\": {\n        \"state\": {\n          \"0\": \"Verde\",\n          \"1\": \"Amarillo\",\n          \"2\": \"Rojo\"\n        }\n      },\n      \"tirewarningsrdk\": {\n        \"state\": {\n          \"0\": \"Sin advertencia\",\n          \"1\": \"Advertencia suave\",\n          \"2\": \"Baja presión\",\n          \"3\": \"Desinflado\"\n        }\n      },\n      \"selectedchargeprogram\": {\n        \"state\": {\n          \"0\": \"Estándar\",\n          \"2\": \"Casa\",\n          \"3\": \"Trabajo\",\n          \"4\": \"No compatible\"\n        }\n      }\n    },\n    \"switch\": {\n      \"auxheat\": {\n        \"name\": \"Calefacción auxiliar\"\n      },\n      \"precond\": {\n        \"name\": \"Control climático previo a la entrada\"\n      }\n    },\n    \"button\": {\n      \"btn_preheat_start_now\": {\n        \"name\": \"Iniciar preclimatización\"\n      },\n      \"btn_preheat_stop_now\": {\n        \"name\": \"Detener preclimatización\"\n      },\n      \"btn_sigpos_start_now\": {\n        \"name\": \"Destellar luces\"\n      }\n    }\n  },\n  \"selector\": {\n    \"charge_program\": {\n      \"options\": {\n        \"0\": \"Predeterminado\",\n        \"2\": \"Casa\",\n        \"3\": \"Trabajo\"\n      }\n    },\n    \"charging_break_clocktimer_configure_action\": {\n      \"options\": {\n        \"notset\": \"No establecido\",\n        \"active\": \"Activo\",\n        \"inactive\": \"Inactivo\"\n      }\n    },\n    \"temperature_configure\": {\n      \"options\": {\n        \"0\": \"Bajo\",\n        \"30\": \"Alto\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/fi.json",
    "content": "{\n  \"config\": {\n    \"abort\": {\n      \"already_configured\": \"Komponentti on jo määritetty.\",\n      \"reauth_successful\": \"Uudelleentodennus onnistui! Komponentin uudelleenlataus käynnissä.\"\n    },\n    \"error\": {\n      \"cannot_connect\": \"cannot_connect\",\n      \"invalid_auth\": \"invalid_auth\",\n      \"unknown\": \"Tuntematon virhe. Tarkista Home Assistant -loki lisätietoja varten.\",\n      \"2fa_required\": \"Kaksivaiheisen todennuksen (2FA) tilejä ei tueta.\",\n      \"legal_terms\": \"Sinun on hyväksyttävä käyttöehdot Mercedes-verkkosivustolla ensin\"\n    },\n    \"step\": {\n      \"user\": {\n        \"data\": {\n          \"region\": \"Alue\"\n        },\n        \"description\": \"Valitse alueesi.\",\n        \"title\": \"Mercedes ME 2020 -yhteyden määritys\"\n      },\n      \"credentials\": {\n        \"data\": {\n          \"username\": \"MB-käyttäjänimi (sähköpostiosoite)\",\n          \"password\": \"Salasana\"\n        },\n        \"description\": \"Syötä tilisi tiedot.\",\n        \"title\": \"Mercedes ME 2020 - Kirjautuminen\"\n      },\n      \"pin\": {\n        \"data\": {\n          \"password\": \"TAN (vastaanotettu sähköpostilla tai tekstiviestillä)\"\n        },\n        \"description\": \"Syötä sähköpostilla tai tekstiviestillä vastaanottamasi TAN-koodi todennuksen viimeistelemiseksi. Jos et ole vastaanottanut TAN-koodia, tarkista sähköpostisi saapuneet-kansio (ja roskaposti) tai tekstiviestisi.\",\n        \"title\": \"Mercedes ME 2020 - TAN\"\n      }\n    }\n  },\n  \"issues\": {\n    \"restart_required\": {\n      \"fix_flow\": {\n        \"step\": {\n          \"confirm_restart\": {\n            \"description\": \"Home Assistantin uudelleenkäynnistys vaaditaan todennuksen päivityksen viimeistelemiseksi. Napsauta Lähetä käynnistääksesi uudelleen nyt.\",\n            \"title\": \"Uudelleenkäynnistys vaaditaan\"\n          }\n        }\n      },\n      \"title\": \"Uudelleenkäynnistys vaaditaan\"\n    }\n  },\n  \"options\": {\n    \"abort\": {\n      \"already_configured\": \"Komponentti on jo määritetty.\",\n      \"reauth_successful\": \"Uudelleentodennus onnistui! Komponentin uudelleenlataus käynnissä.\"\n    },\n    \"step\": {\n      \"init\": {\n        \"data\": {\n          \"cap_check_disabled\": \"Poista ominaisuuksien tarkistus käytöstä\",\n          \"enable_china_gcj_02\": \"Ota GCJ-02-muunnos käyttöön (vain Kiina)\",\n          \"delete_auth_file\": \"Poista todennuspoletti nyt. Vaatii Home Assistantin uudelleenkäynnistyksen tallennuksen jälkeen.\",\n          \"excluded_cars\": \"Poissuljetut VIN-numerot (pilkulla erotettuina)\",\n          \"pin\": \"Turva-PIN (luotava mobiilisovelluksessa)\",\n          \"save_files\": \"VAIN VIRHEENKORJAUS: Ota palvelinviestien tallennus käyttöön viestikansioon\",\n          \"overwrite_cap_precondnow\": \"Kokeellinen: Ylikirjoita precondnow-ominaisuus (aseta todeksi)\"\n        },\n        \"description\": \"Määritä asetuksesi. Jotkin muutokset vaativat Home Assistantin uudelleenkäynnistyksen.\",\n        \"title\": \"Mercedes ME 2020 -asetukset\"\n      }\n    }\n  },\n  \"system_health\": {\n    \"info\": {\n      \"api_endpoint_reachable\": \"MB API tavoitettavissa\",\n      \"websocket_connection_state\": \"MB WS -tila\",\n      \"cars_connected\": \"Yhdistetyt autot\",\n      \"version\": \"Versio\"\n    }\n  },\n  \"services\": {\n    \"refresh_access_token\": {\n      \"name\": \"Päivitä käyttöoikeuspoletti\",\n      \"description\": \"Päivitä API:n käyttöoikeuspoletti\"\n    },\n    \"auxheat_configure\": {\n      \"name\": \"Lisälämmittimen määritys\",\n      \"description\": \"Komento lisälämmittimen määrittämiseksi. Voit määrittää kolme kellonaikaa ja valita yhden aktiivisen ajan.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"time_selection\": {\n          \"name\": \"Aikavalinnan\",\n          \"description\": \"Valittu lisälämmityksen esiasetettu aika (0=ei valintaa, 1=aika_1, 2=aika_2, 3=aika_3)\"\n        },\n        \"time_1\": {\n          \"name\": \"time_1\",\n          \"description\": \"Vuorokaudenaika minuutteina keskiyöstä. Esim. klo 8:n arvo olisi 480. Arvoalue on 0–1439.\"\n        },\n        \"time_2\": {\n          \"name\": \"time_2\",\n          \"description\": \"Vuorokaudenaika minuutteina keskiyöstä. Esim. klo 8:n arvo olisi 480. Arvoalue on 0–1439.\"\n        },\n        \"time_3\": {\n          \"name\": \"time_3\",\n          \"description\": \"Vuorokaudenaika minuutteina keskiyöstä. Esim. klo 8:n arvo olisi 480. Arvoalue on 0–1439.\"\n        }\n      }\n    },\n    \"auxheat_start\": {\n      \"name\": \"Lisälämmittimen käynnistys\",\n      \"description\": \"Käynnistä VIN-numerolla määritetyn auton lisälämmitin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        }\n      }\n    },\n    \"auxheat_stop\": {\n      \"name\": \"Lisälämmittimen pysäytys\",\n      \"description\": \"Pysäytä VIN-numerolla määritetyn auton lisälämmitin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        }\n      }\n    },\n    \"battery_max_soc_configure\": {\n      \"name\": \"Akun maksimi-SOC:n määritys\",\n      \"description\": \"Määritä VIN-numerolla määritetyn auton korkeajänniteakun enimmäisvaraustaso.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"max_soc\": {\n          \"name\": \"Max Soc\",\n          \"description\": \"Korkeajänniteakun enimmäisvaraustaso (arvon on oltava välillä 50 (jotkin uudet autot, kuten 2025 CLA, tukevat arvoa 30) ja 100 ja jaollinen kymmenellä)\"\n        },\n        \"charge_program\": {\n          \"name\": \"Latausohjelma\",\n          \"description\": \"(Valinnainen, oletus=0) Muutettava latausohjelma (0=Oletus, 2=Koti, 3=Työ) (ei käytössä 2025 CLA:ssa)\"\n        }\n      }\n    },\n    \"charge_program_configure\": {\n      \"name\": \"Latausohjelman määritys\",\n      \"description\": \"Komento latausohjelman valitsemiseksi.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"charge_program\": {\n          \"name\": \"Latausohjelma\",\n          \"description\": \"Valittu latausohjelma (0=Oletus, 2=Koti, 3=Työ)\"\n        },\n        \"max_soc\": {\n          \"name\": \"Max Soc\",\n          \"description\": \"Korkeajänniteakun enimmäisvaraustaso (arvon on oltava välillä 50 ja 100 ja jaollinen kymmenellä)\"\n        }\n      }\n    },\n    \"doors_unlock\": {\n      \"name\": \"Ovien avaus\",\n      \"description\": \"Avaa VIN-numerolla määritetyn auton lukitus. PIN-koodin määritys vaaditaan. Katso integraation asetusvalikko.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Turva-PIN, vaaditaan jos ei ole tallennettu asetuksiin.\"\n        }\n      }\n    },\n    \"doors_lock\": {\n      \"name\": \"Ovien lukitus\",\n      \"description\": \"Lukitse VIN-numerolla määritetty auto.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        }\n      }\n    },\n    \"download_images\": {\n      \"name\": \"Lataa kuvat\",\n      \"description\": \"Lataa sovelluksen kuvat komponentin resurssikansioon VIN-numerolla määritetylle autolle.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        }\n      }\n    },\n    \"engine_start\": {\n      \"name\": \"Moottorin käynnistys\",\n      \"description\": \"Käynnistä VIN-numerolla määritetyn auton moottori. PIN-koodin määritys vaaditaan. Katso integraation asetusvalikko.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Turva-PIN, vaaditaan jos ei ole tallennettu asetuksiin.\"\n        }\n      }\n    },\n    \"engine_stop\": {\n      \"name\": \"Moottorin sammutus\",\n      \"description\": \"Sammuta VIN-numerolla määritetyn auton moottori. PIN-koodin määritys vaaditaan. Katso integraation asetusvalikko.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        }\n      }\n    },\n    \"hv_battery_start_conditioning\": {\n      \"name\": \"Korkeajänniteakun esikäsittelyn käynnistys\",\n      \"description\": \"Käynnistä VIN-numerolla määritetyn auton korkeajänniteakun esikäsittely.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        }\n      }\n    },\n    \"hv_battery_stop_conditioning\": {\n      \"name\": \"Korkeajänniteakun esikäsittelyn pysäytys\",\n      \"description\": \"Pysäytä VIN-numerolla määritetyn auton korkeajänniteakun esikäsittely.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        }\n      }\n    },\n    \"preconditioning_configure_seats\": {\n      \"name\": \"Istuinten esilämmityksen määritys\",\n      \"description\": \"Lähetä istuinten esilämmityskomento VIN-numerolla määritetylle autolle.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"front_left\": {\n          \"name\": \"Vasen etuistuin\",\n          \"description\": \"Ota käyttöön, jos vasen etuistuin tulisi esilämmittää.\"\n        },\n        \"front_right\": {\n          \"name\": \"Oikea etuistuin\",\n          \"description\": \"Ota käyttöön, jos oikea etuistuin tulisi esilämmittää.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Vasen takaistuin\",\n          \"description\": \"Ota käyttöön, jos vasen takaistuin tulisi esilämmittää.\"\n        },\n        \"rear_right\": {\n          \"name\": \"Oikea takaistuin\",\n          \"description\": \"Ota käyttöön, jos oikea takaistuin tulisi esilämmittää.\"\n        }\n      }\n    },\n    \"preheat_start\": {\n      \"name\": \"Esilämmityksen käynnistys\",\n      \"description\": \"Käynnistä VIN-numerolla määritetyn auton esilämmitys.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"type\": {\n          \"name\": \"Tyyppi\",\n          \"description\": \"Käynnistysprosessin menetelmä. 0=Nyt (oletus), 1=Välitön - Käytä Välitön, jos autosi ei tue Nyt-toimintoa.\"\n        }\n      }\n    },\n    \"preheat_start_departure_time\": {\n      \"name\": \"Esilämmityksen käynnistys lähtöajalla\",\n      \"description\": \"Käynnistä VIN-numerolla määritetyn auton esilämmitys annetulla lähtöajalla.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"time\": {\n          \"name\": \"Aika\",\n          \"description\": \"Lähtöaika minuutteina keskiyöstä. Esim. klo 8:n arvo olisi 480. Arvoalue on 0–1439.\"\n        }\n      }\n    },\n    \"preheat_stop\": {\n      \"name\": \"Esilämmityksen pysäytys\",\n      \"description\": \"Pysäytä VIN-numerolla määritetyn auton esilämmitys.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        }\n      }\n    },\n    \"preheat_stop_departure_time\": {\n      \"name\": \"Esilämmityksen lähtöaikatilan pysäytys\",\n      \"description\": \"Pysäytä VIN-numerolla määritetyn auton ajastettu lähtöajan esilämmitys.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        }\n      }\n    },\n    \"preconditioning_configure\": {\n      \"name\": \"Esilämmityksen lähtöajan määritys\",\n      \"description\": \"Määritä esilämmityksen lähtöaikatila. Käytä tilaa 0 (Pois käytöstä) peruuttaaksesi ajastetun lähtöajan esilämmityksen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"departure_time_mode\": {\n          \"name\": \"Lähtöaikatila\",\n          \"description\": \"0=Pois käytöstä, 1=Yksittäinen lähtö, 2=Viikoittainen lähtö\"\n        },\n        \"departure_time\": {\n          \"name\": \"Lähtöaika\",\n          \"description\": \"Lähtöaika minuutteina keskiyöstä (0–1439). Käytetään vain kun tila > 0.\"\n        }\n      }\n    },\n    \"sigpos_start\": {\n      \"name\": \"Käynnistä merkkivalot\",\n      \"description\": \"Käynnistä VIN-numerolla määritetyn auton valomerkinanto.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        }\n      }\n    },\n    \"sunroof_open\": {\n      \"name\": \"Kattoikkunan avaus\",\n      \"description\": \"Avaa VIN-numerolla määritetyn auton kattoikkuna. PIN-koodin määritys vaaditaan. Katso integraation asetusvalikko.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Turva-PIN, vaaditaan jos ei ole tallennettu asetuksiin.\"\n        }\n      }\n    },\n    \"sunroof_tilt\": {\n      \"name\": \"Kattoikkunan kallistus\",\n      \"description\": \"Kallista VIN-numerolla määritetyn auton kattoikkuna. PIN-koodin määritys vaaditaan. Katso integraation asetusvalikko.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Turva-PIN, vaaditaan jos ei ole tallennettu asetuksiin.\"\n        }\n      }\n    },\n    \"sunroof_close\": {\n      \"name\": \"Kattoikkunan sulkeminen\",\n      \"description\": \"Sulje VIN-numerolla määritetyn auton kattoikkuna.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        }\n      }\n    },\n    \"temperature_configure\": {\n      \"name\": \"Kohdelämpötilan määritys (esilämmitys/lisälämmitin)\",\n      \"description\": \"Määritä esilämmityksen/lisälämmittimen kohdelämpötilat vyöhykkeittäin VIN-numerolla määritetylle autolle.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"front_left\": {\n          \"name\": \"Vasen etu\",\n          \"description\": \"Kohdelämpötila vyöhykkeelle vasen etu CELSIUSASTEINA.\"\n        },\n        \"front_right\": {\n          \"name\": \"Oikea etu\",\n          \"description\": \"Kohdelämpötila vyöhykkeelle oikea etu CELSIUSASTEINA.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Vasen taka\",\n          \"description\": \"Kohdelämpötila vyöhykkeelle vasen taka CELSIUSASTEINA. (jos saatavilla)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Oikea taka\",\n          \"description\": \"Kohdelämpötila vyöhykkeelle oikea taka CELSIUSASTEINA. (jos saatavilla)\"\n        }\n      }\n    },\n    \"windows_open\": {\n      \"name\": \"Ikkunoiden avaus\",\n      \"description\": \"Avaa VIN-numerolla määritetyn auton ikkunat. PIN-koodin määritys vaaditaan. Katso integraation asetusvalikko.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Turva-PIN, vaaditaan jos ei ole tallennettu asetuksiin.\"\n        }\n      }\n    },\n    \"windows_close\": {\n      \"name\": \"Ikkunoiden sulkeminen\",\n      \"description\": \"Sulje VIN-numerolla määritetyn auton ikkunat. PIN-koodin määritys vaaditaan. Katso integraation asetusvalikko.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        }\n      }\n    },\n    \"windows_move\": {\n      \"name\": \"Ikkunoiden siirto\",\n      \"description\": \"Siirrä VIN-numerolla määritetyn auton ikkunat uuteen asentoon. PIN-koodin määritys vaaditaan. Katso integraation asetusvalikko.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"Turva-PIN, vaaditaan jos ei ole tallennettu asetuksiin.\"\n        },\n        \"front_left\": {\n          \"name\": \"Vasen etu\",\n          \"description\": \"Vasemman etuikkunan uusi asento (0=suljettu, 10=tuuletus, 100=auki)\"\n        },\n        \"front_right\": {\n          \"name\": \"Oikea etu\",\n          \"description\": \"Oikean etuikkunan uusi asento (0=suljettu, 10=tuuletus, 100=auki)\"\n        },\n        \"rear_left\": {\n          \"name\": \"Vasen taka\",\n          \"description\": \"Vasemman takaikkunan uusi asento (0=suljettu, 10=tuuletus, 100=auki)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Oikea taka\",\n          \"description\": \"Oikean takaikkunan uusi asento (0=suljettu, 10=tuuletus, 100=auki)\"\n        }\n      }\n    },\n    \"send_route\": {\n      \"name\": \"Reitin lähetys\",\n      \"description\": \"Lähettää reitin autoon. (Vain yksittäinen sijainti)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"title\": {\n          \"name\": \"Otsikko\",\n          \"description\": \"Reitin otsikko\"\n        },\n        \"latitude\": {\n          \"name\": \"Leveysaste\",\n          \"description\": \"Sijainnin leveysaste\"\n        },\n        \"longitude\": {\n          \"name\": \"Pituusaste\",\n          \"description\": \"Sijainnin pituusaste\"\n        },\n        \"city\": {\n          \"name\": \"Kaupunki\",\n          \"description\": \"Sijainnin kaupungin nimi\"\n        },\n        \"postcode\": {\n          \"name\": \"Postinumero\",\n          \"description\": \"Sijainnin postinumero\"\n        },\n        \"street\": {\n          \"name\": \"Katu\",\n          \"description\": \"Sijainnin kadun nimi\"\n        }\n      }\n    },\n    \"charging_break_clocktimer_configure\": {\n      \"name\": \"Lataustauon ajastimen määritys\",\n      \"description\": \"Määritä lataustauot (vain AC). Tämä korvaa kaikkien aikapaikkojen nykyisen määrityksen autossasi.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Auton VIN/FIN-numero\"\n        },\n        \"status_timer_1\": {\n          \"name\": \"Tila (Ajastin 1)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_1\": {\n          \"name\": \"Alkamisaika (Ajastin 1)\",\n          \"description\": \"Lataustaukoikkunan alkamisaika (Ajastin 1)\"\n        },\n        \"stoptime_timer_1\": {\n          \"name\": \"Päättymisaika (Ajastin 1)\",\n          \"description\": \"Lataustaukoikkunan päättymisaika (Ajastin 1)\"\n        },\n        \"status_timer_2\": {\n          \"name\": \"Tila (Ajastin 2)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_2\": {\n          \"name\": \"Alkamisaika (Ajastin 2)\",\n          \"description\": \"Lataustaukoikkunan alkamisaika (Ajastin 2)\"\n        },\n        \"stoptime_timer_2\": {\n          \"name\": \"Päättymisaika (Ajastin 2)\",\n          \"description\": \"Lataustaukoikkunan päättymisaika (Ajastin 2)\"\n        },\n        \"status_timer_3\": {\n          \"name\": \"Tila (Ajastin 3)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_3\": {\n          \"name\": \"Alkamisaika (Ajastin 3)\",\n          \"description\": \"Lataustaukoikkunan alkamisaika (Ajastin 3)\"\n        },\n        \"stoptime_timer_3\": {\n          \"name\": \"Päättymisaika (Ajastin 3)\",\n          \"description\": \"Lataustaukoikkunan päättymisaika (Ajastin 3)\"\n        },\n        \"status_timer_4\": {\n          \"name\": \"Tila (Ajastin 4)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_4\": {\n          \"name\": \"Alkamisaika (Ajastin 4)\",\n          \"description\": \"Lataustaukoikkunan alkamisaika (Ajastin 4)\"\n        },\n        \"stoptime_timer_4\": {\n          \"name\": \"Päättymisaika (Ajastin 4)\",\n          \"description\": \"Lataustaukoikkunan päättymisaika (Ajastin 4)\"\n        }\n      }\n    }\n  },\n  \"entity\": {\n    \"binary_sensor\": {\n      \"chargingactive\": {\n        \"name\": \"Lataus aktiivinen\"\n      }\n    },\n    \"sensor\": {\n      \"chargingpowerecolimit\": {\n        \"name\": \"Lataustehon raja\"\n      },\n      \"auxheatstatus\": {\n        \"state\": {\n          \"0\": \"Ei aktiivinen\",\n          \"1\": \"Normaali lämmitys\",\n          \"2\": \"Normaali tuuletus\",\n          \"3\": \"Manuaalinen lämmitys\",\n          \"4\": \"Jälkilämmitys\",\n          \"5\": \"Jälkituuletus\",\n          \"6\": \"Automaattinen lämmitys\"\n        }\n      },\n      \"chargeflapacstatus\": {\n        \"state\": {\n          \"0\": \"Auki\",\n          \"1\": \"Suljettu\",\n          \"2\": \"Luukku painettu\",\n          \"3\": \"Tuntematon\"\n        }\n      },\n      \"chargeflapdcstatus\": {\n        \"state\": {\n          \"0\": \"Auki\",\n          \"1\": \"Suljettu\",\n          \"2\": \"Luukku painettu\",\n          \"3\": \"Tuntematon\"\n        }\n      },\n      \"chargingstatus\": {\n        \"state\": {\n          \"0\": \"ladataan\",\n          \"1\": \"lataus päättyy\",\n          \"2\": \"Lataustauko\",\n          \"3\": \"irrotettu\",\n          \"4\": \"häiriö\",\n          \"5\": \"hidas\",\n          \"6\": \"nopea\",\n          \"7\": \"purkautuu\",\n          \"8\": \"ei lataa\",\n          \"9\": \"hidas lataus matkatason saavuttamisen jälkeen\",\n          \"10\": \"lataus matkatason saavuttamisen jälkeen\",\n          \"11\": \"nopea lataus matkatason saavuttamisen jälkeen\",\n          \"12\": \"Yhdistetty\",\n          \"13\": \"AC-lataus\",\n          \"14\": \"DC-lataus\",\n          \"15\": \"Akun kalibrointi aktiivinen\",\n          \"16\": \"tuntematon\"\n        }\n      },\n      \"departuretimemode\": {\n        \"state\": {\n          \"0\": \"Pois käytöstä\",\n          \"1\": \"Päivittäinen\",\n          \"2\": \"Viikoittainen\"\n        }\n      },\n      \"ignitionstate\": {\n        \"state\": {\n          \"0\": \"Lukittu\",\n          \"1\": \"Pois\",\n          \"2\": \"Lisälaitteet\",\n          \"4\": \"Päällä\",\n          \"5\": \"Käynnistys\"\n        }\n      },\n      \"interiorprotectionsensorstatus\": {\n        \"state\": {\n          \"0\": \"Ei aktiivinen\",\n          \"1\": \"Ei aktiivinen\",\n          \"2\": \"Aktiivinen\"\n        },\n        \"state_attributes\": {}\n      },\n      \"lock\": {\n        \"state\": {\n          \"0\": \"Lukitsematon\",\n          \"1\": \"Lukittu sis.\",\n          \"2\": \"Lukittu\",\n          \"3\": \"Osittain lukitsematon\",\n          \"4\": \"Tuntematon\"\n        },\n        \"state_attributes\": {\n          \"decklidstatus\": {\n            \"name\": \"Tavaratilan kansi\",\n            \"state\": {\n              \"false\": \"suljettu\",\n              \"true\": \"auki\"\n            }\n          },\n          \"doorstatusfrontleft\": {\n            \"name\": \"Vasen etuovi\",\n            \"state\": {\n              \"false\": \"suljettu\",\n              \"true\": \"auki\"\n            }\n          },\n          \"doorstatusfrontright\": {\n            \"name\": \"Oikea etuovi\",\n            \"state\": {\n              \"false\": \"suljettu\",\n              \"true\": \"auki\"\n            }\n          },\n          \"doorstatusrearleft\": {\n            \"name\": \"Vasen takaovi\",\n            \"state\": {\n              \"false\": \"suljettu\",\n              \"true\": \"auki\"\n            }\n          },\n          \"doorstatusrearright\": {\n            \"name\": \"Oikea takaovi\",\n            \"state\": {\n              \"false\": \"suljettu\",\n              \"true\": \"auki\"\n            }\n          },\n          \"doorlockstatusfrontleft\": {\n            \"name\": \"Vasemman etuoven lukko\",\n            \"state\": {\n              \"false\": \"lukittu\",\n              \"true\": \"lukitsematon\"\n            }\n          },\n          \"doorlockstatusfrontright\": {\n            \"name\": \"Oikean etuoven lukko\",\n            \"state\": {\n              \"false\": \"lukittu\",\n              \"true\": \"lukitsematon\"\n            }\n          },\n          \"doorlockstatusrearleft\": {\n            \"name\": \"Vasemman takaoven lukko\",\n            \"state\": {\n              \"false\": \"lukittu\",\n              \"true\": \"lukitsematon\"\n            }\n          },\n          \"doorlockstatusrearright\": {\n            \"name\": \"Oikean takaoven lukko\",\n            \"state\": {\n              \"false\": \"lukittu\",\n              \"true\": \"lukitsematon\"\n            }\n          },\n          \"doorlockstatusgas\": {\n            \"name\": \"Polttoainelukko\",\n            \"state\": {\n              \"false\": \"lukittu\",\n              \"true\": \"lukitsematon\"\n            }\n          },\n          \"enginehoodstatus\": {\n            \"name\": \"Konepelti\",\n            \"state\": {\n              \"false\": \"suljettu\",\n              \"true\": \"auki\"\n            }\n          },\n          \"doorstatusoverall\": {\n            \"name\": \"Ovien kokonaistila\",\n            \"state\": {\n              \"0\": \"auki\",\n              \"1\": \"suljettu\",\n              \"2\": \"ei olemassa\",\n              \"3\": \"tuntematon\"\n            }\n          },\n          \"sunroofstatus\": {\n            \"name\": \"Kattoikkunan tila\",\n            \"state\": {\n              \"0\": \"suljettu\",\n              \"1\": \"auki\",\n              \"2\": \"tuuletusasento auki\",\n              \"3\": \"liikkuu\",\n              \"4\": \"melunvaimennusasento\",\n              \"5\": \"liu'utus välitila\",\n              \"6\": \"kallistus välitila\",\n              \"7\": \"avautuu\",\n              \"8\": \"sulkeutuu\",\n              \"9\": \"melunvaimennus kallistettu\",\n              \"10\": \"väliasento\",\n              \"11\": \"kallistus avautuu\",\n              \"12\": \"kallistus sulkeutuu\"\n            }\n          }\n        }\n      },\n      \"sunroofstatus\": {\n        \"state\": {\n          \"0\": \"Suljettu\",\n          \"1\": \"Auki\",\n          \"2\": \"Tuuletusasento auki\",\n          \"3\": \"Liikkuu\",\n          \"4\": \"Melunvaimennus\",\n          \"5\": \"Liu'utus välitila\",\n          \"6\": \"Kallistus välitila\",\n          \"7\": \"Avautuu\",\n          \"8\": \"Sulkeutuu\",\n          \"9\": \"Melunvaimennus kallistettu\",\n          \"10\": \"Väliasento\",\n          \"11\": \"Kallistus avautuu\",\n          \"12\": \"Kallistus sulkeutuu\"\n        },\n        \"state_attributes\": {}\n      },\n      \"starterbatterystate\": {\n        \"state\": {\n          \"0\": \"Vihreä\",\n          \"1\": \"Keltainen\",\n          \"2\": \"Punainen\"\n        }\n      },\n      \"tirewarningsrdk\": {\n        \"state\": {\n          \"0\": \"Ei varoitusta\",\n          \"1\": \"Lievä varoitus\",\n          \"2\": \"Matala paine\",\n          \"3\": \"Tyhjentyminen\"\n        }\n      },\n      \"selectedchargeprogram\": {\n        \"state\": {\n          \"0\": \"Vakio\",\n          \"2\": \"Koti\",\n          \"3\": \"Työ\",\n          \"4\": \"Ei tuettu\"\n        }\n      }\n    },\n    \"switch\": {\n      \"auxheat\": {\n        \"name\": \"Lisälämmitin\"\n      },\n      \"precond\": {\n        \"name\": \"Sisääntulon ilmastoinnin esisäätö\"\n      }\n    },\n    \"button\": {\n      \"btn_preheat_start_now\": {\n        \"name\": \"Esilämmityksen käynnistys\"\n      },\n      \"btn_preheat_stop_now\": {\n        \"name\": \"Esilämmityksen pysäytys\"\n      },\n      \"btn_sigpos_start_now\": {\n        \"name\": \"Vilkuta valoja\"\n      }\n    }\n  },\n  \"selector\": {\n    \"charge_program\": {\n      \"options\": {\n        \"0\": \"Oletus\",\n        \"2\": \"Koti\",\n        \"3\": \"Työ\"\n      }\n    },\n    \"charging_break_clocktimer_configure_action\": {\n      \"options\": {\n        \"notset\": \"Ei asetettu\",\n        \"active\": \"Aktiivinen\",\n        \"inactive\": \"Ei aktiivinen\"\n      }\n    },\n    \"temperature_configure\": {\n      \"options\": {\n        \"0\": \"Matala\",\n        \"30\": \"Korkea\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/fr.json",
    "content": "{\n  \"config\": {\n    \"abort\": {\n      \"already_configured\": \"Le composant est deja configure.\",\n      \"reauth_successful\": \"Reauthentification reussie ! Rechargement du composant en cours.\"\n    },\n    \"error\": {\n      \"cannot_connect\": \"cannot_connect\",\n      \"invalid_auth\": \"invalid_auth\",\n      \"unknown\": \"Erreur inconnue. Veuillez consulter le journal de Home Assistant pour plus d'informations.\",\n      \"2fa_required\": \"Les comptes avec authentification a deux facteurs (2FA) ne sont pas pris en charge.\",\n      \"legal_terms\": \"Vous devez d'abord accepter les conditions juridiques sur le site web Mercedes\"\n    },\n    \"step\": {\n      \"user\": {\n        \"data\": {\n          \"region\": \"Region\"\n        },\n        \"description\": \"Selectionnez votre region.\",\n        \"title\": \"Configurer la connexion Mercedes ME 2020\"\n      },\n      \"credentials\": {\n        \"data\": {\n          \"username\": \"Nom d'utilisateur MB (adresse e-mail)\",\n          \"password\": \"Mot de passe\"\n        },\n        \"description\": \"Entrez les details de votre compte.\",\n        \"title\": \"Mercedes ME 2020 - Connexion\"\n      },\n      \"pin\": {\n        \"data\": {\n          \"password\": \"TAN (recu par e-mail ou SMS)\"\n        },\n        \"description\": \"Entrez le TAN que vous avez recu par e-mail ou SMS pour terminer l'authentification. Si vous n'avez pas recu de TAN, veuillez verifier votre boite de reception (et le dossier spam) ou vos messages SMS.\",\n        \"title\": \"Mercedes ME 2020 - TAN\"\n      }\n    }\n  },\n  \"issues\": {\n    \"restart_required\": {\n      \"fix_flow\": {\n        \"step\": {\n          \"confirm_restart\": {\n            \"description\": \"Un redemarrage de Home Assistant est necessaire pour terminer la mise a jour de l'authentification. Cliquez sur soumettre pour redemarrer maintenant.\",\n            \"title\": \"Redemarrage necessaire\"\n          }\n        }\n      },\n      \"title\": \"Redemarrage necessaire\"\n    }\n  },\n  \"options\": {\n    \"abort\": {\n      \"already_configured\": \"Le composant est deja configure.\",\n      \"reauth_successful\": \"Reauthentification reussie ! Rechargement du composant en cours.\"\n    },\n    \"step\": {\n      \"init\": {\n        \"data\": {\n          \"cap_check_disabled\": \"Desactiver la verification des capacites\",\n          \"enable_china_gcj_02\": \"Activer la traduction GCJ-02 (Chine uniquement)\",\n          \"delete_auth_file\": \"Supprimer le jeton d'authentification maintenant. Necessite un redemarrage de Home Assistant apres la sauvegarde.\",\n          \"excluded_cars\": \"VIN exclus (separes par des virgules)\",\n          \"pin\": \"PIN de securite (a creer dans l'application mobile)\",\n          \"save_files\": \"DEBOGAGE UNIQUEMENT : Activer l'enregistrement des messages du serveur dans le dossier messages\",\n          \"overwrite_cap_precondnow\": \"Exp : Remplacer la capacite precondnow (definir sur vrai)\"\n        },\n        \"description\": \"Configurez vos options. Certaines modifications necessitent un redemarrage de Home Assistant.\",\n        \"title\": \"Options Mercedes ME 2020\"\n      }\n    }\n  },\n  \"system_health\": {\n    \"info\": {\n      \"api_endpoint_reachable\": \"API MB accessible\",\n      \"websocket_connection_state\": \"Etat WS MB\",\n      \"cars_connected\": \"Voitures connectees\",\n      \"version\": \"Version\"\n    }\n  },\n  \"services\": {\n    \"refresh_access_token\": {\n      \"name\": \"Actualiser le jeton d'acces\",\n      \"description\": \"Actualiser le jeton d'acces de l'API\"\n    },\n    \"auxheat_configure\": {\n      \"name\": \"Configurer le chauffage auxiliaire\",\n      \"description\": \"Commande pour configurer le chauffage auxiliaire. Il est possible de definir trois horaires et de selectionner un horaire actif.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"time_selection\": {\n          \"name\": \"Selection de l'horaire\",\n          \"description\": \"L'horaire de chauffage auxiliaire preselectionne active (0=aucune_selection, 1=horaire_1, 2=horaire_2, 3=horaire_3)\"\n        },\n        \"time_1\": {\n          \"name\": \"time_1\",\n          \"description\": \"Heure de la journee en minutes apres minuit. Par ex. la valeur valide pour 8h serait 480. La plage de valeurs est de 0 a 1439.\"\n        },\n        \"time_2\": {\n          \"name\": \"time_2\",\n          \"description\": \"Heure de la journee en minutes apres minuit. Par ex. la valeur valide pour 8h serait 480. La plage de valeurs est de 0 a 1439.\"\n        },\n        \"time_3\": {\n          \"name\": \"time_3\",\n          \"description\": \"Heure de la journee en minutes apres minuit. Par ex. la valeur valide pour 8h serait 480. La plage de valeurs est de 0 a 1439.\"\n        }\n      }\n    },\n    \"auxheat_start\": {\n      \"name\": \"Demarrer le chauffage auxiliaire\",\n      \"description\": \"Demarrer le chauffage auxiliaire d'un vehicule defini par un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        }\n      }\n    },\n    \"auxheat_stop\": {\n      \"name\": \"Arreter le chauffage auxiliaire\",\n      \"description\": \"Arreter le chauffage auxiliaire d'un vehicule defini par un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        }\n      }\n    },\n    \"battery_max_soc_configure\": {\n      \"name\": \"Configurer le niveau de charge max de la batterie\",\n      \"description\": \"Configurer la valeur maximale de l'etat de charge de la batterie HT d'un vehicule defini par un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"max_soc\": {\n          \"name\": \"Max Soc\",\n          \"description\": \"La valeur maximale de l'etat de charge de la batterie HT (la valeur doit etre comprise entre 50 (certains nouveaux vehicules comme le CLA 2025 prennent en charge 30) et 100 et divisible par dix)\"\n        },\n        \"charge_program\": {\n          \"name\": \"Programme de charge\",\n          \"description\": \"(Optionnel, Defaut=0) Programme de charge a modifier (0=Defaut, 2=Domicile, 3=Travail) (non utilise pour le CLA 2025)\"\n        }\n      }\n    },\n    \"charge_program_configure\": {\n      \"name\": \"Configurer le programme de charge\",\n      \"description\": \"Commande pour selectionner le programme de charge.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"charge_program\": {\n          \"name\": \"Programme de charge\",\n          \"description\": \"Le programme de charge active (0=Defaut, 2=Domicile, 3=Travail)\"\n        },\n        \"max_soc\": {\n          \"name\": \"Max Soc\",\n          \"description\": \"La valeur maximale de l'etat de charge de la batterie HT (la valeur doit etre comprise entre 50 et 100 et divisible par dix)\"\n        }\n      }\n    },\n    \"doors_unlock\": {\n      \"name\": \"Deverrouiller les portes\",\n      \"description\": \"Deverrouiller un vehicule defini par un VIN. Configuration du PIN requise. Voir la boite de dialogue des options de l'integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de securite, requis s'il n'est pas enregistre dans les parametres.\"\n        }\n      }\n    },\n    \"doors_lock\": {\n      \"name\": \"Verrouiller les portes\",\n      \"description\": \"Verrouiller un vehicule defini par un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        }\n      }\n    },\n    \"download_images\": {\n      \"name\": \"Telecharger les images\",\n      \"description\": \"Telecharge les images de l'application dans le dossier de ressources du composant pour un vehicule defini par un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        }\n      }\n    },\n    \"engine_start\": {\n      \"name\": \"Demarrer le moteur\",\n      \"description\": \"Demarrer le moteur d'un vehicule defini par un VIN. Configuration du PIN requise. Voir la boite de dialogue des options de l'integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de sécurité, requis s'il n'est pas enregistré dans les paramètres.\"\n        }\n      }\n    },\n    \"engine_stop\": {\n      \"name\": \"Arreter le moteur\",\n      \"description\": \"Arreter le moteur d'un vehicule defini par un VIN. Configuration du PIN requise. Voir la boite de dialogue des options de l'integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        }\n      }\n    },\n    \"hv_battery_start_conditioning\": {\n      \"name\": \"Demarrer le conditionnement de la batterie HT\",\n      \"description\": \"Demarrer le conditionnement de la batterie HT d'un vehicule defini par un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        }\n      }\n    },\n    \"hv_battery_stop_conditioning\": {\n      \"name\": \"Arreter le conditionnement de la batterie HT\",\n      \"description\": \"Arreter le conditionnement de la batterie HT d'un vehicule defini par un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        }\n      }\n    },\n    \"preconditioning_configure_seats\": {\n      \"name\": \"Configurer le preconditionnement des sieges\",\n      \"description\": \"Envoyer une commande de configuration de preconditionnement des sieges a un vehicule defini par un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"front_left\": {\n          \"name\": \"Avant gauche\",\n          \"description\": \"Activer si le siege avant gauche doit etre preconditionne.\"\n        },\n        \"front_right\": {\n          \"name\": \"Avant droit\",\n          \"description\": \"Activer si le siege avant droit doit etre preconditionne.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Arriere gauche\",\n          \"description\": \"Activer si le siege arriere gauche doit etre preconditionne.\"\n        },\n        \"rear_right\": {\n          \"name\": \"Arriere droit\",\n          \"description\": \"Activer si le siege arriere droit doit etre preconditionne.\"\n        }\n      }\n    },\n    \"preheat_start\": {\n      \"name\": \"Demarrer le preconditionnement\",\n      \"description\": \"Demarrer le preconditionnement d'un vehicule defini par un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"type\": {\n          \"name\": \"Type\",\n          \"description\": \"Methode utilisee pour initier le processus de demarrage. 0=Maintenant (Defaut), 1=Immediat - Utilisez Immediat si votre vehicule ne prend pas en charge Maintenant.\"\n        }\n      }\n    },\n    \"preheat_start_departure_time\": {\n      \"name\": \"Demarrer le preconditionnement avec heure de depart\",\n      \"description\": \"Demarrer le preconditionnement d'un vehicule defini par un VIN et une heure de depart donnee.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"time\": {\n          \"name\": \"Heure\",\n          \"description\": \"Heure de depart en minutes apres minuit. Par ex. la valeur valide pour 8h serait 480. La plage de valeurs est de 0 a 1439.\"\n        }\n      }\n    },\n    \"preheat_stop\": {\n      \"name\": \"Arreter le preconditionnement\",\n      \"description\": \"Arreter le preconditionnement d'un vehicule defini par un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        }\n      }\n    },\n    \"preheat_stop_departure_time\": {\n      \"name\": \"Arreter le preconditionnement mode heure de depart\",\n      \"description\": \"Arreter le preconditionnement avec heure de depart configuree d'un vehicule defini par un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        }\n      }\n    },\n    \"preconditioning_configure\": {\n      \"name\": \"Configurer le depart preconditionne\",\n      \"description\": \"Configurer le mode de preconditionnement avec heure de depart. Utilisez le mode 0 (Desactive) pour annuler le preconditionnement programme.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"departure_time_mode\": {\n          \"name\": \"Mode heure de depart\",\n          \"description\": \"0=Desactive, 1=Depart unique, 2=Depart hebdomadaire\"\n        },\n        \"departure_time\": {\n          \"name\": \"Heure de depart\",\n          \"description\": \"Heure de depart en minutes apres minuit (0-1439). Utilise uniquement lorsque le mode > 0.\"\n        }\n      }\n    },\n    \"sigpos_start\": {\n      \"name\": \"Demarrer la signalisation lumineuse\",\n      \"description\": \"Demarrer la signalisation lumineuse d'un vehicule defini par un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        }\n      }\n    },\n    \"sunroof_open\": {\n      \"name\": \"Ouvrir le toit ouvrant\",\n      \"description\": \"Ouvrir le toit ouvrant d'un vehicule defini par un VIN. Configuration du PIN requise. Voir la boite de dialogue des options de l'integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de sécurité, requis s'il n'est pas enregistré dans les paramètres.\"\n        }\n      }\n    },\n    \"sunroof_tilt\": {\n      \"name\": \"Entrebaillier le toit ouvrant\",\n      \"description\": \"Entrebailler le toit ouvrant d'un vehicule defini par un VIN. Configuration du PIN requise. Voir la boite de dialogue des options de l'integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de sécurité, requis s'il n'est pas enregistré dans les paramètres.\"\n        }\n      }\n    },\n    \"sunroof_close\": {\n      \"name\": \"Fermer le toit ouvrant\",\n      \"description\": \"Fermer le toit ouvrant d'un vehicule defini par un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        }\n      }\n    },\n    \"temperature_configure\": {\n      \"name\": \"Configurer la temperature cible (precond/chauffage aux.)\",\n      \"description\": \"Configurer les temperatures cibles de preconditionnement/chauffage auxiliaire pour les zones d'un vehicule defini par un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"front_left\": {\n          \"name\": \"Avant gauche\",\n          \"description\": \"Temperature cible pour la zone avant gauche en CELSIUS.\"\n        },\n        \"front_right\": {\n          \"name\": \"Avant droit\",\n          \"description\": \"Temperature cible pour la zone avant droit en CELSIUS.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Arriere gauche\",\n          \"description\": \"Temperature cible pour la zone arriere gauche en CELSIUS. (si disponible)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Arriere droit\",\n          \"description\": \"Temperature cible pour la zone arriere droit en CELSIUS. (si disponible)\"\n        }\n      }\n    },\n    \"windows_open\": {\n      \"name\": \"Ouvrir les vitres\",\n      \"description\": \"Ouvrir les vitres d'un vehicule defini par un VIN. Configuration du PIN requise. Voir la boite de dialogue des options de l'integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de securite, requis s'il n'est pas enregistre dans les parametres.\"\n        }\n      }\n    },\n    \"windows_close\": {\n      \"name\": \"Fermer les vitres\",\n      \"description\": \"Fermer les vitres d'un vehicule defini par un VIN. Configuration du PIN requise. Voir la boite de dialogue des options de l'integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        }\n      }\n    },\n    \"windows_move\": {\n      \"name\": \"Deplacer les vitres\",\n      \"description\": \"Deplacer les vitres d'un vehicule defini par un VIN vers une nouvelle position. Configuration du PIN requise. Voir la boite de dialogue des options de l'integration.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de sécurité, requis s'il n'est pas enregistré dans les paramètres.\"\n        },\n        \"front_left\": {\n          \"name\": \"Avant gauche\",\n          \"description\": \"La nouvelle position de la vitre avant gauche (0=fermee, 10=entrebaillee, 100=ouverte)\"\n        },\n        \"front_right\": {\n          \"name\": \"Avant droit\",\n          \"description\": \"La nouvelle position de la vitre avant droite (0=fermee, 10=entrebaillee, 100=ouverte)\"\n        },\n        \"rear_left\": {\n          \"name\": \"Arriere gauche\",\n          \"description\": \"La nouvelle position de la vitre arriere gauche (0=fermee, 10=entrebaillee, 100=ouverte)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Arriere droit\",\n          \"description\": \"La nouvelle position de la vitre arriere droite (0=fermee, 10=entrebaillee, 100=ouverte)\"\n        }\n      }\n    },\n    \"send_route\": {\n      \"name\": \"Envoyer un itineraire\",\n      \"description\": \"Envoie un itineraire au vehicule. (Un seul emplacement uniquement)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"title\": {\n          \"name\": \"Titre\",\n          \"description\": \"Titre de l'itineraire\"\n        },\n        \"latitude\": {\n          \"name\": \"Latitude\",\n          \"description\": \"Latitude de l'emplacement\"\n        },\n        \"longitude\": {\n          \"name\": \"Longitude\",\n          \"description\": \"Longitude de l'emplacement\"\n        },\n        \"city\": {\n          \"name\": \"Ville\",\n          \"description\": \"Nom de la ville de l'emplacement\"\n        },\n        \"postcode\": {\n          \"name\": \"Code postal\",\n          \"description\": \"Code postal de l'emplacement\"\n        },\n        \"street\": {\n          \"name\": \"Rue\",\n          \"description\": \"Nom de la rue de l'emplacement\"\n        }\n      }\n    },\n    \"charging_break_clocktimer_configure\": {\n      \"name\": \"Configurer les pauses de charge programmees\",\n      \"description\": \"Configurer les pauses de charge (CA uniquement). Cela ecrasera la configuration complete de tous les creneaux de votre vehicule.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin du vehicule\"\n        },\n        \"status_timer_1\": {\n          \"name\": \"Statut (Minuteur 1)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_1\": {\n          \"name\": \"Heure de debut (Minuteur 1)\",\n          \"description\": \"Heure de debut de la fenetre de pause de charge (Minuteur 1)\"\n        },\n        \"stoptime_timer_1\": {\n          \"name\": \"Heure de fin (Minuteur 1)\",\n          \"description\": \"Heure de fin de la fenetre de pause de charge (Minuteur 1)\"\n        },\n        \"status_timer_2\": {\n          \"name\": \"Statut (Minuteur 2)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_2\": {\n          \"name\": \"Heure de debut (Minuteur 2)\",\n          \"description\": \"Heure de debut de la fenetre de pause de charge (Minuteur 2)\"\n        },\n        \"stoptime_timer_2\": {\n          \"name\": \"Heure de fin (Minuteur 2)\",\n          \"description\": \"Heure de fin de la fenetre de pause de charge (Minuteur 2)\"\n        },\n        \"status_timer_3\": {\n          \"name\": \"Statut (Minuteur 3)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_3\": {\n          \"name\": \"Heure de debut (Minuteur 3)\",\n          \"description\": \"Heure de debut de la fenetre de pause de charge (Minuteur 3)\"\n        },\n        \"stoptime_timer_3\": {\n          \"name\": \"Heure de fin (Minuteur 3)\",\n          \"description\": \"Heure de fin de la fenetre de pause de charge (Minuteur 3)\"\n        },\n        \"status_timer_4\": {\n          \"name\": \"Statut (Minuteur 4)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_4\": {\n          \"name\": \"Heure de debut (Minuteur 4)\",\n          \"description\": \"Heure de debut de la fenetre de pause de charge (Minuteur 4)\"\n        },\n        \"stoptime_timer_4\": {\n          \"name\": \"Heure de fin (Minuteur 4)\",\n          \"description\": \"Heure de fin de la fenetre de pause de charge (Minuteur 4)\"\n        }\n      }\n    }\n  },\n  \"entity\": {\n    \"binary_sensor\": {\n      \"chargingactive\": {\n        \"name\": \"Charge en cours\"\n      }\n    },\n    \"sensor\": {\n      \"chargingpowerecolimit\": {\n        \"name\": \"Limite de puissance de charge\"\n      },\n      \"auxheatstatus\": {\n        \"state\": {\n          \"0\": \"Inactif\",\n          \"1\": \"Chauffage normal\",\n          \"2\": \"Ventilation normale\",\n          \"3\": \"Chauffage manuel\",\n          \"4\": \"Post-chauffage\",\n          \"5\": \"Post-ventilation\",\n          \"6\": \"Chauffage automatique\"\n        }\n      },\n      \"chargeflapacstatus\": {\n        \"state\": {\n          \"0\": \"Ouvert\",\n          \"1\": \"Ferme\",\n          \"2\": \"Trappe pressee\",\n          \"3\": \"Inconnu\"\n        }\n      },\n      \"chargeflapdcstatus\": {\n        \"state\": {\n          \"0\": \"Ouvert\",\n          \"1\": \"Ferme\",\n          \"2\": \"Trappe pressee\",\n          \"3\": \"Inconnu\"\n        }\n      },\n      \"chargingstatus\": {\n        \"state\": {\n          \"0\": \"en charge\",\n          \"1\": \"fin de charge\",\n          \"2\": \"Pause de charge\",\n          \"3\": \"debranche\",\n          \"4\": \"erreur\",\n          \"5\": \"lente\",\n          \"6\": \"rapide\",\n          \"7\": \"en decharge\",\n          \"8\": \"pas en charge\",\n          \"9\": \"charge lente apres avoir atteint l'objectif du trajet\",\n          \"10\": \"en charge apres avoir atteint l'objectif du trajet\",\n          \"11\": \"charge rapide apres avoir atteint l'objectif du trajet\",\n          \"12\": \"Connecte\",\n          \"13\": \"Charge CA\",\n          \"14\": \"Charge CC\",\n          \"15\": \"Calibrage de la batterie en cours\",\n          \"16\": \"inconnu\"\n        }\n      },\n      \"departuretimemode\": {\n        \"state\": {\n          \"0\": \"Desactive\",\n          \"1\": \"Quotidien\",\n          \"2\": \"Hebdomadaire\"\n        }\n      },\n      \"ignitionstate\": {\n        \"state\": {\n          \"0\": \"Verrouille\",\n          \"1\": \"Eteint\",\n          \"2\": \"Accessoire\",\n          \"4\": \"Allume\",\n          \"5\": \"Demarrage\"\n        }\n      },\n      \"interiorprotectionsensorstatus\": {\n        \"state\": {\n          \"0\": \"Non actif\",\n          \"1\": \"Non actif\",\n          \"2\": \"Actif\"\n        },\n        \"state_attributes\": {}\n      },\n      \"lock\": {\n        \"state\": {\n          \"0\": \"Deverrouille\",\n          \"1\": \"Verrouille int.\",\n          \"2\": \"Verrouille\",\n          \"3\": \"Partiellement deverrouille\",\n          \"4\": \"Inconnu\"\n        },\n        \"state_attributes\": {\n          \"decklidstatus\": {\n            \"name\": \"Couvercle de coffre\",\n            \"state\": {\n              \"false\": \"ferme\",\n              \"true\": \"ouvert\"\n            }\n          },\n          \"doorstatusfrontleft\": {\n            \"name\": \"Porte avant gauche\",\n            \"state\": {\n              \"false\": \"fermee\",\n              \"true\": \"ouverte\"\n            }\n          },\n          \"doorstatusfrontright\": {\n            \"name\": \"Porte avant droite\",\n            \"state\": {\n              \"false\": \"fermee\",\n              \"true\": \"ouverte\"\n            }\n          },\n          \"doorstatusrearleft\": {\n            \"name\": \"Porte arriere gauche\",\n            \"state\": {\n              \"false\": \"fermee\",\n              \"true\": \"ouverte\"\n            }\n          },\n          \"doorstatusrearright\": {\n            \"name\": \"Porte arriere droite\",\n            \"state\": {\n              \"false\": \"fermee\",\n              \"true\": \"ouverte\"\n            }\n          },\n          \"doorlockstatusfrontleft\": {\n            \"name\": \"Serrure porte avant gauche\",\n            \"state\": {\n              \"false\": \"verrouillee\",\n              \"true\": \"deverrouillee\"\n            }\n          },\n          \"doorlockstatusfrontright\": {\n            \"name\": \"Serrure porte avant droite\",\n            \"state\": {\n              \"false\": \"verrouillee\",\n              \"true\": \"deverrouillee\"\n            }\n          },\n          \"doorlockstatusrearleft\": {\n            \"name\": \"Serrure porte arriere gauche\",\n            \"state\": {\n              \"false\": \"verrouillee\",\n              \"true\": \"deverrouillee\"\n            }\n          },\n          \"doorlockstatusrearright\": {\n            \"name\": \"Serrure porte arriere droite\",\n            \"state\": {\n              \"false\": \"verrouillee\",\n              \"true\": \"deverrouillee\"\n            }\n          },\n          \"doorlockstatusgas\": {\n            \"name\": \"Serrure du reservoir\",\n            \"state\": {\n              \"false\": \"verrouillee\",\n              \"true\": \"deverrouillee\"\n            }\n          },\n          \"enginehoodstatus\": {\n            \"name\": \"Capot moteur\",\n            \"state\": {\n              \"false\": \"ferme\",\n              \"true\": \"ouvert\"\n            }\n          },\n          \"doorstatusoverall\": {\n            \"name\": \"Etat general des portes\",\n            \"state\": {\n              \"0\": \"ouvert\",\n              \"1\": \"ferme\",\n              \"2\": \"inexistant\",\n              \"3\": \"inconnu\"\n            }\n          },\n          \"sunroofstatus\": {\n            \"name\": \"Etat du toit ouvrant\",\n            \"state\": {\n              \"0\": \"ferme\",\n              \"1\": \"ouvert\",\n              \"2\": \"ouverture basculante\",\n              \"3\": \"en mouvement\",\n              \"4\": \"position anti-vibration\",\n              \"5\": \"coulissement intermediaire\",\n              \"6\": \"basculement intermediaire\",\n              \"7\": \"en ouverture\",\n              \"8\": \"en fermeture\",\n              \"9\": \"basculement anti-vibration\",\n              \"10\": \"position intermediaire\",\n              \"11\": \"ouverture basculante\",\n              \"12\": \"fermeture basculante\"\n            }\n          }\n        }\n      },\n      \"sunroofstatus\": {\n        \"state\": {\n          \"0\": \"Ferme\",\n          \"1\": \"Ouvert\",\n          \"2\": \"Ouverture basculante\",\n          \"3\": \"En mouvement\",\n          \"4\": \"Anti-vibration\",\n          \"5\": \"Coulissement intermediaire\",\n          \"6\": \"Basculement intermediaire\",\n          \"7\": \"En ouverture\",\n          \"8\": \"En fermeture\",\n          \"9\": \"Basculement anti-vibration\",\n          \"10\": \"Position intermediaire\",\n          \"11\": \"Ouverture basculante\",\n          \"12\": \"Fermeture basculante\"\n        },\n        \"state_attributes\": {}\n      },\n      \"starterbatterystate\": {\n        \"state\": {\n          \"0\": \"Vert\",\n          \"1\": \"Jaune\",\n          \"2\": \"Rouge\"\n        }\n      },\n      \"tirewarningsrdk\": {\n        \"state\": {\n          \"0\": \"Aucun avertissement\",\n          \"1\": \"Avertissement leger\",\n          \"2\": \"Pression basse\",\n          \"3\": \"Degonflement\"\n        }\n      },\n      \"selectedchargeprogram\": {\n        \"state\": {\n          \"0\": \"Standard\",\n          \"2\": \"Domicile\",\n          \"3\": \"Travail\",\n          \"4\": \"Non pris en charge\"\n        }\n      }\n    },\n    \"switch\": {\n      \"auxheat\": {\n        \"name\": \"Chauffage auxiliaire\"\n      },\n      \"precond\": {\n        \"name\": \"Climatisation avant montee\"\n      }\n    },\n    \"button\": {\n      \"btn_preheat_start_now\": {\n        \"name\": \"Demarrer la preclimatisation\"\n      },\n      \"btn_preheat_stop_now\": {\n        \"name\": \"Arreter la preclimatisation\"\n      },\n      \"btn_sigpos_start_now\": {\n        \"name\": \"Appel de phares\"\n      }\n    }\n  },\n  \"selector\": {\n    \"charge_program\": {\n      \"options\": {\n        \"0\": \"Defaut\",\n        \"2\": \"Domicile\",\n        \"3\": \"Travail\"\n      }\n    },\n    \"charging_break_clocktimer_configure_action\": {\n      \"options\": {\n        \"notset\": \"Non defini\",\n        \"active\": \"Actif\",\n        \"inactive\": \"Inactif\"\n      }\n    },\n    \"temperature_configure\": {\n      \"options\": {\n        \"0\": \"Basse\",\n        \"30\": \"Haute\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/he.json",
    "content": "{\n  \"config\": {\n    \"abort\": {\n      \"already_configured\": \"הרכיב כבר מוגדר.\",\n      \"reauth_successful\": \"האימות החוזר הצליח! הרכיב בתהליך טעינה.\"\n    },\n    \"error\": {\n      \"cannot_connect\": \"cannot_connect\",\n      \"invalid_auth\": \"invalid_auth\",\n      \"unknown\": \"שגיאה לא מוכרת, בדוק את יומן המערכת לפרטים נוספים.\",\n      \"2fa_required\": \"חשבונות עם אימות דו-שלבי (2FA) אינם נתמכים.\",\n      \"legal_terms\": \"עליך לאשר את התנאים המשפטיים באתר מרצדס תחילה\"\n    },\n    \"step\": {\n      \"user\": {\n        \"data\": {\n          \"region\": \"אזור\"\n        },\n        \"description\": \"בחר את האזור שלך.\",\n        \"title\": \"הגדרת חיבור Mercedes ME 2020\"\n      },\n      \"credentials\": {\n        \"data\": {\n          \"username\": \"שם משתמש MB (כתובת דוא\\\"ל)\",\n          \"password\": \"סיסמה\"\n        },\n        \"description\": \"הזן את פרטי החשבון שלך.\",\n        \"title\": \"Mercedes ME 2020 - התחברות\"\n      },\n      \"pin\": {\n        \"data\": {\n          \"password\": \"TAN (התקבל בדוא\\\"ל או SMS)\"\n        },\n        \"description\": \"הזן את קוד ה-TAN שקיבלת בדוא\\\"ל או SMS כדי להשלים את האימות. אם לא קיבלת TAN, בדוק את תיבת הדוא\\\"ל שלך (כולל תיקיית ספאם) או את הודעות ה-SMS שלך.\",\n        \"title\": \"Mercedes ME 2020 - TAN\"\n      }\n    }\n  },\n  \"issues\": {\n    \"restart_required\": {\n      \"fix_flow\": {\n        \"step\": {\n          \"confirm_restart\": {\n            \"description\": \"בצע הפעלה מחדש למערכת על מנת לסיים את עדכון האימות.\",\n            \"title\": \"דרושה הפעלה מחדש\"\n          }\n        }\n      },\n      \"title\": \"דרושה הפעלה מחדש\"\n    }\n  },\n  \"options\": {\n    \"abort\": {\n      \"already_configured\": \"הרכיב כבר מוגדר.\",\n      \"reauth_successful\": \"האימות החוזר הצליח! הרכיב בתהליך טעינה.\"\n    },\n    \"step\": {\n      \"init\": {\n        \"data\": {\n          \"cap_check_disabled\": \"בטל בדיקת תאימות\",\n          \"enable_china_gcj_02\": \"הפעל תרגום GCJ-02 (סין בלבד)\",\n          \"delete_auth_file\": \"מחק טוקן אימות עכשיו, מצריך הפעלה מחדש לאחר השמירה.\",\n          \"excluded_cars\": \"מספרי VIN להתעלמות (מופרדים בפסיקים)\",\n          \"pin\": \"PIN אבטחה (צריך ליצור באפליקציה)\",\n          \"save_files\": \"ניפוי באגים בלבד: שמור הודעות שרת לתיקיית הודעות\",\n          \"overwrite_cap_precondnow\": \"ניסיוני: דרוס יכולת precondnow (קבע כ-true)\"\n        },\n        \"description\": \"הגדר את האפשרויות. חלק מהשינויים מצריכים הפעלה מחדש.\",\n        \"title\": \"אפשרויות Mercedes ME 2020\"\n      }\n    }\n  },\n  \"system_health\": {\n    \"info\": {\n      \"api_endpoint_reachable\": \"MB API זמין\",\n      \"websocket_connection_state\": \"MB WS מצב\",\n      \"cars_connected\": \"רכבים מחוברים\",\n      \"version\": \"גרסה\"\n    }\n  },\n  \"services\": {\n    \"refresh_access_token\": {\n      \"name\": \"רענן טוקן גישה\",\n      \"description\": \"רענן את טוקן הגישה ל-API\"\n    },\n    \"auxheat_configure\": {\n      \"name\": \"הגדרת חימום עזר\",\n      \"description\": \"פקודה להגדרת חימום העזר. ניתן להגדיר שלושה זמנים ולבחור זמן פעיל אחד.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"time_selection\": {\n          \"name\": \"בחירת זמן\",\n          \"description\": \"זמן חימום עזר מוגדר מראש שהופעל (0=ללא בחירה, 1=time_1, 2=time_2, 3=time_3)\"\n        },\n        \"time_1\": {\n          \"name\": \"time_1\",\n          \"description\": \"שעה ביום בדקות לאחר חצות. לדוגמה, ערך תקין עבור 8 בבוקר הוא 480. טווח ערכים הוא 0 עד 1439.\"\n        },\n        \"time_2\": {\n          \"name\": \"time_2\",\n          \"description\": \"שעה ביום בדקות לאחר חצות. לדוגמה, ערך תקין עבור 8 בבוקר הוא 480. טווח ערכים הוא 0 עד 1439.\"\n        },\n        \"time_3\": {\n          \"name\": \"time_3\",\n          \"description\": \"שעה ביום בדקות לאחר חצות. לדוגמה, ערך תקין עבור 8 בבוקר הוא 480. טווח ערכים הוא 0 עד 1439.\"\n        }\n      }\n    },\n    \"auxheat_start\": {\n      \"name\": \"הפעלת חימום עזר\",\n      \"description\": \"הפעל את חימום העזר של רכב לפי מספר Vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        }\n      }\n    },\n    \"auxheat_stop\": {\n      \"name\": \"כיבוי חימום עזר\",\n      \"description\": \"כבה את חימום העזר של רכב לפי מספר Vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        }\n      }\n    },\n    \"battery_max_soc_configure\": {\n      \"name\": \"הגדרת מקסימום טעינת סוללה\",\n      \"description\": \"הגדר את הערך המקסימלי למצב הטעינה של סוללת ה-HV של רכב לפי מספר Vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"max_soc\": {\n          \"name\": \"Max Soc\",\n          \"description\": \"הערך המקסימלי למצב הטעינה של סוללת ה-HV (הערך צריך להיות בין 50 (חלק מהרכבים החדשים כמו CLA 2025 תומכים ב-30) ל-100 ומתחלק ב-10)\"\n        },\n        \"charge_program\": {\n          \"name\": \"תוכנית טעינה\",\n          \"description\": \"(אופציונלי, ברירת מחדל=0) תוכנית טעינה לשינוי (0=ברירת מחדל, 2=בית, 3=עבודה) (לא בשימוש ב-CLA 2025)\"\n        }\n      }\n    },\n    \"charge_program_configure\": {\n      \"name\": \"הגדרת תוכנית טעינה\",\n      \"description\": \"פקודה לבחירת תוכנית הטעינה.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"charge_program\": {\n          \"name\": \"תוכנית טעינה\",\n          \"description\": \"תוכנית הטעינה המופעלת (0=ברירת מחדל, 2=בית, 3=עבודה)\"\n        },\n        \"max_soc\": {\n          \"name\": \"Max Soc\",\n          \"description\": \"הערך המקסימלי למצב הטעינה של סוללת ה-HV (הערך צריך להיות בין 50 ל-100 ומתחלק ב-10)\"\n        }\n      }\n    },\n    \"doors_unlock\": {\n      \"name\": \"פתיחת דלתות\",\n      \"description\": \"פתח דלתות רכב לפי מספר Vin. נדרשת הגדרת PIN. ראה דיאלוג אפשרויות האינטגרציה.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"קוד PIN אבטחה, נדרש אם לא נשמר בהגדרות.\"\n        }\n      }\n    },\n    \"doors_lock\": {\n      \"name\": \"נעילת דלתות\",\n      \"description\": \"נעל דלתות רכב לפי מספר Vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        }\n      }\n    },\n    \"download_images\": {\n      \"name\": \"הורדת תמונות\",\n      \"description\": \"הורד את תמונות האפליקציה לתיקיית המשאבים של הרכיב עבור רכב לפי מספר Vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        }\n      }\n    },\n    \"engine_start\": {\n      \"name\": \"הפעלת מנוע\",\n      \"description\": \"הפעל את מנוע הרכב לפי מספר Vin. נדרשת הגדרת PIN. ראה דיאלוג אפשרויות האינטגרציה.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"קוד PIN אבטחה, נדרש אם לא נשמר בהגדרות.\"\n        }\n      }\n    },\n    \"engine_stop\": {\n      \"name\": \"כיבוי מנוע\",\n      \"description\": \"כבה את מנוע הרכב לפי מספר Vin. נדרשת הגדרת PIN. ראה דיאלוג אפשרויות האינטגרציה.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        }\n      }\n    },\n    \"hv_battery_start_conditioning\": {\n      \"name\": \"הפעלת מיזוג סוללת HV\",\n      \"description\": \"הפעל מיזוג סוללת HV של רכב לפי מספר Vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        }\n      }\n    },\n    \"hv_battery_stop_conditioning\": {\n      \"name\": \"כיבוי מיזוג סוללת HV\",\n      \"description\": \"כבה מיזוג סוללת HV של רכב לפי מספר Vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        }\n      }\n    },\n    \"preconditioning_configure_seats\": {\n      \"name\": \"הגדרת מיזוג מושבים מראש\",\n      \"description\": \"שלח פקודת הגדרת מיזוג מושבים מראש לרכב לפי מספר VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"front_left\": {\n          \"name\": \"קדמי שמאלי\",\n          \"description\": \"הפעל אם המושב הקדמי השמאלי צריך מיזוג מראש.\"\n        },\n        \"front_right\": {\n          \"name\": \"קדמי ימני\",\n          \"description\": \"הפעל אם המושב הקדמי הימני צריך מיזוג מראש.\"\n        },\n        \"rear_left\": {\n          \"name\": \"אחורי שמאלי\",\n          \"description\": \"הפעל אם המושב האחורי השמאלי צריך מיזוג מראש.\"\n        },\n        \"rear_right\": {\n          \"name\": \"אחורי ימני\",\n          \"description\": \"הפעל אם המושב האחורי הימני צריך מיזוג מראש.\"\n        }\n      }\n    },\n    \"preheat_start\": {\n      \"name\": \"הפעלת מיזוג מראש\",\n      \"description\": \"הפעל מיזוג מראש של רכב לפי מספר Vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"type\": {\n          \"name\": \"סוג\",\n          \"description\": \"שיטת ההפעלה. 0=עכשיו (ברירת מחדל), 1=מיידי - השתמש במיידי אם הרכב שלך לא תומך בעכשיו.\"\n        }\n      }\n    },\n    \"preheat_start_departure_time\": {\n      \"name\": \"הפעלת מיזוג מראש עם שעת יציאה\",\n      \"description\": \"הפעל מיזוג מראש של רכב לפי מספר Vin ושעת יציאה נתונה.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"time\": {\n          \"name\": \"שעה\",\n          \"description\": \"שעת יציאה בדקות לאחר חצות. לדוגמה, ערך תקין עבור 8 בבוקר הוא 480. טווח ערכים הוא 0 עד 1439.\"\n        }\n      }\n    },\n    \"preheat_stop\": {\n      \"name\": \"כיבוי מיזוג מראש\",\n      \"description\": \"כבה מיזוג מראש של רכב לפי מספר Vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        }\n      }\n    },\n    \"preheat_stop_departure_time\": {\n      \"name\": \"כיבוי מיזוג מראש מצב שעת יציאה\",\n      \"description\": \"כבה את מיזוג מראש בשעת יציאה מתוזמנת של רכב לפי מספר Vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        }\n      }\n    },\n    \"preconditioning_configure\": {\n      \"name\": \"הגדרת שעת יציאה למיזוג מראש\",\n      \"description\": \"הגדר מצב שעת יציאה למיזוג מראש. השתמש במצב 0 (מושבת) לביטול מיזוג מראש מתוזמן.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"departure_time_mode\": {\n          \"name\": \"מצב שעת יציאה\",\n          \"description\": \"0=מושבת, 1=יציאה חד-פעמית, 2=יציאה שבועית\"\n        },\n        \"departure_time\": {\n          \"name\": \"שעת יציאה\",\n          \"description\": \"שעת יציאה בדקות לאחר חצות (0-1439). בשימוש רק כאשר מצב > 0.\"\n        }\n      }\n    },\n    \"sigpos_start\": {\n      \"name\": \"הפעלת איתות מיקום\",\n      \"description\": \"הפעל איתות אור של רכב לפי מספר Vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        }\n      }\n    },\n    \"sunroof_open\": {\n      \"name\": \"פתיחת גג שמש\",\n      \"description\": \"פתח את גג השמש של רכב לפי מספר Vin. נדרשת הגדרת PIN. ראה דיאלוג אפשרויות האינטגרציה.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"קוד PIN אבטחה, נדרש אם לא נשמר בהגדרות.\"\n        }\n      }\n    },\n    \"sunroof_tilt\": {\n      \"name\": \"הטיית גג שמש\",\n      \"description\": \"הטה את גג השמש של רכב לפי מספר Vin. נדרשת הגדרת PIN. ראה דיאלוג אפשרויות האינטגרציה.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"קוד PIN אבטחה, נדרש אם לא נשמר בהגדרות.\"\n        }\n      }\n    },\n    \"sunroof_close\": {\n      \"name\": \"סגירת גג שמש\",\n      \"description\": \"סגור את גג השמש של רכב לפי מספר Vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        }\n      }\n    },\n    \"temperature_configure\": {\n      \"name\": \"הגדרת טמפרטורת יעד (מיזוג מראש/חימום עזר)\",\n      \"description\": \"הגדר את טמפרטורות היעד למיזוג מראש/חימום עזר עבור אזורים ברכב לפי מספר VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"front_left\": {\n          \"name\": \"קדמי שמאלי\",\n          \"description\": \"טמפרטורת יעד עבור האזור הקדמי השמאלי בצלזיוס.\"\n        },\n        \"front_right\": {\n          \"name\": \"קדמי ימני\",\n          \"description\": \"טמפרטורת יעד עבור האזור הקדמי הימני בצלזיוס.\"\n        },\n        \"rear_left\": {\n          \"name\": \"אחורי שמאלי\",\n          \"description\": \"טמפרטורת יעד עבור האזור האחורי השמאלי בצלזיוס. (אם זמין)\"\n        },\n        \"rear_right\": {\n          \"name\": \"אחורי ימני\",\n          \"description\": \"טמפרטורת יעד עבור האזור האחורי הימני בצלזיוס. (אם זמין)\"\n        }\n      }\n    },\n    \"windows_open\": {\n      \"name\": \"פתיחת חלונות\",\n      \"description\": \"פתח את חלונות הרכב לפי מספר Vin. נדרשת הגדרת PIN. ראה דיאלוג אפשרויות האינטגרציה.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"קוד PIN אבטחה, נדרש אם לא נשמר בהגדרות.\"\n        }\n      }\n    },\n    \"windows_close\": {\n      \"name\": \"סגירת חלונות\",\n      \"description\": \"סגור את חלונות הרכב לפי מספר Vin. נדרשת הגדרת PIN. ראה דיאלוג אפשרויות האינטגרציה.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        }\n      }\n    },\n    \"windows_move\": {\n      \"name\": \"הזזת חלונות\",\n      \"description\": \"הזז את חלונות הרכב לפי מספר Vin למיקום חדש. נדרשת הגדרת PIN. ראה דיאלוג אפשרויות האינטגרציה.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"קוד PIN אבטחה, נדרש אם לא נשמר בהגדרות.\"\n        },\n        \"front_left\": {\n          \"name\": \"קדמי שמאלי\",\n          \"description\": \"המיקום החדש של החלון הקדמי השמאלי (0=סגור, 10=אוורור, 100=פתוח)\"\n        },\n        \"front_right\": {\n          \"name\": \"קדמי ימני\",\n          \"description\": \"המיקום החדש של החלון הקדמי הימני (0=סגור, 10=אוורור, 100=פתוח)\"\n        },\n        \"rear_left\": {\n          \"name\": \"אחורי שמאלי\",\n          \"description\": \"המיקום החדש של החלון האחורי השמאלי (0=סגור, 10=אוורור, 100=פתוח)\"\n        },\n        \"rear_right\": {\n          \"name\": \"אחורי ימני\",\n          \"description\": \"המיקום החדש של החלון האחורי הימני (0=סגור, 10=אוורור, 100=פתוח)\"\n        }\n      }\n    },\n    \"send_route\": {\n      \"name\": \"שליחת מסלול\",\n      \"description\": \"שלח מסלול לרכב. (מיקום בודד בלבד)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"title\": {\n          \"name\": \"כותרת\",\n          \"description\": \"כותרת המסלול\"\n        },\n        \"latitude\": {\n          \"name\": \"קו רוחב\",\n          \"description\": \"קו הרוחב של המיקום\"\n        },\n        \"longitude\": {\n          \"name\": \"קו אורך\",\n          \"description\": \"קו האורך של המיקום\"\n        },\n        \"city\": {\n          \"name\": \"עיר\",\n          \"description\": \"שם העיר של המיקום\"\n        },\n        \"postcode\": {\n          \"name\": \"מיקוד\",\n          \"description\": \"מיקוד המיקום\"\n        },\n        \"street\": {\n          \"name\": \"רחוב\",\n          \"description\": \"שם הרחוב של המיקום\"\n        }\n      }\n    },\n    \"charging_break_clocktimer_configure\": {\n      \"name\": \"הגדרת טיימר הפסקת טעינה\",\n      \"description\": \"הגדר הפסקות טעינה (AC בלבד). פעולה זו תדרוס את כל ההגדרות עבור כל החריצים ברכב שלך.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin של הרכב\"\n        },\n        \"status_timer_1\": {\n          \"name\": \"מצב (טיימר 1)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_1\": {\n          \"name\": \"שעת התחלה (טיימר 1)\",\n          \"description\": \"שעת התחלה של חלון הפסקת הטעינה (טיימר 1)\"\n        },\n        \"stoptime_timer_1\": {\n          \"name\": \"שעת סיום (טיימר 1)\",\n          \"description\": \"שעת סיום של חלון הפסקת הטעינה (טיימר 1)\"\n        },\n        \"status_timer_2\": {\n          \"name\": \"מצב (טיימר 2)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_2\": {\n          \"name\": \"שעת התחלה (טיימר 2)\",\n          \"description\": \"שעת התחלה של חלון הפסקת הטעינה (טיימר 2)\"\n        },\n        \"stoptime_timer_2\": {\n          \"name\": \"שעת סיום (טיימר 2)\",\n          \"description\": \"שעת סיום של חלון הפסקת הטעינה (טיימר 2)\"\n        },\n        \"status_timer_3\": {\n          \"name\": \"מצב (טיימר 3)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_3\": {\n          \"name\": \"שעת התחלה (טיימר 3)\",\n          \"description\": \"שעת התחלה של חלון הפסקת הטעינה (טיימר 3)\"\n        },\n        \"stoptime_timer_3\": {\n          \"name\": \"שעת סיום (טיימר 3)\",\n          \"description\": \"שעת סיום של חלון הפסקת הטעינה (טיימר 3)\"\n        },\n        \"status_timer_4\": {\n          \"name\": \"מצב (טיימר 4)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_4\": {\n          \"name\": \"שעת התחלה (טיימר 4)\",\n          \"description\": \"שעת התחלה של חלון הפסקת הטעינה (טיימר 4)\"\n        },\n        \"stoptime_timer_4\": {\n          \"name\": \"שעת סיום (טיימר 4)\",\n          \"description\": \"שעת סיום של חלון הפסקת הטעינה (טיימר 4)\"\n        }\n      }\n    }\n  },\n  \"entity\": {\n    \"binary_sensor\": {\n      \"chargingactive\": {\n        \"name\": \"טעינה פעילה\"\n      }\n    },\n    \"sensor\": {\n      \"chargingpowerecolimit\": {\n        \"name\": \"מגבלת הספק טעינה\"\n      },\n      \"auxheatstatus\": {\n        \"state\": {\n          \"0\": \"לא פעיל\",\n          \"1\": \"חימום רגיל\",\n          \"2\": \"אוורור רגיל\",\n          \"3\": \"חימום ידני\",\n          \"4\": \"חימום נוסף\",\n          \"5\": \"אוורור נוסף\",\n          \"6\": \"חימום אוטומטי\"\n        }\n      },\n      \"chargeflapacstatus\": {\n        \"state\": {\n          \"0\": \"פתוח\",\n          \"1\": \"סגור\",\n          \"2\": \"מכסה לחוץ\",\n          \"3\": \"לא ידוע\"\n        }\n      },\n      \"chargeflapdcstatus\": {\n        \"state\": {\n          \"0\": \"פתוח\",\n          \"1\": \"סגור\",\n          \"2\": \"מכסה לחוץ\",\n          \"3\": \"לא ידוע\"\n        }\n      },\n      \"chargingstatus\": {\n        \"state\": {\n          \"0\": \"טוען\",\n          \"1\": \"הטעינה מסתיימת\",\n          \"2\": \"הפסקת טעינה\",\n          \"3\": \"לא מחובר\",\n          \"4\": \"תקלה\",\n          \"5\": \"טעינה איטית\",\n          \"6\": \"טעינה מהירה\",\n          \"7\": \"פורק\",\n          \"8\": \"לא טוען\",\n          \"9\": \"טעינה איטית לאחר הגעה ליעד נסיעה\",\n          \"10\": \"טעינה לאחר הגעה ליעד נסיעה\",\n          \"11\": \"טעינה מהירה לאחר הגעה ליעד נסיעה\",\n          \"12\": \"מחובר\",\n          \"13\": \"טעינת AC\",\n          \"14\": \"טעינת DC\",\n          \"15\": \"כיול סוללה פעיל\",\n          \"16\": \"לא ידוע\"\n        }\n      },\n      \"departuretimemode\": {\n        \"state\": {\n          \"0\": \"מושבת\",\n          \"1\": \"יומי\",\n          \"2\": \"שבועי\"\n        }\n      },\n      \"ignitionstate\": {\n        \"state\": {\n          \"0\": \"נעול\",\n          \"1\": \"כבוי\",\n          \"2\": \"אביזרים\",\n          \"4\": \"פועל\",\n          \"5\": \"התנעה\"\n        }\n      },\n      \"interiorprotectionsensorstatus\": {\n        \"state\": {\n          \"0\": \"לא פעיל\",\n          \"1\": \"לא פעיל\",\n          \"2\": \"פעיל\"\n        },\n        \"state_attributes\": {}\n      },\n      \"lock\": {\n        \"state\": {\n          \"0\": \"לא נעול\",\n          \"1\": \"נעול פנימית\",\n          \"2\": \"נעול\",\n          \"3\": \"נעול חלקית\",\n          \"4\": \"לא ידוע\"\n        },\n        \"state_attributes\": {\n          \"decklidstatus\": {\n            \"name\": \"מכסה תא מטען\",\n            \"state\": {\n              \"false\": \"סגור\",\n              \"true\": \"פתוח\"\n            }\n          },\n          \"doorstatusfrontleft\": {\n            \"name\": \"דלת קדמית שמאלית\",\n            \"state\": {\n              \"false\": \"סגור\",\n              \"true\": \"פתוח\"\n            }\n          },\n          \"doorstatusfrontright\": {\n            \"name\": \"דלת קדמית ימנית\",\n            \"state\": {\n              \"false\": \"סגור\",\n              \"true\": \"פתוח\"\n            }\n          },\n          \"doorstatusrearleft\": {\n            \"name\": \"דלת אחורית שמאלית\",\n            \"state\": {\n              \"false\": \"סגור\",\n              \"true\": \"פתוח\"\n            }\n          },\n          \"doorstatusrearright\": {\n            \"name\": \"דלת אחורית ימנית\",\n            \"state\": {\n              \"false\": \"סגור\",\n              \"true\": \"פתוח\"\n            }\n          },\n          \"doorlockstatusfrontleft\": {\n            \"name\": \"נעילת דלת קדמית שמאלית\",\n            \"state\": {\n              \"false\": \"נעול\",\n              \"true\": \"לא נעול\"\n            }\n          },\n          \"doorlockstatusfrontright\": {\n            \"name\": \"נעילת דלת קדמית ימנית\",\n            \"state\": {\n              \"false\": \"נעול\",\n              \"true\": \"לא נעול\"\n            }\n          },\n          \"doorlockstatusrearleft\": {\n            \"name\": \"נעילת דלת אחורית שמאלית\",\n            \"state\": {\n              \"false\": \"נעול\",\n              \"true\": \"לא נעול\"\n            }\n          },\n          \"doorlockstatusrearright\": {\n            \"name\": \"נעילת דלת אחורית ימנית\",\n            \"state\": {\n              \"false\": \"נעול\",\n              \"true\": \"לא נעול\"\n            }\n          },\n          \"doorlockstatusgas\": {\n            \"name\": \"נעילת פתח דלק\",\n            \"state\": {\n              \"false\": \"נעול\",\n              \"true\": \"לא נעול\"\n            }\n          },\n          \"enginehoodstatus\": {\n            \"name\": \"מכסה מנוע\",\n            \"state\": {\n              \"false\": \"סגור\",\n              \"true\": \"פתוח\"\n            }\n          },\n          \"doorstatusoverall\": {\n            \"name\": \"מצב דלתות כללי\",\n            \"state\": {\n              \"0\": \"פתוח\",\n              \"1\": \"סגור\",\n              \"2\": \"לא קיים\",\n              \"3\": \"לא ידוע\"\n            }\n          },\n          \"sunroofstatus\": {\n            \"name\": \"מצב גג שמש\",\n            \"state\": {\n              \"0\": \"סגור\",\n              \"1\": \"פתוח\",\n              \"2\": \"אוורור פתוח\",\n              \"3\": \"בתנועה\",\n              \"4\": \"מיקום נגד רעש\",\n              \"5\": \"הזזה ביניים\",\n              \"6\": \"הרמה ביניים\",\n              \"7\": \"פותח\",\n              \"8\": \"סוגר\",\n              \"9\": \"הרמה נגד רעש\",\n              \"10\": \"מיקום ביניים\",\n              \"11\": \"פתיחה בהרמה\",\n              \"12\": \"סגירה בהרמה\"\n            }\n          }\n        }\n      },\n      \"sunroofstatus\": {\n        \"state\": {\n          \"0\": \"סגור\",\n          \"1\": \"פתוח\",\n          \"2\": \"אוורור פתוח\",\n          \"3\": \"בתנועה\",\n          \"4\": \"נגד רעש\",\n          \"5\": \"הזזה ביניים\",\n          \"6\": \"הרמה ביניים\",\n          \"7\": \"פותח\",\n          \"8\": \"סוגר\",\n          \"9\": \"הרמה נגד רעש\",\n          \"10\": \"מיקום ביניים\",\n          \"11\": \"פתיחה בהרמה\",\n          \"12\": \"סגירה בהרמה\"\n        },\n        \"state_attributes\": {}\n      },\n      \"starterbatterystate\": {\n        \"state\": {\n          \"0\": \"ירוק\",\n          \"1\": \"צהוב\",\n          \"2\": \"אדום\"\n        }\n      },\n      \"tirewarningsrdk\": {\n        \"state\": {\n          \"0\": \"ללא אזהרה\",\n          \"1\": \"אזהרה קלה\",\n          \"2\": \"לחץ נמוך\",\n          \"3\": \"נקר\"\n        }\n      },\n      \"selectedchargeprogram\": {\n        \"state\": {\n          \"0\": \"רגיל\",\n          \"2\": \"בית\",\n          \"3\": \"עבודה\",\n          \"4\": \"לא נתמך\"\n        }\n      }\n    },\n    \"switch\": {\n      \"auxheat\": {\n        \"name\": \"חימום עזר\"\n      },\n      \"precond\": {\n        \"name\": \"מיזוג מראש\"\n      }\n    },\n    \"button\": {\n      \"btn_preheat_start_now\": {\n        \"name\": \"הפעלת מיזוג מראש\"\n      },\n      \"btn_preheat_stop_now\": {\n        \"name\": \"כיבוי מיזוג מראש\"\n      },\n      \"btn_sigpos_start_now\": {\n        \"name\": \"הבזקת אורות\"\n      }\n    }\n  },\n  \"selector\": {\n    \"charge_program\": {\n      \"options\": {\n        \"0\": \"ברירת מחדל\",\n        \"2\": \"בית\",\n        \"3\": \"עבודה\"\n      }\n    },\n    \"charging_break_clocktimer_configure_action\": {\n      \"options\": {\n        \"notset\": \"לא מוגדר\",\n        \"active\": \"פעיל\",\n        \"inactive\": \"לא פעיל\"\n      }\n    },\n    \"temperature_configure\": {\n      \"options\": {\n        \"0\": \"נמוך\",\n        \"30\": \"גבוה\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/it.json",
    "content": "{\n  \"config\": {\n    \"abort\": {\n      \"already_configured\": \"Componente già configurato.\",\n      \"reauth_successful\": \"Riautenticazione riuscita! Ricaricamento del componente in corso.\"\n    },\n    \"error\": {\n      \"cannot_connect\": \"cannot_connect\",\n      \"invalid_auth\": \"invalid_auth\",\n      \"unknown\": \"Errore sconosciuto. Controlla il registro di Home Assistant per ulteriori informazioni.\",\n      \"2fa_required\": \"Gli account con autenticazione a due fattori (2FA) non sono supportati.\",\n      \"legal_terms\": \"Devi prima accettare i termini legali sul sito web Mercedes\"\n    },\n    \"step\": {\n      \"user\": {\n        \"data\": {\n          \"region\": \"Regione\"\n        },\n        \"description\": \"Seleziona la tua regione.\",\n        \"title\": \"Configura la connessione Mercedes ME 2020\"\n      },\n      \"credentials\": {\n        \"data\": {\n          \"username\": \"Nome utente MB (indirizzo email)\",\n          \"password\": \"Password\"\n        },\n        \"description\": \"Inserisci i dati del tuo account.\",\n        \"title\": \"Mercedes ME 2020 - Accesso\"\n      },\n      \"pin\": {\n        \"data\": {\n          \"password\": \"TAN (ricevuto via email o SMS)\"\n        },\n        \"description\": \"Inserisci il TAN ricevuto via email o SMS per completare l'autenticazione. Se non hai ricevuto un TAN, controlla la tua casella email (e la cartella spam) o i tuoi messaggi SMS.\",\n        \"title\": \"Mercedes ME 2020 - TAN\"\n      }\n    }\n  },\n  \"issues\": {\n    \"restart_required\": {\n      \"fix_flow\": {\n        \"step\": {\n          \"confirm_restart\": {\n            \"description\": \"Il riavvio di Home Assistant è necessario per completare l'aggiornamento dell'autenticazione. Clicca su invia per riavviare ora.\",\n            \"title\": \"Riavvio necessario\"\n          }\n        }\n      },\n      \"title\": \"Riavvio necessario\"\n    }\n  },\n  \"options\": {\n    \"abort\": {\n      \"already_configured\": \"Componente già configurato.\",\n      \"reauth_successful\": \"Riautenticazione riuscita! Ricaricamento del componente in corso.\"\n    },\n    \"step\": {\n      \"init\": {\n        \"data\": {\n          \"cap_check_disabled\": \"Disabilita il controllo delle capacità\",\n          \"enable_china_gcj_02\": \"Abilita traduzione GCJ-02 (solo Cina)\",\n          \"delete_auth_file\": \"Elimina ora il token di autenticazione. Richiede il riavvio di Home Assistant dopo il salvataggio.\",\n          \"excluded_cars\": \"VIN esclusi (separati da virgola)\",\n          \"pin\": \"PIN di sicurezza (da creare nell'app mobile)\",\n          \"save_files\": \"SOLO DEBUG: Abilita il salvataggio dei messaggi del server nella cartella messaggi\",\n          \"overwrite_cap_precondnow\": \"Esp: Sovrascrivi capacità precondnow (imposta su true)\"\n        },\n        \"description\": \"Configura le opzioni. Alcuni cambiamenti richiedono il riavvio di Home Assistant.\",\n        \"title\": \"Mercedes ME 2020 - Opzioni\"\n      }\n    }\n  },\n  \"system_health\": {\n    \"info\": {\n      \"api_endpoint_reachable\": \"API MB raggiungibile\",\n      \"websocket_connection_state\": \"Stato WS MB\",\n      \"cars_connected\": \"Auto connesse\",\n      \"version\": \"Versione\"\n    }\n  },\n  \"services\": {\n    \"refresh_access_token\": {\n      \"name\": \"Aggiorna token di accesso\",\n      \"description\": \"Aggiorna il token di accesso API\"\n    },\n    \"auxheat_configure\": {\n      \"name\": \"Configura riscaldamento ausiliario\",\n      \"description\": \"Comando per configurare il riscaldamento ausiliario. È possibile definire tre orari e selezionare un orario attivo.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"time_selection\": {\n          \"name\": \"Selezione orario\",\n          \"description\": \"L'orario preimpostato attivato per il riscaldamento ausiliario (0=nessuna_selezione, 1=orario_1, 2=orario_2, 3=orario_3)\"\n        },\n        \"time_1\": {\n          \"name\": \"time_1\",\n          \"description\": \"Orario in minuti dopo la mezzanotte. Es. il valore valido per le 8:00 sarebbe 480. L'intervallo va da 0 a 1439.\"\n        },\n        \"time_2\": {\n          \"name\": \"time_2\",\n          \"description\": \"Orario in minuti dopo la mezzanotte. Es. il valore valido per le 8:00 sarebbe 480. L'intervallo va da 0 a 1439.\"\n        },\n        \"time_3\": {\n          \"name\": \"time_3\",\n          \"description\": \"Orario in minuti dopo la mezzanotte. Es. il valore valido per le 8:00 sarebbe 480. L'intervallo va da 0 a 1439.\"\n        }\n      }\n    },\n    \"auxheat_start\": {\n      \"name\": \"Avvia riscaldamento ausiliario\",\n      \"description\": \"Avvia il riscaldamento ausiliario di un'auto definita da un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        }\n      }\n    },\n    \"auxheat_stop\": {\n      \"name\": \"Arresta riscaldamento ausiliario\",\n      \"description\": \"Arresta il riscaldamento ausiliario di un'auto definita da un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        }\n      }\n    },\n    \"battery_max_soc_configure\": {\n      \"name\": \"Configura SOC massimo batteria\",\n      \"description\": \"Configura il valore massimo per lo stato di carica della batteria HV di un'auto definita da un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"max_soc\": {\n          \"name\": \"SOC massimo\",\n          \"description\": \"Il valore massimo per lo stato di carica della batteria HV (il valore deve essere compreso tra 50 (alcune auto nuove come la CLA 2025 supportano 30) e 100 e divisibile per dieci)\"\n        },\n        \"charge_program\": {\n          \"name\": \"Programma di ricarica\",\n          \"description\": \"(Opzionale, Predefinito=0) Programma di ricarica da modificare (0=Predefinito, 2=Casa, 3=Lavoro) (non utilizzato per la CLA 2025)\"\n        }\n      }\n    },\n    \"charge_program_configure\": {\n      \"name\": \"Configura programma di ricarica\",\n      \"description\": \"Comando per selezionare il programma di ricarica.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"charge_program\": {\n          \"name\": \"Programma di ricarica\",\n          \"description\": \"Il programma di ricarica attivato (0=Predefinito, 2=Casa, 3=Lavoro)\"\n        },\n        \"max_soc\": {\n          \"name\": \"SOC massimo\",\n          \"description\": \"Il valore massimo per lo stato di carica della batteria HV (il valore deve essere compreso tra 50 e 100 e divisibile per dieci)\"\n        }\n      }\n    },\n    \"doors_unlock\": {\n      \"name\": \"Sblocca portiere\",\n      \"description\": \"Sblocca un'auto definita da un VIN. Configurazione PIN necessaria. Vedi la finestra opzioni dell'integrazione.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN di sicurezza, necessario se non memorizzato nelle impostazioni.\"\n        }\n      }\n    },\n    \"doors_lock\": {\n      \"name\": \"Blocca portiere\",\n      \"description\": \"Blocca un'auto definita da un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        }\n      }\n    },\n    \"download_images\": {\n      \"name\": \"Scarica immagini\",\n      \"description\": \"Scarica le immagini dell'app nella cartella risorse del componente per un'auto definita da un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        }\n      }\n    },\n    \"engine_start\": {\n      \"name\": \"Avvia motore\",\n      \"description\": \"Avvia il motore di un'auto definita da un VIN. Configurazione PIN necessaria. Vedi la finestra opzioni dell'integrazione.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN di sicurezza, necessario se non memorizzato nelle impostazioni.\"\n        }\n      }\n    },\n    \"engine_stop\": {\n      \"name\": \"Arresta motore\",\n      \"description\": \"Arresta il motore di un'auto definita da un VIN. Configurazione PIN necessaria. Vedi la finestra opzioni dell'integrazione.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        }\n      }\n    },\n    \"hv_battery_start_conditioning\": {\n      \"name\": \"Avvia condizionamento batteria HV\",\n      \"description\": \"Avvia il condizionamento della batteria HV di un'auto definita da un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        }\n      }\n    },\n    \"hv_battery_stop_conditioning\": {\n      \"name\": \"Arresta condizionamento batteria HV\",\n      \"description\": \"Arresta il condizionamento della batteria HV di un'auto definita da un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        }\n      }\n    },\n    \"preconditioning_configure_seats\": {\n      \"name\": \"Configura precondizionamento sedili\",\n      \"description\": \"Invia un comando di configurazione precondizionamento sedili a un'auto definita da un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"front_left\": {\n          \"name\": \"Anteriore sinistro\",\n          \"description\": \"Attiva se il sedile anteriore sinistro deve essere precondizionato.\"\n        },\n        \"front_right\": {\n          \"name\": \"Anteriore destro\",\n          \"description\": \"Attiva se il sedile anteriore destro deve essere precondizionato.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Posteriore sinistro\",\n          \"description\": \"Attiva se il sedile posteriore sinistro deve essere precondizionato.\"\n        },\n        \"rear_right\": {\n          \"name\": \"Posteriore destro\",\n          \"description\": \"Attiva se il sedile posteriore destro deve essere precondizionato.\"\n        }\n      }\n    },\n    \"preheat_start\": {\n      \"name\": \"Avvia precondizionamento\",\n      \"description\": \"Avvia il precondizionamento di un'auto definita da un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"type\": {\n          \"name\": \"Tipo\",\n          \"description\": \"Metodo utilizzato per avviare il processo. 0=Ora (Predefinito), 1=Immediato - Usa Immediato se la tua auto non supporta Ora.\"\n        }\n      }\n    },\n    \"preheat_start_departure_time\": {\n      \"name\": \"Avvia precondizionamento con orario di partenza\",\n      \"description\": \"Avvia il precondizionamento di un'auto definita da un VIN e un orario di partenza specificato.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"time\": {\n          \"name\": \"Orario\",\n          \"description\": \"Orario di partenza in minuti dopo la mezzanotte. Es. il valore valido per le 8:00 sarebbe 480. L'intervallo va da 0 a 1439.\"\n        }\n      }\n    },\n    \"preheat_stop\": {\n      \"name\": \"Arresta precondizionamento\",\n      \"description\": \"Arresta il precondizionamento di un'auto definita da un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        }\n      }\n    },\n    \"preheat_stop_departure_time\": {\n      \"name\": \"Arresta precondizionamento modalità orario di partenza\",\n      \"description\": \"Arresta il precondizionamento con orario di partenza configurato di un'auto definita da un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        }\n      }\n    },\n    \"preconditioning_configure\": {\n      \"name\": \"Configura partenza precondizionamento\",\n      \"description\": \"Configura la modalità orario di partenza del precondizionamento. Usa la modalità 0 (Disabilitato) per annullare il precondizionamento programmato.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"departure_time_mode\": {\n          \"name\": \"Modalità orario di partenza\",\n          \"description\": \"0=Disabilitato, 1=Partenza singola, 2=Partenza settimanale\"\n        },\n        \"departure_time\": {\n          \"name\": \"Orario di partenza\",\n          \"description\": \"Orario di partenza in minuti dopo la mezzanotte (0-1439). Utilizzato solo quando la modalità > 0.\"\n        }\n      }\n    },\n    \"sigpos_start\": {\n      \"name\": \"Avvia segnalazione posizione\",\n      \"description\": \"Avvia la segnalazione luminosa di un'auto definita da un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        }\n      }\n    },\n    \"sunroof_open\": {\n      \"name\": \"Apri tetto apribile\",\n      \"description\": \"Apri il tetto apribile di un'auto definita da un VIN. Configurazione PIN necessaria. Vedi la finestra opzioni dell'integrazione.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN di sicurezza, necessario se non memorizzato nelle impostazioni.\"\n        }\n      }\n    },\n    \"sunroof_tilt\": {\n      \"name\": \"Inclina tetto apribile\",\n      \"description\": \"Inclina il tetto apribile di un'auto definita da un VIN. Configurazione PIN necessaria. Vedi la finestra opzioni dell'integrazione.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN di sicurezza, necessario se non memorizzato nelle impostazioni.\"\n        }\n      }\n    },\n    \"sunroof_close\": {\n      \"name\": \"Chiudi tetto apribile\",\n      \"description\": \"Chiudi il tetto apribile di un'auto definita da un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        }\n      }\n    },\n    \"temperature_configure\": {\n      \"name\": \"Configura temperatura target (precond/auxheat)\",\n      \"description\": \"Configura le temperature target di precondizionamento/riscaldamento ausiliario per le zone di un'auto definita da un VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"front_left\": {\n          \"name\": \"Anteriore sinistro\",\n          \"description\": \"Temperatura target per la zona anteriore sinistra in CELSIUS.\"\n        },\n        \"front_right\": {\n          \"name\": \"Anteriore destro\",\n          \"description\": \"Temperatura target per la zona anteriore destra in CELSIUS.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Posteriore sinistro\",\n          \"description\": \"Temperatura target per la zona posteriore sinistra in CELSIUS. (se disponibile)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Posteriore destro\",\n          \"description\": \"Temperatura target per la zona posteriore destra in CELSIUS. (se disponibile)\"\n        }\n      }\n    },\n    \"windows_open\": {\n      \"name\": \"Apri finestrini\",\n      \"description\": \"Apri i finestrini di un'auto definita da un VIN. Configurazione PIN necessaria. Vedi la finestra opzioni dell'integrazione.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN di sicurezza, necessario se non memorizzato nelle impostazioni.\"\n        }\n      }\n    },\n    \"windows_close\": {\n      \"name\": \"Chiudi finestrini\",\n      \"description\": \"Chiudi i finestrini di un'auto definita da un VIN. Configurazione PIN necessaria. Vedi la finestra opzioni dell'integrazione.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        }\n      }\n    },\n    \"windows_move\": {\n      \"name\": \"Muovi finestrini\",\n      \"description\": \"Muovi i finestrini di un'auto definita da un VIN in una nuova posizione. Configurazione PIN necessaria. Vedi la finestra opzioni dell'integrazione.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN di sicurezza, necessario se non memorizzato nelle impostazioni.\"\n        },\n        \"front_left\": {\n          \"name\": \"Anteriore sinistro\",\n          \"description\": \"La nuova posizione del finestrino anteriore sinistro (0=chiuso, 10=ventilazione, 100=aperto)\"\n        },\n        \"front_right\": {\n          \"name\": \"Anteriore destro\",\n          \"description\": \"La nuova posizione del finestrino anteriore destro (0=chiuso, 10=ventilazione, 100=aperto)\"\n        },\n        \"rear_left\": {\n          \"name\": \"Posteriore sinistro\",\n          \"description\": \"La nuova posizione del finestrino posteriore sinistro (0=chiuso, 10=ventilazione, 100=aperto)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Posteriore destro\",\n          \"description\": \"La nuova posizione del finestrino posteriore destro (0=chiuso, 10=ventilazione, 100=aperto)\"\n        }\n      }\n    },\n    \"send_route\": {\n      \"name\": \"Invia percorso\",\n      \"description\": \"Invia un percorso all'auto. (Solo posizione singola)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"title\": {\n          \"name\": \"Titolo\",\n          \"description\": \"Titolo del percorso\"\n        },\n        \"latitude\": {\n          \"name\": \"Latitudine\",\n          \"description\": \"Latitudine della posizione\"\n        },\n        \"longitude\": {\n          \"name\": \"Longitudine\",\n          \"description\": \"Longitudine della posizione\"\n        },\n        \"city\": {\n          \"name\": \"Città\",\n          \"description\": \"Nome della città della posizione\"\n        },\n        \"postcode\": {\n          \"name\": \"Codice postale\",\n          \"description\": \"Codice postale della posizione\"\n        },\n        \"street\": {\n          \"name\": \"Via\",\n          \"description\": \"Nome della via della posizione\"\n        }\n      }\n    },\n    \"charging_break_clocktimer_configure\": {\n      \"name\": \"Configura timer pause di ricarica\",\n      \"description\": \"Configura le pause di ricarica (solo AC). Questo sovrascriverà la configurazione completa per tutti gli slot nella tua auto.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin dell'auto\"\n        },\n        \"status_timer_1\": {\n          \"name\": \"Stato (Timer 1)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_1\": {\n          \"name\": \"Orario di inizio (Timer 1)\",\n          \"description\": \"Orario di inizio della finestra di pausa di ricarica (Timer 1)\"\n        },\n        \"stoptime_timer_1\": {\n          \"name\": \"Orario di fine (Timer 1)\",\n          \"description\": \"Orario di fine della finestra di pausa di ricarica (Timer 1)\"\n        },\n        \"status_timer_2\": {\n          \"name\": \"Stato (Timer 2)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_2\": {\n          \"name\": \"Orario di inizio (Timer 2)\",\n          \"description\": \"Orario di inizio della finestra di pausa di ricarica (Timer 2)\"\n        },\n        \"stoptime_timer_2\": {\n          \"name\": \"Orario di fine (Timer 2)\",\n          \"description\": \"Orario di fine della finestra di pausa di ricarica (Timer 2)\"\n        },\n        \"status_timer_3\": {\n          \"name\": \"Stato (Timer 3)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_3\": {\n          \"name\": \"Orario di inizio (Timer 3)\",\n          \"description\": \"Orario di inizio della finestra di pausa di ricarica (Timer 3)\"\n        },\n        \"stoptime_timer_3\": {\n          \"name\": \"Orario di fine (Timer 3)\",\n          \"description\": \"Orario di fine della finestra di pausa di ricarica (Timer 3)\"\n        },\n        \"status_timer_4\": {\n          \"name\": \"Stato (Timer 4)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_4\": {\n          \"name\": \"Orario di inizio (Timer 4)\",\n          \"description\": \"Orario di inizio della finestra di pausa di ricarica (Timer 4)\"\n        },\n        \"stoptime_timer_4\": {\n          \"name\": \"Orario di fine (Timer 4)\",\n          \"description\": \"Orario di fine della finestra di pausa di ricarica (Timer 4)\"\n        }\n      }\n    }\n  },\n  \"entity\": {\n    \"binary_sensor\": {\n      \"chargingactive\": {\n        \"name\": \"Ricarica attiva\"\n      }\n    },\n    \"sensor\": {\n      \"chargingpowerecolimit\": {\n        \"name\": \"Limite potenza di ricarica\"\n      },\n      \"auxheatstatus\": {\n        \"state\": {\n          \"0\": \"Inattivo\",\n          \"1\": \"Riscaldamento normale\",\n          \"2\": \"Ventilazione normale\",\n          \"3\": \"Riscaldamento manuale\",\n          \"4\": \"Post riscaldamento\",\n          \"5\": \"Post ventilazione\",\n          \"6\": \"Riscaldamento automatico\"\n        }\n      },\n      \"chargeflapacstatus\": {\n        \"state\": {\n          \"0\": \"Aperto\",\n          \"1\": \"Chiuso\",\n          \"2\": \"Sportellino premuto\",\n          \"3\": \"Sconosciuto\"\n        }\n      },\n      \"chargeflapdcstatus\": {\n        \"state\": {\n          \"0\": \"Aperto\",\n          \"1\": \"Chiuso\",\n          \"2\": \"Sportellino premuto\",\n          \"3\": \"Sconosciuto\"\n        }\n      },\n      \"chargingstatus\": {\n        \"state\": {\n          \"0\": \"In ricarica\",\n          \"1\": \"Ricarica in completamento\",\n          \"2\": \"Pausa di ricarica\",\n          \"3\": \"Scollegato\",\n          \"4\": \"Errore\",\n          \"5\": \"Lenta\",\n          \"6\": \"Veloce\",\n          \"7\": \"In scarica\",\n          \"8\": \"Non in ricarica\",\n          \"9\": \"Ricarica lenta dopo raggiungimento obiettivo viaggio\",\n          \"10\": \"In ricarica dopo raggiungimento obiettivo viaggio\",\n          \"11\": \"Ricarica veloce dopo raggiungimento obiettivo viaggio\",\n          \"12\": \"Collegato\",\n          \"13\": \"Ricarica AC\",\n          \"14\": \"Ricarica DC\",\n          \"15\": \"Calibrazione batteria attiva\",\n          \"16\": \"Sconosciuto\"\n        }\n      },\n      \"departuretimemode\": {\n        \"state\": {\n          \"0\": \"Disabilitato\",\n          \"1\": \"Giornaliero\",\n          \"2\": \"Settimanale\"\n        }\n      },\n      \"ignitionstate\": {\n        \"state\": {\n          \"0\": \"Bloccato\",\n          \"1\": \"Spento\",\n          \"2\": \"Accessorio\",\n          \"4\": \"Acceso\",\n          \"5\": \"Avviamento\"\n        }\n      },\n      \"interiorprotectionsensorstatus\": {\n        \"state\": {\n          \"0\": \"Non attivo\",\n          \"1\": \"Non attivo\",\n          \"2\": \"Attivo\"\n        },\n        \"state_attributes\": {}\n      },\n      \"lock\": {\n        \"state\": {\n          \"0\": \"Sbloccato\",\n          \"1\": \"Bloccato internamente\",\n          \"2\": \"Bloccato\",\n          \"3\": \"Parzialmente sbloccato\",\n          \"4\": \"Sconosciuto\"\n        },\n        \"state_attributes\": {\n          \"decklidstatus\": {\n            \"name\": \"Cofano posteriore\",\n            \"state\": {\n              \"false\": \"chiuso\",\n              \"true\": \"aperto\"\n            }\n          },\n          \"doorstatusfrontleft\": {\n            \"name\": \"Portiera anteriore sinistra\",\n            \"state\": {\n              \"false\": \"chiusa\",\n              \"true\": \"aperta\"\n            }\n          },\n          \"doorstatusfrontright\": {\n            \"name\": \"Portiera anteriore destra\",\n            \"state\": {\n              \"false\": \"chiusa\",\n              \"true\": \"aperta\"\n            }\n          },\n          \"doorstatusrearleft\": {\n            \"name\": \"Portiera posteriore sinistra\",\n            \"state\": {\n              \"false\": \"chiusa\",\n              \"true\": \"aperta\"\n            }\n          },\n          \"doorstatusrearright\": {\n            \"name\": \"Portiera posteriore destra\",\n            \"state\": {\n              \"false\": \"chiusa\",\n              \"true\": \"aperta\"\n            }\n          },\n          \"doorlockstatusfrontleft\": {\n            \"name\": \"Serratura anteriore sinistra\",\n            \"state\": {\n              \"false\": \"bloccata\",\n              \"true\": \"sbloccata\"\n            }\n          },\n          \"doorlockstatusfrontright\": {\n            \"name\": \"Serratura anteriore destra\",\n            \"state\": {\n              \"false\": \"bloccata\",\n              \"true\": \"sbloccata\"\n            }\n          },\n          \"doorlockstatusrearleft\": {\n            \"name\": \"Serratura posteriore sinistra\",\n            \"state\": {\n              \"false\": \"bloccata\",\n              \"true\": \"sbloccata\"\n            }\n          },\n          \"doorlockstatusrearright\": {\n            \"name\": \"Serratura posteriore destra\",\n            \"state\": {\n              \"false\": \"bloccata\",\n              \"true\": \"sbloccata\"\n            }\n          },\n          \"doorlockstatusgas\": {\n            \"name\": \"Serratura serbatoio\",\n            \"state\": {\n              \"false\": \"bloccata\",\n              \"true\": \"sbloccata\"\n            }\n          },\n          \"enginehoodstatus\": {\n            \"name\": \"Cofano motore\",\n            \"state\": {\n              \"false\": \"chiuso\",\n              \"true\": \"aperto\"\n            }\n          },\n          \"doorstatusoverall\": {\n            \"name\": \"Stato generale portiere\",\n            \"state\": {\n              \"0\": \"aperto\",\n              \"1\": \"chiuso\",\n              \"2\": \"non esistente\",\n              \"3\": \"sconosciuto\"\n            }\n          },\n          \"sunroofstatus\": {\n            \"name\": \"Stato tetto apribile\",\n            \"state\": {\n              \"0\": \"chiuso\",\n              \"1\": \"aperto\",\n              \"2\": \"sollevamento aperto\",\n              \"3\": \"in movimento\",\n              \"4\": \"posizione anti-vibrazione\",\n              \"5\": \"scorrimento intermedio\",\n              \"6\": \"sollevamento intermedio\",\n              \"7\": \"in apertura\",\n              \"8\": \"in chiusura\",\n              \"9\": \"sollevamento anti-vibrazione\",\n              \"10\": \"posizione intermedia\",\n              \"11\": \"apertura in sollevamento\",\n              \"12\": \"chiusura in sollevamento\"\n            }\n          }\n        }\n      },\n      \"sunroofstatus\": {\n        \"state\": {\n          \"0\": \"Chiuso\",\n          \"1\": \"Aperto\",\n          \"2\": \"Sollevamento aperto\",\n          \"3\": \"In movimento\",\n          \"4\": \"Anti vibrazione\",\n          \"5\": \"Scorrimento intermedio\",\n          \"6\": \"Sollevamento intermedio\",\n          \"7\": \"In apertura\",\n          \"8\": \"In chiusura\",\n          \"9\": \"Sollevamento anti vibrazione\",\n          \"10\": \"Posizione intermedia\",\n          \"11\": \"Apertura in sollevamento\",\n          \"12\": \"Chiusura in sollevamento\"\n        },\n        \"state_attributes\": {}\n      },\n      \"starterbatterystate\": {\n        \"state\": {\n          \"0\": \"Verde\",\n          \"1\": \"Giallo\",\n          \"2\": \"Rosso\"\n        }\n      },\n      \"tirewarningsrdk\": {\n        \"state\": {\n          \"0\": \"Nessun avviso\",\n          \"1\": \"Avviso leggero\",\n          \"2\": \"Pressione bassa\",\n          \"3\": \"Sgonfiamento\"\n        }\n      },\n      \"selectedchargeprogram\": {\n        \"state\": {\n          \"0\": \"Standard\",\n          \"2\": \"Casa\",\n          \"3\": \"Lavoro\",\n          \"4\": \"Non supportato\"\n        }\n      }\n    },\n    \"switch\": {\n      \"auxheat\": {\n        \"name\": \"Riscaldamento ausiliario\"\n      },\n      \"precond\": {\n        \"name\": \"Climatizzazione pre-ingresso\"\n      }\n    },\n    \"button\": {\n      \"btn_preheat_start_now\": {\n        \"name\": \"Avvia preclimatizzazione\"\n      },\n      \"btn_preheat_stop_now\": {\n        \"name\": \"Arresta preclimatizzazione\"\n      },\n      \"btn_sigpos_start_now\": {\n        \"name\": \"Lampeggia luci\"\n      }\n    }\n  },\n  \"selector\": {\n    \"charge_program\": {\n      \"options\": {\n        \"0\": \"Predefinito\",\n        \"2\": \"Casa\",\n        \"3\": \"Lavoro\"\n      }\n    },\n    \"charging_break_clocktimer_configure_action\": {\n      \"options\": {\n        \"notset\": \"Non impostato\",\n        \"active\": \"Attivo\",\n        \"inactive\": \"Inattivo\"\n      }\n    },\n    \"temperature_configure\": {\n      \"options\": {\n        \"0\": \"Bassa\",\n        \"30\": \"Alta\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/nb_NO.json",
    "content": "{\n  \"config\": {\n    \"abort\": {\n      \"already_configured\": \"Komponenten er allerede konfigurert.\",\n      \"reauth_successful\": \"Ny autentisering vellykket! Komponent lastes inn på nytt.\"\n    },\n    \"error\": {\n      \"cannot_connect\": \"cannot_connect\",\n      \"invalid_auth\": \"invalid_auth\",\n      \"unknown\": \"Ukjent feil. Sjekk Home Assistant-loggen for mer informasjon.\",\n      \"2fa_required\": \"Kontoer med tofaktorautentisering (2FA) støttes ikke.\",\n      \"legal_terms\": \"Du må godta de juridiske vilkårene på Mercedes-nettsiden først\"\n    },\n    \"step\": {\n      \"user\": {\n        \"data\": {\n          \"region\": \"Region\"\n        },\n        \"description\": \"Velg din region.\",\n        \"title\": \"Sett opp Mercedes ME 2020-tilkoblingen\"\n      },\n      \"credentials\": {\n        \"data\": {\n          \"username\": \"MB brukernavn (e-postadresse)\",\n          \"password\": \"Passord\"\n        },\n        \"description\": \"Skriv inn kontoinformasjonen din.\",\n        \"title\": \"Mercedes ME 2020 - Innlogging\"\n      },\n      \"pin\": {\n        \"data\": {\n          \"password\": \"TAN (mottatt via e-post eller SMS)\"\n        },\n        \"description\": \"Skriv inn TAN-koden du har mottatt via e-post eller SMS for å fullføre autentiseringen. Hvis du ikke har mottatt en TAN, sjekk innboksen din (og søppelpostmappen) eller SMS-meldingene dine.\",\n        \"title\": \"Mercedes ME 2020 - TAN\"\n      }\n    }\n  },\n  \"issues\": {\n    \"restart_required\": {\n      \"fix_flow\": {\n        \"step\": {\n          \"confirm_restart\": {\n            \"description\": \"Omstart av Home Assistant er nødvendig for å fullføre autentiseringsoppdateringen. Klikk send for å starte på nytt nå.\",\n            \"title\": \"Omstart påkrevd\"\n          }\n        }\n      },\n      \"title\": \"Omstart påkrevd\"\n    }\n  },\n  \"options\": {\n    \"abort\": {\n      \"already_configured\": \"Komponenten er allerede konfigurert.\",\n      \"reauth_successful\": \"Ny autentisering vellykket! Komponent lastes inn på nytt.\"\n    },\n    \"step\": {\n      \"init\": {\n        \"data\": {\n          \"cap_check_disabled\": \"Deaktiver funksjonssjekk\",\n          \"enable_china_gcj_02\": \"Aktiver GCJ-02-oversettelse (kun Kina)\",\n          \"delete_auth_file\": \"Slett autentiseringstoken nå. Krever omstart av Home Assistant etter lagring.\",\n          \"excluded_cars\": \"Ekskluderte VIN-numre (kommaseparert)\",\n          \"pin\": \"Sikkerhets-PIN (opprettes i mobilappen)\",\n          \"save_files\": \"KUN FEILSØKING: Aktiver lagring av servermeldinger til meldingsmappen\",\n          \"overwrite_cap_precondnow\": \"Eksp: Overskriv funksjon precondnow (sett til sann)\"\n        },\n        \"description\": \"Konfigurer alternativene dine. Noen endringer krever omstart av Home Assistant.\",\n        \"title\": \"Mercedes ME 2020-alternativer\"\n      }\n    }\n  },\n  \"system_health\": {\n    \"info\": {\n      \"api_endpoint_reachable\": \"MB API tilgjengelig\",\n      \"websocket_connection_state\": \"MB WS-tilstand\",\n      \"cars_connected\": \"Tilkoblede biler\",\n      \"version\": \"Versjon\"\n    }\n  },\n  \"services\": {\n    \"refresh_access_token\": {\n      \"name\": \"Oppdater tilgangstoken\",\n      \"description\": \"Oppdater API-tilgangstokenet\"\n    },\n    \"auxheat_configure\": {\n      \"name\": \"Konfigurer tilleggsvarme\",\n      \"description\": \"Kommando for å konfigurere tilleggsvarmen. Det er mulig å definere tre tidspunkter og velge ett aktivt tidspunkt.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"time_selection\": {\n          \"name\": \"Tidsvalg\",\n          \"description\": \"Det aktiverte forhåndsinnstilte tidspunktet for tilleggsvarme (0=ingen_valg, 1=tid_1, 2=tid_2, 3=tid_3)\"\n        },\n        \"time_1\": {\n          \"name\": \"time_1\",\n          \"description\": \"Tidspunkt i minutter etter midnatt. F.eks. er 480 en gyldig verdi for kl. 08.00. Verdiområdet er 0 til 1439.\"\n        },\n        \"time_2\": {\n          \"name\": \"time_2\",\n          \"description\": \"Tidspunkt i minutter etter midnatt. F.eks. er 480 en gyldig verdi for kl. 08.00. Verdiområdet er 0 til 1439.\"\n        },\n        \"time_3\": {\n          \"name\": \"time_3\",\n          \"description\": \"Tidspunkt i minutter etter midnatt. F.eks. er 480 en gyldig verdi for kl. 08.00. Verdiområdet er 0 til 1439.\"\n        }\n      }\n    },\n    \"auxheat_start\": {\n      \"name\": \"Start tilleggsvarme\",\n      \"description\": \"Start tilleggsvarmen for en bil definert av et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"auxheat_stop\": {\n      \"name\": \"Stopp tilleggsvarme\",\n      \"description\": \"Stopp tilleggsvarmen for en bil definert av et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"battery_max_soc_configure\": {\n      \"name\": \"Konfigurer maks ladenivå for batteri\",\n      \"description\": \"Konfigurer maksimalverdien for ladenivå (SoC) til høyspentbatteriet for en bil definert av et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"max_soc\": {\n          \"name\": \"Maks ladenivå\",\n          \"description\": \"Maksimalverdien for høyspentbatteriets ladenivå (verdien må være mellom 50 (noen nye biler som 2025 CLA støtter 30) og 100 og delelig med ti)\"\n        },\n        \"charge_program\": {\n          \"name\": \"Ladeprogram\",\n          \"description\": \"(Valgfritt, Standard=0) Ladeprogram som skal endres (0=Standard, 2=Hjem, 3=Jobb) (brukes ikke for 2025 CLA)\"\n        }\n      }\n    },\n    \"charge_program_configure\": {\n      \"name\": \"Konfigurer ladeprogram\",\n      \"description\": \"Kommando for å velge ladeprogram.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"charge_program\": {\n          \"name\": \"Ladeprogram\",\n          \"description\": \"Det aktiverte ladeprogrammet (0=Standard, 2=Hjem, 3=Jobb)\"\n        },\n        \"max_soc\": {\n          \"name\": \"Maks ladenivå\",\n          \"description\": \"Maksimalverdien for høyspentbatteriets ladenivå (verdien må være mellom 50 og 100 og delelig med ti)\"\n        }\n      }\n    },\n    \"doors_unlock\": {\n      \"name\": \"Lås opp dører\",\n      \"description\": \"Lås opp en bil definert av et VIN-nummer. PIN-oppsett påkrevd. Se alternativdialogen for integrasjonen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kode\",\n          \"description\": \"Sikkerhetskode, påkrevd hvis den ikke er lagret i innstillingene.\"\n        }\n      }\n    },\n    \"doors_lock\": {\n      \"name\": \"Lås dører\",\n      \"description\": \"Lås en bil definert av et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"download_images\": {\n      \"name\": \"Last ned bilder\",\n      \"description\": \"Laster ned app-bilder til komponentens ressursmappe for en bil definert av et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"engine_start\": {\n      \"name\": \"Start motor\",\n      \"description\": \"Start motoren på en bil definert av et VIN-nummer. PIN-oppsett påkrevd. Se alternativdialogen for integrasjonen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kode\",\n          \"description\": \"Sikkerhetskode, påkrevd hvis den ikke er lagret i innstillingene.\"\n        }\n      }\n    },\n    \"engine_stop\": {\n      \"name\": \"Stopp motor\",\n      \"description\": \"Stopp motoren på en bil definert av et VIN-nummer. PIN-oppsett påkrevd. Se alternativdialogen for integrasjonen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"hv_battery_start_conditioning\": {\n      \"name\": \"Start kondisjonering av høyspentbatteri\",\n      \"description\": \"Start kondisjoneringen av høyspentbatteriet for en bil definert av et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"hv_battery_stop_conditioning\": {\n      \"name\": \"Stopp kondisjonering av høyspentbatteri\",\n      \"description\": \"Stopp kondisjoneringen av høyspentbatteriet for en bil definert av et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"preconditioning_configure_seats\": {\n      \"name\": \"Konfigurer seter for forklimatisering\",\n      \"description\": \"Send en konfigureringskommando for seteklimatisering til en bil definert av et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"front_left\": {\n          \"name\": \"Venstre foran\",\n          \"description\": \"Aktiver hvis venstre forsete skal forklimatiseres.\"\n        },\n        \"front_right\": {\n          \"name\": \"Høyre foran\",\n          \"description\": \"Aktiver hvis høyre forsete skal forklimatiseres.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Venstre bak\",\n          \"description\": \"Aktiver hvis venstre baksete skal forklimatiseres.\"\n        },\n        \"rear_right\": {\n          \"name\": \"Høyre bak\",\n          \"description\": \"Aktiver hvis høyre baksete skal forklimatiseres.\"\n        }\n      }\n    },\n    \"preheat_start\": {\n      \"name\": \"Start forklimatisering\",\n      \"description\": \"Start forklimatiseringen for en bil definert av et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"type\": {\n          \"name\": \"Type\",\n          \"description\": \"Metode som brukes for å starte prosessen. 0=Nå (Standard), 1=Umiddelbart - Bruk Umiddelbart hvis bilen din ikke støtter Nå.\"\n        }\n      }\n    },\n    \"preheat_start_departure_time\": {\n      \"name\": \"Start forklimatisering med avreisetid\",\n      \"description\": \"Start forklimatiseringen for en bil definert av et VIN-nummer og en angitt avreisetid.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"time\": {\n          \"name\": \"Tid\",\n          \"description\": \"Avreisetid i minutter etter midnatt. F.eks. er 480 en gyldig verdi for kl. 08.00. Verdiområdet er 0 til 1439.\"\n        }\n      }\n    },\n    \"preheat_stop\": {\n      \"name\": \"Stopp forklimatisering\",\n      \"description\": \"Stopp forklimatiseringen for en bil definert av et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"preheat_stop_departure_time\": {\n      \"name\": \"Stopp forklimatisering for avreisetid\",\n      \"description\": \"Stopp den konfigurerte forklimatiseringen for avreisetid for en bil definert av et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"preconditioning_configure\": {\n      \"name\": \"Konfigurer forklimatisering for avreise\",\n      \"description\": \"Konfigurer modus for forklimatisering ved avreise. Bruk modus 0 (Deaktivert) for å avbryte planlagt forklimatisering ved avreise.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"departure_time_mode\": {\n          \"name\": \"Avreisetidsmodus\",\n          \"description\": \"0=Deaktivert, 1=Enkeltavreise, 2=Ukentlig avreise\"\n        },\n        \"departure_time\": {\n          \"name\": \"Avreisetid\",\n          \"description\": \"Avreisetid i minutter etter midnatt (0-1439). Brukes kun når modus > 0.\"\n        }\n      }\n    },\n    \"sigpos_start\": {\n      \"name\": \"Start signalposisjon\",\n      \"description\": \"Start lyssignalering for en bil definert av et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"sunroof_open\": {\n      \"name\": \"Åpne soltak\",\n      \"description\": \"Åpne soltaket på en bil definert av et VIN-nummer. PIN-oppsett påkrevd. Se alternativdialogen for integrasjonen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kode\",\n          \"description\": \"Sikkerhetskode, påkrevd hvis den ikke er lagret i innstillingene.\"\n        }\n      }\n    },\n    \"sunroof_tilt\": {\n      \"name\": \"Vipp soltak\",\n      \"description\": \"Vipp soltaket på en bil definert av et VIN-nummer. PIN-oppsett påkrevd. Se alternativdialogen for integrasjonen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kode\",\n          \"description\": \"Sikkerhetskode, påkrevd hvis den ikke er lagret i innstillingene.\"\n        }\n      }\n    },\n    \"sunroof_close\": {\n      \"name\": \"Lukk soltak\",\n      \"description\": \"Lukk soltaket på en bil definert av et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"temperature_configure\": {\n      \"name\": \"Konfigurer måltemperatur (forklimatisering/tilleggsvarme)\",\n      \"description\": \"Konfigurer måltemperaturer for forklimatisering/tilleggsvarme for soner i en bil definert av et VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"front_left\": {\n          \"name\": \"Venstre foran\",\n          \"description\": \"Måltemperatur for sonen venstre foran i CELSIUS.\"\n        },\n        \"front_right\": {\n          \"name\": \"Høyre foran\",\n          \"description\": \"Måltemperatur for sonen høyre foran i CELSIUS.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Venstre bak\",\n          \"description\": \"Måltemperatur for sonen venstre bak i CELSIUS. (hvis tilgjengelig)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Høyre bak\",\n          \"description\": \"Måltemperatur for sonen høyre bak i CELSIUS. (hvis tilgjengelig)\"\n        }\n      }\n    },\n    \"windows_open\": {\n      \"name\": \"Åpne vinduer\",\n      \"description\": \"Åpne vinduene på en bil definert av et VIN-nummer. PIN-oppsett påkrevd. Se alternativdialogen for integrasjonen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kode\",\n          \"description\": \"Sikkerhetskode, påkrevd hvis den ikke er lagret i innstillingene.\"\n        }\n      }\n    },\n    \"windows_close\": {\n      \"name\": \"Lukk vinduer\",\n      \"description\": \"Lukk vinduene på en bil definert av et VIN-nummer. PIN-oppsett påkrevd. Se alternativdialogen for integrasjonen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"windows_move\": {\n      \"name\": \"Flytt vinduer\",\n      \"description\": \"Flytt vinduene på en bil definert av et VIN-nummer til en ny posisjon. PIN-oppsett påkrevd. Se alternativdialogen for integrasjonen.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kode\",\n          \"description\": \"Sikkerhetskode, påkrevd hvis den ikke er lagret i innstillingene.\"\n        },\n        \"front_left\": {\n          \"name\": \"Venstre foran\",\n          \"description\": \"Den nye posisjonen til venstre frontvindu (0=lukket, 10=ventilering, 100=åpent)\"\n        },\n        \"front_right\": {\n          \"name\": \"Høyre foran\",\n          \"description\": \"Den nye posisjonen til høyre frontvindu (0=lukket, 10=ventilering, 100=åpent)\"\n        },\n        \"rear_left\": {\n          \"name\": \"Venstre bak\",\n          \"description\": \"Den nye posisjonen til venstre bakvindu (0=lukket, 10=ventilering, 100=åpent)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Høyre bak\",\n          \"description\": \"Den nye posisjonen til høyre bakvindu (0=lukket, 10=ventilering, 100=åpent)\"\n        }\n      }\n    },\n    \"send_route\": {\n      \"name\": \"Send rute\",\n      \"description\": \"Sender en rute til bilen. (Kun enkelt lokasjon)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"title\": {\n          \"name\": \"Tittel\",\n          \"description\": \"Rutens tittel\"\n        },\n        \"latitude\": {\n          \"name\": \"Breddegrad\",\n          \"description\": \"Lokasjonens breddegrad\"\n        },\n        \"longitude\": {\n          \"name\": \"Lengdegrad\",\n          \"description\": \"Lokasjonens lengdegrad\"\n        },\n        \"city\": {\n          \"name\": \"By\",\n          \"description\": \"Lokasjonens bynavn\"\n        },\n        \"postcode\": {\n          \"name\": \"Postnummer\",\n          \"description\": \"Lokasjonens postnummer\"\n        },\n        \"street\": {\n          \"name\": \"Gate\",\n          \"description\": \"Lokasjonens gatenavn\"\n        }\n      }\n    },\n    \"charging_break_clocktimer_configure\": {\n      \"name\": \"Konfigurer tidtaker for ladepause\",\n      \"description\": \"Konfigurer ladepauser (kun AC). Dette vil overskrive hele konfigurasjonen for alle plasser i bilen din.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"status_timer_1\": {\n          \"name\": \"Status (Tidtaker 1)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_1\": {\n          \"name\": \"Starttid (Tidtaker 1)\",\n          \"description\": \"Starttid for ladepausevinduet (Tidtaker 1)\"\n        },\n        \"stoptime_timer_1\": {\n          \"name\": \"Sluttid (Tidtaker 1)\",\n          \"description\": \"Sluttid for ladepausevinduet (Tidtaker 1)\"\n        },\n        \"status_timer_2\": {\n          \"name\": \"Status (Tidtaker 2)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_2\": {\n          \"name\": \"Starttid (Tidtaker 2)\",\n          \"description\": \"Starttid for ladepausevinduet (Tidtaker 2)\"\n        },\n        \"stoptime_timer_2\": {\n          \"name\": \"Sluttid (Tidtaker 2)\",\n          \"description\": \"Sluttid for ladepausevinduet (Tidtaker 2)\"\n        },\n        \"status_timer_3\": {\n          \"name\": \"Status (Tidtaker 3)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_3\": {\n          \"name\": \"Starttid (Tidtaker 3)\",\n          \"description\": \"Starttid for ladepausevinduet (Tidtaker 3)\"\n        },\n        \"stoptime_timer_3\": {\n          \"name\": \"Sluttid (Tidtaker 3)\",\n          \"description\": \"Sluttid for ladepausevinduet (Tidtaker 3)\"\n        },\n        \"status_timer_4\": {\n          \"name\": \"Status (Tidtaker 4)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_4\": {\n          \"name\": \"Starttid (Tidtaker 4)\",\n          \"description\": \"Starttid for ladepausevinduet (Tidtaker 4)\"\n        },\n        \"stoptime_timer_4\": {\n          \"name\": \"Sluttid (Tidtaker 4)\",\n          \"description\": \"Sluttid for ladepausevinduet (Tidtaker 4)\"\n        }\n      }\n    }\n  },\n  \"entity\": {\n    \"binary_sensor\": {\n      \"chargingactive\": {\n        \"name\": \"Lading aktiv\"\n      }\n    },\n    \"sensor\": {\n      \"chargingpowerecolimit\": {\n        \"name\": \"Ladeeffektgrense\"\n      },\n      \"auxheatstatus\": {\n        \"state\": {\n          \"0\": \"Inaktiv\",\n          \"1\": \"Normal oppvarming\",\n          \"2\": \"Normal ventilasjon\",\n          \"3\": \"Manuell oppvarming\",\n          \"4\": \"Ettervarming\",\n          \"5\": \"Etterventilasjon\",\n          \"6\": \"Automatisk oppvarming\"\n        }\n      },\n      \"chargeflapacstatus\": {\n        \"state\": {\n          \"0\": \"Åpen\",\n          \"1\": \"Lukket\",\n          \"2\": \"Luke trykket inn\",\n          \"3\": \"Ukjent\"\n        }\n      },\n      \"chargeflapdcstatus\": {\n        \"state\": {\n          \"0\": \"Åpen\",\n          \"1\": \"Lukket\",\n          \"2\": \"Luke trykket inn\",\n          \"3\": \"Ukjent\"\n        }\n      },\n      \"chargingstatus\": {\n        \"state\": {\n          \"0\": \"lader\",\n          \"1\": \"lading avsluttes\",\n          \"2\": \"Ladepause\",\n          \"3\": \"frakoblet\",\n          \"4\": \"feil\",\n          \"5\": \"langsom\",\n          \"6\": \"rask\",\n          \"7\": \"lader ut\",\n          \"8\": \"lader ikke\",\n          \"9\": \"langsom lading etter å ha nådd reisemål\",\n          \"10\": \"lading etter å ha nådd reisemål\",\n          \"11\": \"rask lading etter å ha nådd reisemål\",\n          \"12\": \"Tilkoblet\",\n          \"13\": \"AC-lading\",\n          \"14\": \"DC-lading\",\n          \"15\": \"Batterikalibrering aktiv\",\n          \"16\": \"ukjent\"\n        }\n      },\n      \"departuretimemode\": {\n        \"state\": {\n          \"0\": \"Deaktivert\",\n          \"1\": \"Daglig\",\n          \"2\": \"Ukentlig\"\n        }\n      },\n      \"ignitionstate\": {\n        \"state\": {\n          \"0\": \"Låst\",\n          \"1\": \"Av\",\n          \"2\": \"Tilbehør\",\n          \"4\": \"På\",\n          \"5\": \"Start\"\n        }\n      },\n      \"interiorprotectionsensorstatus\": {\n        \"state\": {\n          \"0\": \"Ikke aktiv\",\n          \"1\": \"Ikke aktiv\",\n          \"2\": \"Aktiv\"\n        },\n        \"state_attributes\": {}\n      },\n      \"lock\": {\n        \"state\": {\n          \"0\": \"Ulåst\",\n          \"1\": \"Låst internt\",\n          \"2\": \"Låst\",\n          \"3\": \"Delvis ulåst\",\n          \"4\": \"Ukjent\"\n        },\n        \"state_attributes\": {\n          \"decklidstatus\": {\n            \"name\": \"Bagasjelokk\",\n            \"state\": {\n              \"false\": \"lukket\",\n              \"true\": \"åpen\"\n            }\n          },\n          \"doorstatusfrontleft\": {\n            \"name\": \"Dør venstre foran\",\n            \"state\": {\n              \"false\": \"lukket\",\n              \"true\": \"åpen\"\n            }\n          },\n          \"doorstatusfrontright\": {\n            \"name\": \"Dør høyre foran\",\n            \"state\": {\n              \"false\": \"lukket\",\n              \"true\": \"åpen\"\n            }\n          },\n          \"doorstatusrearleft\": {\n            \"name\": \"Dør venstre bak\",\n            \"state\": {\n              \"false\": \"lukket\",\n              \"true\": \"åpen\"\n            }\n          },\n          \"doorstatusrearright\": {\n            \"name\": \"Dør høyre bak\",\n            \"state\": {\n              \"false\": \"lukket\",\n              \"true\": \"åpen\"\n            }\n          },\n          \"doorlockstatusfrontleft\": {\n            \"name\": \"Dørlås venstre foran\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"ulåst\"\n            }\n          },\n          \"doorlockstatusfrontright\": {\n            \"name\": \"Dørlås høyre foran\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"ulåst\"\n            }\n          },\n          \"doorlockstatusrearleft\": {\n            \"name\": \"Dørlås venstre bak\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"ulåst\"\n            }\n          },\n          \"doorlockstatusrearright\": {\n            \"name\": \"Dørlås høyre bak\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"ulåst\"\n            }\n          },\n          \"doorlockstatusgas\": {\n            \"name\": \"Tanklokk\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"ulåst\"\n            }\n          },\n          \"enginehoodstatus\": {\n            \"name\": \"Motorpanser\",\n            \"state\": {\n              \"false\": \"lukket\",\n              \"true\": \"åpen\"\n            }\n          },\n          \"doorstatusoverall\": {\n            \"name\": \"Samlet dørstatus\",\n            \"state\": {\n              \"0\": \"åpen\",\n              \"1\": \"lukket\",\n              \"2\": \"finnes ikke\",\n              \"3\": \"ukjent\"\n            }\n          },\n          \"sunroofstatus\": {\n            \"name\": \"Soltakstatus\",\n            \"state\": {\n              \"0\": \"lukket\",\n              \"1\": \"åpen\",\n              \"2\": \"vipp åpen\",\n              \"3\": \"i bevegelse\",\n              \"4\": \"vindavvisende posisjon\",\n              \"5\": \"mellomposisjon glidende\",\n              \"6\": \"mellomposisjon vipp\",\n              \"7\": \"åpner\",\n              \"8\": \"lukker\",\n              \"9\": \"vindavvisende vipp\",\n              \"10\": \"mellomposisjon\",\n              \"11\": \"åpner vipp\",\n              \"12\": \"lukker vipp\"\n            }\n          }\n        }\n      },\n      \"sunroofstatus\": {\n        \"state\": {\n          \"0\": \"Lukket\",\n          \"1\": \"Åpen\",\n          \"2\": \"Vipp åpen\",\n          \"3\": \"I bevegelse\",\n          \"4\": \"Vindavvisende posisjon\",\n          \"5\": \"Mellomposisjon glidende\",\n          \"6\": \"Mellomposisjon vipp\",\n          \"7\": \"Åpner\",\n          \"8\": \"Lukker\",\n          \"9\": \"Vindavvisende vipp\",\n          \"10\": \"Mellomposisjon\",\n          \"11\": \"Åpner vipp\",\n          \"12\": \"Lukker vipp\"\n        },\n        \"state_attributes\": {}\n      },\n      \"starterbatterystate\": {\n        \"state\": {\n          \"0\": \"Grønn\",\n          \"1\": \"Gul\",\n          \"2\": \"Rød\"\n        }\n      },\n      \"tirewarningsrdk\": {\n        \"state\": {\n          \"0\": \"Ingen advarsel\",\n          \"1\": \"Myk advarsel\",\n          \"2\": \"Lavt trykk\",\n          \"3\": \"Punktering\"\n        }\n      },\n      \"selectedchargeprogram\": {\n        \"state\": {\n          \"0\": \"Standard\",\n          \"2\": \"Hjem\",\n          \"3\": \"Jobb\",\n          \"4\": \"Støttes ikke\"\n        }\n      }\n    },\n    \"switch\": {\n      \"auxheat\": {\n        \"name\": \"Tilleggsvarme\"\n      },\n      \"precond\": {\n        \"name\": \"Forklimatisering\"\n      }\n    },\n    \"button\": {\n      \"btn_preheat_start_now\": {\n        \"name\": \"Start forklimatisering\"\n      },\n      \"btn_preheat_stop_now\": {\n        \"name\": \"Stopp forklimatisering\"\n      },\n      \"btn_sigpos_start_now\": {\n        \"name\": \"Blink med lysene\"\n      }\n    }\n  },\n  \"selector\": {\n    \"charge_program\": {\n      \"options\": {\n        \"0\": \"Standard\",\n        \"2\": \"Hjem\",\n        \"3\": \"Jobb\"\n      }\n    },\n    \"charging_break_clocktimer_configure_action\": {\n      \"options\": {\n        \"notset\": \"Ikke satt\",\n        \"active\": \"Aktiv\",\n        \"inactive\": \"Inaktiv\"\n      }\n    },\n    \"temperature_configure\": {\n      \"options\": {\n        \"0\": \"Lav\",\n        \"30\": \"Høy\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/nl.json",
    "content": "{\n  \"config\": {\n    \"abort\": {\n      \"already_configured\": \"Component is al geconfigureerd.\",\n      \"reauth_successful\": \"Herautorisatie succesvol! Component wordt opnieuw geladen.\"\n    },\n    \"error\": {\n      \"cannot_connect\": \"cannot_connect\",\n      \"invalid_auth\": \"invalid_auth\",\n      \"unknown\": \"Onbekende fout. Controleer de Home Assistant-log voor meer informatie.\",\n      \"2fa_required\": \"Tweefactorauthenticatie (2FA) accounts worden niet ondersteund.\",\n      \"legal_terms\": \"Je moet eerst de juridische voorwaarden op de Mercedes-website accepteren\"\n    },\n    \"step\": {\n      \"user\": {\n        \"data\": {\n          \"region\": \"Regio\"\n        },\n        \"description\": \"Selecteer je regio.\",\n        \"title\": \"Mercedes ME 2020 verbinding instellen\"\n      },\n      \"credentials\": {\n        \"data\": {\n          \"username\": \"MB gebruikersnaam (e-mailadres)\",\n          \"password\": \"Wachtwoord\"\n        },\n        \"description\": \"Voer je accountgegevens in.\",\n        \"title\": \"Mercedes ME 2020 - Inloggen\"\n      },\n      \"pin\": {\n        \"data\": {\n          \"password\": \"TAN (ontvangen via e-mail of sms)\"\n        },\n        \"description\": \"Voer de TAN in die je via e-mail of sms hebt ontvangen om de authenticatie te voltooien. Als je geen TAN hebt ontvangen, controleer dan je e-mailinbox (en spammap) of je sms-berichten.\",\n        \"title\": \"Mercedes ME 2020 - TAN\"\n      }\n    }\n  },\n  \"issues\": {\n    \"restart_required\": {\n      \"fix_flow\": {\n        \"step\": {\n          \"confirm_restart\": {\n            \"description\": \"Een herstart van Home Assistant is vereist om de autorisatie-update te voltooien. Klik op verzenden om nu opnieuw op te starten.\",\n            \"title\": \"Herstart vereist\"\n          }\n        }\n      },\n      \"title\": \"Herstart vereist\"\n    }\n  },\n  \"options\": {\n    \"abort\": {\n      \"already_configured\": \"Component is al geconfigureerd.\",\n      \"reauth_successful\": \"Herautorisatie succesvol! Component wordt opnieuw geladen.\"\n    },\n    \"step\": {\n      \"init\": {\n        \"data\": {\n          \"cap_check_disabled\": \"Schakel functiecontrole uit\",\n          \"enable_china_gcj_02\": \"Schakel GCJ-02-vertaling in (alleen China)\",\n          \"delete_auth_file\": \"Verwijder authenticatietoken nu. Vereist een herstart van Home Assistant na opslaan.\",\n          \"excluded_cars\": \"Uitgesloten chassisnummers (komma-gescheiden)\",\n          \"pin\": \"PIN-code (aan te maken in de mobiele app)\",\n          \"save_files\": \"ALLEEN DEBUG: Schakel het opslaan van serverberichten in de berichtenmap in\",\n          \"overwrite_cap_precondnow\": \"Exp: Overschrijf capability precondnow (zet op true)\"\n        },\n        \"description\": \"Configureer je opties. Sommige wijzigingen vereisen een herstart van Home Assistant.\",\n        \"title\": \"Mercedes ME 2020-opties\"\n      }\n    }\n  },\n  \"system_health\": {\n    \"info\": {\n      \"api_endpoint_reachable\": \"MB API bereikbaar\",\n      \"websocket_connection_state\": \"MB WS-status\",\n      \"cars_connected\": \"Verbonden auto's\",\n      \"version\": \"Versie\"\n    }\n  },\n  \"services\": {\n    \"refresh_access_token\": {\n      \"name\": \"Toegangstoken vernieuwen\",\n      \"description\": \"Vernieuw het API-toegangstoken\"\n    },\n    \"auxheat_configure\": {\n      \"name\": \"Hulpverwarming configureren\",\n      \"description\": \"Commando voor het configureren van de hulpverwarming. Het is mogelijk om drie dagtijden in te stellen en één actieve tijd te selecteren.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"time_selection\": {\n          \"name\": \"Tijdselectie\",\n          \"description\": \"De geactiveerde vooraf ingestelde tijd voor de extra verwarming (0=geen_selectie, 1=tijd_1, 2=tijd_2, 3=tijd_3)\"\n        },\n        \"time_1\": {\n          \"name\": \"tijd_1\",\n          \"description\": \"Tijd in minuten na middernacht. Bijvoorbeeld: een geldige waarde voor 8 uur 's ochtends is 480. Waardenbereik is 0 tot 1439.\"\n        },\n        \"time_2\": {\n          \"name\": \"tijd_2\",\n          \"description\": \"Tijd in minuten na middernacht. Bijvoorbeeld: een geldige waarde voor 8 uur 's ochtends is 480. Waardenbereik is 0 tot 1439.\"\n        },\n        \"time_3\": {\n          \"name\": \"tijd_3\",\n          \"description\": \"Tijd in minuten na middernacht. Bijvoorbeeld: een geldige waarde voor 8 uur 's ochtends is 480. Waardenbereik is 0 tot 1439.\"\n        }\n      }\n    },\n    \"auxheat_start\": {\n      \"name\": \"Hulpverwarming starten\",\n      \"description\": \"Start de hulpverwarming van een auto die wordt gedefinieerd door een VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        }\n      }\n    },\n    \"auxheat_stop\": {\n      \"name\": \"Hulpverwarming stoppen\",\n      \"description\": \"Stop de hulpverwarming van een auto die wordt gedefinieerd door een VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        }\n      }\n    },\n    \"battery_max_soc_configure\": {\n      \"name\": \"Maximale batterijladingswaarde configureren\",\n      \"description\": \"Configureer de maximale waarde voor de laadstatus van de HV-batterij van een auto die wordt gedefinieerd door een VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"max_soc\": {\n          \"name\": \"Maximale lading\",\n          \"description\": \"De maximale waarde voor de laadstatus van de HV-batterij (waarde moet tussen 50 (sommige nieuwe auto's zoals 2025 CLA ondersteunen 30) en 100 liggen en deelbaar zijn door tien)\"\n        },\n        \"charge_program\": {\n          \"name\": \"Laadprogramma\",\n          \"description\": \"(Optioneel, standaard=0) Het laadprogramma om te wijzigen (0=Standaard, 2=Thuis, 3=Werk) (niet gebruikt voor 2025 CLA)\"\n        }\n      }\n    },\n    \"charge_program_configure\": {\n      \"name\": \"Laadprogramma configureren\",\n      \"description\": \"Commando om het laadprogramma te selecteren.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"charge_program\": {\n          \"name\": \"Laadprogramma\",\n          \"description\": \"Het geactiveerde laadprogramma (0=Standaard, 2=Thuis, 3=Werk)\"\n        },\n        \"max_soc\": {\n          \"name\": \"Maximale lading\",\n          \"description\": \"De maximale waarde voor de laadstatus van de HV-batterij (waarde moet tussen 50 en 100 liggen en deelbaar zijn door tien)\"\n        }\n      }\n    },\n    \"doors_unlock\": {\n      \"name\": \"Deuren ontgrendelen\",\n      \"description\": \"Ontgrendel een auto die wordt gedefinieerd door een VIN. PIN-instelling vereist. Zie de optiedialoog van de integratie.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN-code, vereist als deze niet is opgeslagen in de instellingen.\"\n        }\n      }\n    },\n    \"doors_lock\": {\n      \"name\": \"Deuren vergrendelen\",\n      \"description\": \"Vergrendel een auto die wordt gedefinieerd door een VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        }\n      }\n    },\n    \"download_images\": {\n      \"name\": \"Afbeeldingen downloaden\",\n      \"description\": \"Download de app-afbeeldingen naar de resource-map van de componenten voor een auto die wordt gedefinieerd door een VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        }\n      }\n    },\n    \"engine_start\": {\n      \"name\": \"Motor starten\",\n      \"description\": \"Start de motor van een auto die wordt gedefinieerd door een VIN. PIN-instelling vereist. Zie de optiedialoog van de integratie.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN-code, vereist als deze niet is opgeslagen in de instellingen.\"\n        }\n      }\n    },\n    \"engine_stop\": {\n      \"name\": \"Motor stoppen\",\n      \"description\": \"Stop de motor van een auto die wordt gedefinieerd door een VIN. PIN-instelling vereist. Zie de optiedialoog van de integratie.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        }\n      }\n    },\n    \"hv_battery_start_conditioning\": {\n      \"name\": \"HV-batterij conditionering starten\",\n      \"description\": \"Start de HV-batterijconditionering van een auto die wordt gedefinieerd door een VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        }\n      }\n    },\n    \"hv_battery_stop_conditioning\": {\n      \"name\": \"HV-batterij conditionering stoppen\",\n      \"description\": \"Stop de HV-batterijconditionering van een auto die wordt gedefinieerd door een VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        }\n      }\n    },\n    \"preconditioning_configure_seats\": {\n      \"name\": \"Stoelvoorverwarming configureren\",\n      \"description\": \"Verstuur een configuratie-opdracht voor stoelvoorverwarming naar een auto die wordt gedefinieerd door een VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"front_left\": {\n          \"name\": \"Voor links\",\n          \"description\": \"Activeer als de voorste linkerstoel moet worden voorverwarmd.\"\n        },\n        \"front_right\": {\n          \"name\": \"Voor rechts\",\n          \"description\": \"Activeer als de voorste rechterstoel moet worden voorverwarmd.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Achter links\",\n          \"description\": \"Activeer als de achterste linkerstoel moet worden voorverwarmd.\"\n        },\n        \"rear_right\": {\n          \"name\": \"Achter rechts\",\n          \"description\": \"Activeer als de achterste rechterstoel moet worden voorverwarmd.\"\n        }\n      }\n    },\n    \"preheat_start\": {\n      \"name\": \"Voorverwarming starten\",\n      \"description\": \"Start de voorverwarming van een auto die wordt gedefinieerd door een VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"type\": {\n          \"name\": \"Type\",\n          \"description\": \"De methode die wordt gebruikt om het startproces te initiëren. 0=Nu (standaard), 1=Onmiddellijk - gebruik 'Onmiddellijk' als je auto 'Nu' niet ondersteunt.\"\n        }\n      }\n    },\n    \"preheat_start_departure_time\": {\n      \"name\": \"Voorverwarming starten met vertrektijd\",\n      \"description\": \"Start de voorverwarming van een auto die wordt gedefinieerd door een VIN en een opgegeven vertrektijd.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"time\": {\n          \"name\": \"Tijd\",\n          \"description\": \"Vertrektijd in minuten na middernacht. Bijvoorbeeld: een geldige waarde voor 8 uur 's ochtends is 480. Waardenbereik is 0 tot 1439.\"\n        }\n      }\n    },\n    \"preheat_stop\": {\n      \"name\": \"Voorverwarming stoppen\",\n      \"description\": \"Stop de voorverwarming van een auto die wordt gedefinieerd door een VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        }\n      }\n    },\n    \"preheat_stop_departure_time\": {\n      \"name\": \"Voorverwarming stoppen (vertrektijd-modus)\",\n      \"description\": \"Stop de geconfigureerde vertrektijd voor voorverwarming van een auto die wordt gedefinieerd door een VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        }\n      }\n    },\n    \"preconditioning_configure\": {\n      \"name\": \"Voorverwarming vertrek configureren\",\n      \"description\": \"Configureer de vertrektijdmodus voor voorverwarming. Gebruik modus 0 (Uitgeschakeld) om geplande vertrekvoorverwarming te annuleren.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"departure_time_mode\": {\n          \"name\": \"Vertrektijdmodus\",\n          \"description\": \"0=Uitgeschakeld, 1=Eenmalig vertrek, 2=Wekelijks vertrek\"\n        },\n        \"departure_time\": {\n          \"name\": \"Vertrektijd\",\n          \"description\": \"Vertrektijd in minuten na middernacht (0-1439). Alleen gebruikt wanneer modus > 0.\"\n        }\n      }\n    },\n    \"sigpos_start\": {\n      \"name\": \"Starten lichtsignalisatie\",\n      \"description\": \"Start de lichtsignalisatie van een auto die wordt gedefinieerd door een VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        }\n      }\n    },\n    \"sunroof_open\": {\n      \"name\": \"Schuifdak openen\",\n      \"description\": \"Open het schuifdak van een auto die wordt gedefinieerd door een VIN. PIN-instelling vereist. Zie de optiedialoog van de integratie.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN-code, vereist als deze niet is opgeslagen in de instellingen.\"\n        }\n      }\n    },\n    \"sunroof_tilt\": {\n      \"name\": \"Schuifdak kantelen\",\n      \"description\": \"Kantel het schuifdak van een auto die wordt gedefinieerd door een VIN. PIN-instelling vereist. Zie de optiedialoog van de integratie.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN-code, vereist als deze niet is opgeslagen in de instellingen.\"\n        }\n      }\n    },\n    \"sunroof_close\": {\n      \"name\": \"Schuifdak sluiten\",\n      \"description\": \"Sluit het schuifdak van een auto die wordt gedefinieerd door een VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        }\n      }\n    },\n    \"temperature_configure\": {\n      \"name\": \"Doeltemperatuur configureren (voorverwarming/extra verwarming)\",\n      \"description\": \"Configureer de doeltemperaturen voor voorverwarming/extra verwarming voor zones in een auto die wordt gedefinieerd door een VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"front_left\": {\n          \"name\": \"Voor links\",\n          \"description\": \"Doeltemperatuur voor de zone voor links in CELSIUS.\"\n        },\n        \"front_right\": {\n          \"name\": \"Voor rechts\",\n          \"description\": \"Doeltemperatuur voor de zone voor rechts in CELSIUS.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Achter links\",\n          \"description\": \"Doeltemperatuur voor de zone achter links in CELSIUS (indien beschikbaar)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Achter rechts\",\n          \"description\": \"Doeltemperatuur voor de zone achter rechts in CELSIUS (indien beschikbaar)\"\n        }\n      }\n    },\n    \"windows_open\": {\n      \"name\": \"Ramen openen\",\n      \"description\": \"Open de ramen van een auto die wordt gedefinieerd door een VIN. PIN-instelling vereist. Zie de optiedialoog van de integratie.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN-code, vereist als deze niet is opgeslagen in de instellingen.\"\n        }\n      }\n    },\n    \"windows_close\": {\n      \"name\": \"Ramen sluiten\",\n      \"description\": \"Sluit de ramen van een auto die wordt gedefinieerd door een VIN. PIN-instelling vereist. Zie de optiedialoog van de integratie.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        }\n      }\n    },\n    \"windows_move\": {\n      \"name\": \"Ramen bewegen\",\n      \"description\": \"Beweeg de ramen van een auto die wordt gedefinieerd door een VIN naar een nieuwe positie. PIN-instelling vereist. Zie de optiedialoog van de integratie.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN-code, vereist als deze niet is opgeslagen in de instellingen.\"\n        },\n        \"front_left\": {\n          \"name\": \"Voor links\",\n          \"description\": \"De nieuwe positie van het linker voorraam (0=gesloten, 10=ventileren, 100=open)\"\n        },\n        \"front_right\": {\n          \"name\": \"Voor rechts\",\n          \"description\": \"De nieuwe positie van het rechter voorraam (0=gesloten, 10=ventileren, 100=open)\"\n        },\n        \"rear_left\": {\n          \"name\": \"Achter links\",\n          \"description\": \"De nieuwe positie van het linker achterraam (0=gesloten, 10=ventileren, 100=open)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Achter rechts\",\n          \"description\": \"De nieuwe positie van het rechter achterraam (0=gesloten, 10=ventileren, 100=open)\"\n        }\n      }\n    },\n    \"send_route\": {\n      \"name\": \"Route verzenden\",\n      \"description\": \"Verzend een route naar de auto. (Enkel één locatie)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"title\": {\n          \"name\": \"Titel\",\n          \"description\": \"Titel van de route\"\n        },\n        \"latitude\": {\n          \"name\": \"Breedtegraad\",\n          \"description\": \"Breedtegraad van de locatie\"\n        },\n        \"longitude\": {\n          \"name\": \"Lengtegraad\",\n          \"description\": \"Lengtegraad van de locatie\"\n        },\n        \"city\": {\n          \"name\": \"Stad\",\n          \"description\": \"Naam van de stad van de locatie\"\n        },\n        \"postcode\": {\n          \"name\": \"Postcode\",\n          \"description\": \"Postcode van de locatie\"\n        },\n        \"street\": {\n          \"name\": \"Straat\",\n          \"description\": \"Straatnaam van de locatie\"\n        }\n      }\n    },\n    \"charging_break_clocktimer_configure\": {\n      \"name\": \"Oplaadpauze kloktimer configureren\",\n      \"description\": \"Configureer oplaadpauzes (alleen AC). Dit zal de volledige configuratie voor alle slots in je auto overschrijven.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Chassisnummer\",\n          \"description\": \"Chassisnummer van de auto\"\n        },\n        \"status_timer_1\": {\n          \"name\": \"Status (Timer 1)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_1\": {\n          \"name\": \"Starttijd (Timer 1)\",\n          \"description\": \"Starttijd van het oplaadpauzevenster (Timer 1)\"\n        },\n        \"stoptime_timer_1\": {\n          \"name\": \"Eindtijd (Timer 1)\",\n          \"description\": \"Eindtijd van het oplaadpauzevenster (Timer 1)\"\n        },\n        \"status_timer_2\": {\n          \"name\": \"Status (Timer 2)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_2\": {\n          \"name\": \"Starttijd (Timer 2)\",\n          \"description\": \"Starttijd van het oplaadpauzevenster (Timer 2)\"\n        },\n        \"stoptime_timer_2\": {\n          \"name\": \"Eindtijd (Timer 2)\",\n          \"description\": \"Eindtijd van het oplaadpauzevenster (Timer 2)\"\n        },\n        \"status_timer_3\": {\n          \"name\": \"Status (Timer 3)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_3\": {\n          \"name\": \"Starttijd (Timer 3)\",\n          \"description\": \"Starttijd van het oplaadpauzevenster (Timer 3)\"\n        },\n        \"stoptime_timer_3\": {\n          \"name\": \"Eindtijd (Timer 3)\",\n          \"description\": \"Eindtijd van het oplaadpauzevenster (Timer 3)\"\n        },\n        \"status_timer_4\": {\n          \"name\": \"Status (Timer 4)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_4\": {\n          \"name\": \"Starttijd (Timer 4)\",\n          \"description\": \"Starttijd van het oplaadpauzevenster (Timer 4)\"\n        },\n        \"stoptime_timer_4\": {\n          \"name\": \"Eindtijd (Timer 4)\",\n          \"description\": \"Eindtijd van het oplaadpauzevenster (Timer 4)\"\n        }\n      }\n    }\n  },\n  \"entity\": {\n    \"binary_sensor\": {\n      \"chargingactive\": {\n        \"name\": \"Opladen actief\"\n      }\n    },\n    \"sensor\": {\n      \"chargingpowerecolimit\": {\n        \"name\": \"Laadvermogen Limiet\"\n      },\n      \"auxheatstatus\": {\n        \"state\": {\n          \"0\": \"Inactief\",\n          \"1\": \"Normaal verwarmen\",\n          \"2\": \"Normale ventilatie\",\n          \"3\": \"Handmatig verwarmen\",\n          \"4\": \"Naverwarmen\",\n          \"5\": \"Naventileren\",\n          \"6\": \"Automatisch verwarmen\"\n        }\n      },\n      \"chargeflapacstatus\": {\n        \"state\": {\n          \"0\": \"Open\",\n          \"1\": \"Gesloten\",\n          \"2\": \"Klep ingedrukt\",\n          \"3\": \"Onbekend\"\n        }\n      },\n      \"chargeflapdcstatus\": {\n        \"state\": {\n          \"0\": \"Open\",\n          \"1\": \"Gesloten\",\n          \"2\": \"Klep ingedrukt\",\n          \"3\": \"Onbekend\"\n        }\n      },\n      \"chargingstatus\": {\n        \"state\": {\n          \"0\": \"Opladen\",\n          \"1\": \"Opladen beëindigd\",\n          \"2\": \"Oplaadpauze\",\n          \"3\": \"Losgekoppeld\",\n          \"4\": \"Fout\",\n          \"5\": \"Langzaam\",\n          \"6\": \"Snel\",\n          \"7\": \"Ontladen\",\n          \"8\": \"Niet aan het opladen\",\n          \"9\": \"Langzaam opladen na bereiken ritdoel\",\n          \"10\": \"Opladen na bereiken ritdoel\",\n          \"11\": \"Snel opladen na bereiken ritdoel\",\n          \"12\": \"Verbonden\",\n          \"13\": \"AC opladen\",\n          \"14\": \"DC opladen\",\n          \"15\": \"Batterijkalibratie actief\",\n          \"16\": \"Onbekend\"\n        }\n      },\n      \"departuretimemode\": {\n        \"state\": {\n          \"0\": \"Uitgeschakeld\",\n          \"1\": \"Dagelijks\",\n          \"2\": \"Wekelijks\"\n        }\n      },\n      \"ignitionstate\": {\n        \"state\": {\n          \"0\": \"Vergrendeld\",\n          \"1\": \"Uit\",\n          \"2\": \"Accessoire\",\n          \"4\": \"Aan\",\n          \"5\": \"Start\"\n        }\n      },\n      \"interiorprotectionsensorstatus\": {\n        \"state\": {\n          \"0\": \"Niet actief\",\n          \"1\": \"Niet actief\",\n          \"2\": \"Actief\"\n        },\n        \"state_attributes\": {}\n      },\n      \"lock\": {\n        \"state\": {\n          \"0\": \"Ontgrendeld\",\n          \"1\": \"Intern vergrendeld\",\n          \"2\": \"Vergrendeld\",\n          \"3\": \"Deels ontgrendeld\",\n          \"4\": \"Onbekend\"\n        },\n        \"state_attributes\": {\n          \"decklidstatus\": {\n            \"name\": \"Bagageklep\",\n            \"state\": {\n              \"false\": \"gesloten\",\n              \"true\": \"open\"\n            }\n          },\n          \"doorstatusfrontleft\": {\n            \"name\": \"Deur voor links\",\n            \"state\": {\n              \"false\": \"gesloten\",\n              \"true\": \"open\"\n            }\n          },\n          \"doorstatusfrontright\": {\n            \"name\": \"Deur voor rechts\",\n            \"state\": {\n              \"false\": \"gesloten\",\n              \"true\": \"open\"\n            }\n          },\n          \"doorstatusrearleft\": {\n            \"name\": \"Deur achter links\",\n            \"state\": {\n              \"false\": \"gesloten\",\n              \"true\": \"open\"\n            }\n          },\n          \"doorstatusrearright\": {\n            \"name\": \"Deur achter rechts\",\n            \"state\": {\n              \"false\": \"gesloten\",\n              \"true\": \"open\"\n            }\n          },\n          \"doorlockstatusfrontleft\": {\n            \"name\": \"Deurslot voor links\",\n            \"state\": {\n              \"false\": \"vergrendeld\",\n              \"true\": \"ontgrendeld\"\n            }\n          },\n          \"doorlockstatusfrontright\": {\n            \"name\": \"Deurslot voor rechts\",\n            \"state\": {\n              \"false\": \"vergrendeld\",\n              \"true\": \"ontgrendeld\"\n            }\n          },\n          \"doorlockstatusrearleft\": {\n            \"name\": \"Deurslot achter links\",\n            \"state\": {\n              \"false\": \"vergrendeld\",\n              \"true\": \"ontgrendeld\"\n            }\n          },\n          \"doorlockstatusrearright\": {\n            \"name\": \"Deurslot achter rechts\",\n            \"state\": {\n              \"false\": \"vergrendeld\",\n              \"true\": \"ontgrendeld\"\n            }\n          },\n          \"doorlockstatusgas\": {\n            \"name\": \"Tankdopslot\",\n            \"state\": {\n              \"false\": \"vergrendeld\",\n              \"true\": \"ontgrendeld\"\n            }\n          },\n          \"enginehoodstatus\": {\n            \"name\": \"Motorkap\",\n            \"state\": {\n              \"false\": \"gesloten\",\n              \"true\": \"open\"\n            }\n          },\n          \"doorstatusoverall\": {\n            \"name\": \"Algemene deurstatus\",\n            \"state\": {\n              \"0\": \"open\",\n              \"1\": \"gesloten\",\n              \"2\": \"niet aanwezig\",\n              \"3\": \"onbekend\"\n            }\n          },\n          \"sunroofstatus\": {\n            \"name\": \"Schuifdak status\",\n            \"state\": {\n              \"0\": \"gesloten\",\n              \"1\": \"open\",\n              \"2\": \"open gekanteld\",\n              \"3\": \"in beweging\",\n              \"4\": \"anti-dreunstand\",\n              \"5\": \"tussenpositie schuifstand\",\n              \"6\": \"tussenpositie kantelstand\",\n              \"7\": \"aan het openen\",\n              \"8\": \"aan het sluiten\",\n              \"9\": \"anti-dreun kantelstand\",\n              \"10\": \"tussenpositie\",\n              \"11\": \"openen kantelstand\",\n              \"12\": \"sluiten kantelstand\"\n            }\n          }\n        }\n      },\n      \"sunroofstatus\": {\n        \"state\": {\n          \"0\": \"Gesloten\",\n          \"1\": \"Open\",\n          \"2\": \"Open gekanteld\",\n          \"3\": \"In beweging\",\n          \"4\": \"Anti-dreunstand\",\n          \"5\": \"Tussenpositie schuifstand\",\n          \"6\": \"Tussenpositie kantelstand\",\n          \"7\": \"Aan het openen\",\n          \"8\": \"Aan het sluiten\",\n          \"9\": \"Anti-dreunstand kantelstand\",\n          \"10\": \"Tussenpositie\",\n          \"11\": \"Openen kantelstand\",\n          \"12\": \"Sluiten kantelstand\"\n        },\n        \"state_attributes\": {}\n      },\n      \"starterbatterystate\": {\n        \"state\": {\n          \"0\": \"Groen\",\n          \"1\": \"Geel\",\n          \"2\": \"Rood\"\n        }\n      },\n      \"tirewarningsrdk\": {\n        \"state\": {\n          \"0\": \"Geen waarschuwing\",\n          \"1\": \"Zachte waarschuwing\",\n          \"2\": \"Lage druk\",\n          \"3\": \"Lekkage\"\n        }\n      },\n      \"selectedchargeprogram\": {\n        \"state\": {\n          \"0\": \"Standaard\",\n          \"2\": \"Thuis\",\n          \"3\": \"Werk\",\n          \"4\": \"Niet ondersteund\"\n        }\n      }\n    },\n    \"switch\": {\n      \"auxheat\": {\n        \"name\": \"Hulpverwarming\"\n      },\n      \"precond\": {\n        \"name\": \"Voorverwarming klimaatregeling\"\n      }\n    },\n    \"button\": {\n      \"btn_preheat_start_now\": {\n        \"name\": \"Voorverwarming starten\"\n      },\n      \"btn_preheat_stop_now\": {\n        \"name\": \"Voorverwarming stoppen\"\n      },\n      \"btn_sigpos_start_now\": {\n        \"name\": \"Lichtsignaal knipperen\"\n      }\n    }\n  },\n  \"selector\": {\n    \"charge_program\": {\n      \"options\": {\n        \"0\": \"Standaard\",\n        \"2\": \"Thuis\",\n        \"3\": \"Werk\"\n      }\n    },\n    \"charging_break_clocktimer_configure_action\": {\n      \"options\": {\n        \"notset\": \"Niet ingesteld\",\n        \"active\": \"Actief\",\n        \"inactive\": \"Inactief\"\n      }\n    },\n    \"temperature_configure\": {\n      \"options\": {\n        \"0\": \"Laag\",\n        \"30\": \"Hoog\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/pl.json",
    "content": "{\n  \"config\": {\n    \"abort\": {\n      \"already_configured\": \"Komponent jest już skonfigurowany.\",\n      \"reauth_successful\": \"Re-autoryzacja udana. Trwa ponowne ładowanie komponentu.\"\n    },\n    \"error\": {\n      \"cannot_connect\": \"cannot_connect\",\n      \"invalid_auth\": \"invalid_auth\",\n      \"unknown\": \"Nieznany błąd. Proszę sprawdzić logi Home Assistanta.\",\n      \"2fa_required\": \"Konta z uwierzytelnianiem dwuskładnikowym (2FA) nie są obsługiwane.\",\n      \"legal_terms\": \"Musisz najpierw zaakceptować warunki prawne na stronie Mercedes\"\n    },\n    \"step\": {\n      \"user\": {\n        \"data\": {\n          \"region\": \"Region\"\n        },\n        \"description\": \"Wybierz swój region.\",\n        \"title\": \"Skonfiguruj połączenie Mercedes ME 2020\"\n      },\n      \"credentials\": {\n        \"data\": {\n          \"username\": \"Nazwa użytkownika MB (adres e-mail)\",\n          \"password\": \"Hasło\"\n        },\n        \"description\": \"Wprowadź dane swojego konta.\",\n        \"title\": \"Mercedes ME 2020 - Logowanie\"\n      },\n      \"pin\": {\n        \"data\": {\n          \"password\": \"TAN (otrzymany przez e-mail lub SMS)\"\n        },\n        \"description\": \"Wprowadź kod TAN otrzymany przez e-mail lub SMS, aby zakończyć uwierzytelnianie. Jeśli nie otrzymałeś kodu TAN, sprawdź swoją skrzynkę e-mail (w tym folder spam) lub wiadomości SMS.\",\n        \"title\": \"Mercedes ME 2020 - TAN\"\n      }\n    }\n  },\n  \"issues\": {\n    \"restart_required\": {\n      \"fix_flow\": {\n        \"step\": {\n          \"confirm_restart\": {\n            \"description\": \"Ponowne uruchomienie Home Assistant jest wymagane aby ukończyć aktualizację autoryzacji. Kliknij \\\"wyślij\\\" aby uruchomić teraz.\",\n            \"title\": \"Wymagane ponowne uruchomienie\"\n          }\n        }\n      },\n      \"title\": \"Wymagane ponowne uruchomienie\"\n    }\n  },\n  \"options\": {\n    \"abort\": {\n      \"already_configured\": \"Komponent jest już skonfigurowany.\",\n      \"reauth_successful\": \"Ponowne uwierzytelnianie powiodło się. Trwa ponowne ładowanie komponentu.\"\n    },\n    \"step\": {\n      \"init\": {\n        \"data\": {\n          \"cap_check_disabled\": \"Wyłącz sprawdzanie funkcji\",\n          \"enable_china_gcj_02\": \"Włącz transkrypcję GCJ-02 (tylko dla Chin)\",\n          \"delete_auth_file\": \"Usuń dane uwierzytelniania. Wymaga ponownego uruchomienia Home Assistanta po zapisaniu.\",\n          \"excluded_cars\": \"Wykluczone VINy (oddzielone przecinkami)\",\n          \"pin\": \"PIN zabezpieczający (utworzony w aplikacji mobilnej)\",\n          \"save_files\": \"TRYB DEBUGOWANIA: Zezwól na zapisywanie wiadomości z serwera do folderu\",\n          \"overwrite_cap_precondnow\": \"Exp: Nadpisz zdolność precondnow (ustaw na true)\"\n        },\n        \"description\": \"Ustaw swoje opcje. Część zmian wymaga ponownego uruchomienia Home Assistanta.\",\n        \"title\": \"Opcje Mercedes ME 2020\"\n      }\n    }\n  },\n  \"system_health\": {\n    \"info\": {\n      \"api_endpoint_reachable\": \"MB API dostępne\",\n      \"websocket_connection_state\": \"Stan MB WS\",\n      \"cars_connected\": \"Połączone samochody\",\n      \"version\": \"Wersja\"\n    }\n  },\n  \"services\": {\n    \"refresh_access_token\": {\n      \"name\": \"Odśwież token dostępu\",\n      \"description\": \"Odśwież token dostępu do API\"\n    },\n    \"auxheat_configure\": {\n      \"name\": \"Ustawienia ogrzewania dodatkowego\",\n      \"description\": \"Komendy do konfiguracji ogrzewania dodatkowego. Można zdefiniować trzy czasy uruchomienia i wybrać jeden aktywny.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"time_selection\": {\n          \"name\": \"Wybór czasu\",\n          \"description\": \"Wybrany czas startu ogrzewania dodatkowego (0=brak_wyboru, 1=czas_1, 2=czas_2, 3=czas_3)\"\n        },\n        \"time_1\": {\n          \"name\": \"time_1\",\n          \"description\": \"Czas w minutach po północy. Np. dla 8:00 jest to 480. Dostępne wartości 0 do 1439.\"\n        },\n        \"time_2\": {\n          \"name\": \"time_2\",\n          \"description\": \"Czas w minutach po północy. Np. dla 8:00 jest to 480. Dostępne wartości 0 do 1439.\"\n        },\n        \"time_3\": {\n          \"name\": \"time_3\",\n          \"description\": \"Czas w minutach po północy. Np. dla 8:00 jest to 480. Dostępne wartości 0 do 1439.\"\n        }\n      }\n    },\n    \"auxheat_start\": {\n      \"name\": \"Włącz ogrzewanie dodatkowe\",\n      \"description\": \"Włącz ogrzewanie dodatkowe pojazdu zdefiniowanego VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        }\n      }\n    },\n    \"auxheat_stop\": {\n      \"name\": \"Wyłącz ogrzewanie dodatkowe\",\n      \"description\": \"Wyłącz ogrzewanie dodatkowe pojazdu zdefiniowanego VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        }\n      }\n    },\n    \"battery_max_soc_configure\": {\n      \"name\": \"Ustawienie maksymalnego stanu naładowania baterii\",\n      \"description\": \"Ustaw wartość maksymalnego stanu naładowania baterii pojazdu zdefiniowanego VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"max_soc\": {\n          \"name\": \"Maksymalny stan naładowania\",\n          \"description\": \"Maksymalna wartość naładowania baterii pojazdu (Wartość musi zawierać się między 50 (niektóre nowe samochody jak CLA 2025 obsługują 30) a 100 i być podzielna przez 10)\"\n        },\n        \"charge_program\": {\n          \"name\": \"Program ładowania\",\n          \"description\": \"(Opcjonalnie, Domyślnie=0) Zmiana programu ładowania (0=Domyślny, 2=Dom, 3=Praca) (nie używane dla CLA 2025)\"\n        }\n      }\n    },\n    \"charge_program_configure\": {\n      \"name\": \"Konfiguracja programu ładowania\",\n      \"description\": \"Komenda wyboru programu ładowania.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"charge_program\": {\n          \"name\": \"Program ładowania\",\n          \"description\": \"Aktywny program ładowania (0=Domyślny, 2=Dom, 3=Praca)\"\n        },\n        \"max_soc\": {\n          \"name\": \"Maksymalny stan naładowania\",\n          \"description\": \"Maksymalna wartość naładowania baterii pojazdu (Wartość musi zawierać się między 50 a 100 i być podzielna przez 10)\"\n        }\n      }\n    },\n    \"doors_unlock\": {\n      \"name\": \"Odblokowanie drzwi\",\n      \"description\": \"Odblokuj pojazd zdefiniowany VIN. Wymagany PIN. Sprawdź opcje w ustawieniach integracji.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"pin\": {\n          \"name\": \"PIN\",\n          \"description\": \"PIN bezpieczeństwa, wymagany gdy nie jest zapisany w ustawieniach.\"\n        }\n      }\n    },\n    \"doors_lock\": {\n      \"name\": \"Zablokowanie drzwi\",\n      \"description\": \"Zablokuj pojazd zdefiniowany VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        }\n      }\n    },\n    \"download_images\": {\n      \"name\": \"Pobierz obrazy\",\n      \"description\": \"Pobierz zdjęcia pojazdu do folderu komponentu dla pojazdu zdefiniowanego VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        }\n      }\n    },\n    \"engine_start\": {\n      \"name\": \"Uruchom silnik\",\n      \"description\": \"Uruchom silnik pojazdu zdefiniowanego VIN. Wymagany PIN. Sprawdź opcje w ustawieniach integracji.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"pin\": {\n          \"name\": \"PIN\",\n          \"description\": \"PIN bezpieczeństwa, wymagany gdy nie zapisano w ustawieniach.\"\n        }\n      }\n    },\n    \"engine_stop\": {\n      \"name\": \"Wyłącz silnik\",\n      \"description\": \"Wyłącz silnik pojazdu zdefiniowanego VIN. Wymagany PIN. Sprawdź opcje w ustawieniach integracji.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        }\n      }\n    },\n    \"hv_battery_start_conditioning\": {\n      \"name\": \"Rozpocznij kondycjonowanie baterii HV\",\n      \"description\": \"Rozpocznij kondycjonowanie baterii HV pojazdu zdefiniowanego VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        }\n      }\n    },\n    \"hv_battery_stop_conditioning\": {\n      \"name\": \"Zatrzymaj kondycjonowanie baterii HV\",\n      \"description\": \"Zatrzymaj kondycjonowanie baterii HV pojazdu zdefiniowanego VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        }\n      }\n    },\n    \"preconditioning_configure_seats\": {\n      \"name\": \"Konfiguracja klimatyzacji wstępnej siedzeń\",\n      \"description\": \"Wyślij komendę konfiguracji klimatyzacji wstępnej siedzeń do pojazdu zdefiniowanego VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"front_left\": {\n          \"name\": \"Lewe przednie\",\n          \"description\": \"Aktywuj jeśli lewe przednie siedzenie ma być podgrzane.\"\n        },\n        \"front_right\": {\n          \"name\": \"Prawe przednie\",\n          \"description\": \"Aktywuj jeśli prawe przednie siedzenie ma być podgrzane.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Lewe tylne\",\n          \"description\": \"Aktywuj jeśli lewe tylne siedzenie ma być podgrzane.\"\n        },\n        \"rear_right\": {\n          \"name\": \"Prawe tylne\",\n          \"description\": \"Aktywuj jeśli prawe tylne siedzenie ma być podgrzane.\"\n        }\n      }\n    },\n    \"preheat_start\": {\n      \"name\": \"Włącz klimatyzację wstępną\",\n      \"description\": \"Włącz klimatyzację wstępną pojazdu zdefiniowanego VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"type\": {\n          \"name\": \"Typ\",\n          \"description\": \"Metoda używana do włączania. 0=Teraz (Domyślne), 1=Natychmiast - Użyj Natychmiast w przypadku gdy Twój pojazd nie obsługuje Teraz.\"\n        }\n      }\n    },\n    \"preheat_start_departure_time\": {\n      \"name\": \"Klimatyzacja wstępna z czasem odjazdu\",\n      \"description\": \"Ustaw klimatyzację wstępną pojazdu zdefiniowanego VIN na podaną godzinę.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"time\": {\n          \"name\": \"Czas\",\n          \"description\": \"Czas odjazdu w minutach po północy. Np. dla 8:00 wartość to 480. Dostępne wartości od 0 do 1439.\"\n        }\n      }\n    },\n    \"preheat_stop\": {\n      \"name\": \"Wyłącz wstępną klimatyzację\",\n      \"description\": \"Wyłącz wstępną klimatyzację pojazdu zdefiniowanego VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        }\n      }\n    },\n    \"preheat_stop_departure_time\": {\n      \"name\": \"Wyłącz wstępną klimatyzację dla trybu z czasem odjazdu\",\n      \"description\": \"Wyłącz wstępną klimatyzację z czasem odjazdu dla pojazdu zdefiniowanego VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        }\n      }\n    },\n    \"preconditioning_configure\": {\n      \"name\": \"Konfiguracja odjazdu z klimatyzacją wstępną\",\n      \"description\": \"Konfiguracja trybu czasu odjazdu klimatyzacji wstępnej. Użyj trybu 0 (Wyłączony) aby anulować zaplanowaną klimatyzację wstępną.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"departure_time_mode\": {\n          \"name\": \"Tryb czasu odjazdu\",\n          \"description\": \"0=Wyłączony, 1=Pojedynczy odjazd, 2=Tygodniowy odjazd\"\n        },\n        \"departure_time\": {\n          \"name\": \"Czas odjazdu\",\n          \"description\": \"Czas odjazdu w minutach po północy (0-1439). Używany tylko gdy tryb > 0.\"\n        }\n      }\n    },\n    \"sigpos_start\": {\n      \"name\": \"Włącz sygnalizację światłami\",\n      \"description\": \"Włącz sygnalizację światłami pojazdu zdefiniowanego VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        }\n      }\n    },\n    \"sunroof_open\": {\n      \"name\": \"Otwórz szyberdach\",\n      \"description\": \"Otwórz szyberdach pojazdu zdefiniowanego VIN. Wymagany PIN. Sprawdź opcje w ustawieniach integracji.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"pin\": {\n          \"name\": \"PIN\",\n          \"description\": \"PIN bezpieczeństwa, wymagany gdy nie zapisano w ustawieniach.\"\n        }\n      }\n    },\n    \"sunroof_tilt\": {\n      \"name\": \"Uchyl szyberdach\",\n      \"description\": \"Uchyl szyberdach pojazdu zdefiniowanego VIN. Wymagany PIN. Sprawdź opcje w ustawieniach integracji.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"pin\": {\n          \"name\": \"PIN\",\n          \"description\": \"PIN bezpieczeństwa, wymagany gdy nie zapisano w ustawieniach.\"\n        }\n      }\n    },\n    \"sunroof_close\": {\n      \"name\": \"Zamknij szyberdach\",\n      \"description\": \"Zamknij szyberdach pojazdu zdefiniowanego VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        }\n      }\n    },\n    \"temperature_configure\": {\n      \"name\": \"Konfiguracja temperatury docelowej (klimatyzacja/ogrzewanie)\",\n      \"description\": \"Skonfiguruj docelowe temperatury klimatyzacji wstępnej/ogrzewania dodatkowego dla stref w pojeździe zdefiniowanym VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"front_left\": {\n          \"name\": \"Lewe przednie\",\n          \"description\": \"Temperatura docelowa dla strefy przedniej lewej w stopniach Celsjusza.\"\n        },\n        \"front_right\": {\n          \"name\": \"Prawe przednie\",\n          \"description\": \"Temperatura docelowa dla strefy przedniej prawej w stopniach Celsjusza.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Lewe tylne\",\n          \"description\": \"Temperatura docelowa dla strefy tylnej lewej w stopniach Celsjusza (jeśli dostępna).\"\n        },\n        \"rear_right\": {\n          \"name\": \"Prawe tylne\",\n          \"description\": \"Temperatura docelowa dla strefy tylnej prawej w stopniach Celsjusza (jeśli dostępna).\"\n        }\n      }\n    },\n    \"windows_open\": {\n      \"name\": \"Otwórz okna\",\n      \"description\": \"Otwórz okna pojazdu zdefiniowanego VIN. Wymagany PIN. Sprawdź opcje w ustawieniach integracji.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"pin\": {\n          \"name\": \"PIN\",\n          \"description\": \"PIN bezpieczeństwa, wymagany gdy nie zapisano w ustawieniach.\"\n        }\n      }\n    },\n    \"windows_close\": {\n      \"name\": \"Zamknij okna\",\n      \"description\": \"Zamknij okna pojazdu zdefiniowanego VIN. Wymagany PIN. Sprawdź opcje w ustawieniach integracji.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        }\n      }\n    },\n    \"windows_move\": {\n      \"name\": \"Ruch okien\",\n      \"description\": \"Przesuń okna pojazdu zdefiniowanego VIN do nowej pozycji. Wymagany PIN. Sprawdź opcje w ustawieniach integracji.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"pin\": {\n          \"name\": \"PIN\",\n          \"description\": \"PIN bezpieczeństwa, wymagany gdy nie zapisano w ustawieniach.\"\n        },\n        \"front_left\": {\n          \"name\": \"Lewe przednie\",\n          \"description\": \"Nowa pozycja przedniego lewego okna (0=zamknięte, 10=wentylacja, 100=otwarte)\"\n        },\n        \"front_right\": {\n          \"name\": \"Prawe przednie\",\n          \"description\": \"Nowa pozycja przedniego prawego okna (0=zamknięte, 10=wentylacja, 100=otwarte)\"\n        },\n        \"rear_left\": {\n          \"name\": \"Lewe tylne\",\n          \"description\": \"Nowa pozycja tylnego lewego okna (0=zamknięte, 10=wentylacja, 100=otwarte)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Prawe tylne\",\n          \"description\": \"Nowa pozycja tylnego prawego okna (0=zamknięte, 10=wentylacja, 100=otwarte)\"\n        }\n      }\n    },\n    \"send_route\": {\n      \"name\": \"Wyślij trasę\",\n      \"description\": \"Wyślij trasę do pojazdu (tylko jeden cel).\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"title\": {\n          \"name\": \"Nazwa\",\n          \"description\": \"Nazwa trasy\"\n        },\n        \"latitude\": {\n          \"name\": \"Szerokość geograficzna\",\n          \"description\": \"Szerokość geograficzna celu\"\n        },\n        \"longitude\": {\n          \"name\": \"Długość geograficzna\",\n          \"description\": \"Długość geograficzna celu\"\n        },\n        \"city\": {\n          \"name\": \"Miejscowość\",\n          \"description\": \"Nazwa miejscowości lokalizacji\"\n        },\n        \"postcode\": {\n          \"name\": \"Kod pocztowy\",\n          \"description\": \"Kod pocztowy celu\"\n        },\n        \"street\": {\n          \"name\": \"Ulica\",\n          \"description\": \"Nazwa ulicy lokalizacji\"\n        }\n      }\n    },\n    \"charging_break_clocktimer_configure\": {\n      \"name\": \"Konfiguracja przerw w ładowaniu\",\n      \"description\": \"Skonfiguruj przerwy w ładowaniu (tylko AC). To nadpisze całą konfigurację dla wszystkich slotów w Twoim pojeździe.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"VIN\",\n          \"description\": \"VIN/FIN pojazdu\"\n        },\n        \"status_timer_1\": {\n          \"name\": \"Status (Timer 1)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_1\": {\n          \"name\": \"Czas rozpoczęcia (Timer 1)\",\n          \"description\": \"Czas rozpoczęcia okna przerwy w ładowaniu (Timer 1)\"\n        },\n        \"stoptime_timer_1\": {\n          \"name\": \"Czas zakończenia (Timer 1)\",\n          \"description\": \"Czas zakończenia okna przerwy w ładowaniu (Timer 1)\"\n        },\n        \"status_timer_2\": {\n          \"name\": \"Status (Timer 2)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_2\": {\n          \"name\": \"Czas rozpoczęcia (Timer 2)\",\n          \"description\": \"Czas rozpoczęcia okna przerwy w ładowaniu (Timer 2)\"\n        },\n        \"stoptime_timer_2\": {\n          \"name\": \"Czas zakończenia (Timer 2)\",\n          \"description\": \"Czas zakończenia okna przerwy w ładowaniu (Timer 2)\"\n        },\n        \"status_timer_3\": {\n          \"name\": \"Status (Timer 3)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_3\": {\n          \"name\": \"Czas rozpoczęcia (Timer 3)\",\n          \"description\": \"Czas rozpoczęcia okna przerwy w ładowaniu (Timer 3)\"\n        },\n        \"stoptime_timer_3\": {\n          \"name\": \"Czas zakończenia (Timer 3)\",\n          \"description\": \"Czas zakończenia okna przerwy w ładowaniu (Timer 3)\"\n        },\n        \"status_timer_4\": {\n          \"name\": \"Status (Timer 4)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_4\": {\n          \"name\": \"Czas rozpoczęcia (Timer 4)\",\n          \"description\": \"Czas rozpoczęcia okna przerwy w ładowaniu (Timer 4)\"\n        },\n        \"stoptime_timer_4\": {\n          \"name\": \"Czas zakończenia (Timer 4)\",\n          \"description\": \"Czas zakończenia okna przerwy w ładowaniu (Timer 4)\"\n        }\n      }\n    }\n  },\n  \"entity\": {\n    \"binary_sensor\": {\n      \"chargingactive\": {\n        \"name\": \"Ładowanie aktywne\"\n      }\n    },\n    \"sensor\": {\n      \"chargingpowerecolimit\": {\n        \"name\": \"Limit mocy ładowania\"\n      },\n      \"auxheatstatus\": {\n        \"state\": {\n          \"0\": \"Nieaktywne\",\n          \"1\": \"Ogrzewanie normalne\",\n          \"2\": \"Wentylacja normalna\",\n          \"3\": \"Ogrzewanie ręczne\",\n          \"4\": \"Dogrzewanie\",\n          \"5\": \"Wentylacja końcowa\",\n          \"6\": \"Ogrzewanie automatyczne\"\n        }\n      },\n      \"chargeflapacstatus\": {\n        \"state\": {\n          \"0\": \"Otwarta\",\n          \"1\": \"Zamknięta\",\n          \"2\": \"Klapa naciśnięta\",\n          \"3\": \"Nieznany\"\n        }\n      },\n      \"chargeflapdcstatus\": {\n        \"state\": {\n          \"0\": \"Otwarta\",\n          \"1\": \"Zamknięta\",\n          \"2\": \"Klapa naciśnięta\",\n          \"3\": \"Nieznany\"\n        }\n      },\n      \"chargingstatus\": {\n        \"state\": {\n          \"0\": \"ładowanie\",\n          \"1\": \"ładowanie kończy się\",\n          \"2\": \"Przerwa w ładowaniu\",\n          \"3\": \"odłączony\",\n          \"4\": \"awaria\",\n          \"5\": \"wolne\",\n          \"6\": \"szybkie\",\n          \"7\": \"rozładowywanie\",\n          \"8\": \"nie ładuje\",\n          \"9\": \"wolne ładowanie po osiągnięciu celu podróży\",\n          \"10\": \"ładowanie po osiągnięciu celu podróży\",\n          \"11\": \"szybkie ładowanie po osiągnięciu celu podróży\",\n          \"12\": \"Podłączony\",\n          \"13\": \"Ładowanie AC\",\n          \"14\": \"Ładowanie DC\",\n          \"15\": \"Kalibracja baterii aktywna\",\n          \"16\": \"nieznany\"\n        }\n      },\n      \"departuretimemode\": {\n        \"state\": {\n          \"0\": \"Wyłączony\",\n          \"1\": \"Dzienny\",\n          \"2\": \"Tygodniowy\"\n        }\n      },\n      \"ignitionstate\": {\n        \"state\": {\n          \"0\": \"Zablokowany\",\n          \"1\": \"Wyłączony\",\n          \"2\": \"Akcesoria\",\n          \"4\": \"Włączony\",\n          \"5\": \"Rozruch\"\n        }\n      },\n      \"interiorprotectionsensorstatus\": {\n        \"state\": {\n          \"0\": \"Nieaktywne\",\n          \"1\": \"Nieaktywne\",\n          \"2\": \"Aktywne\"\n        },\n        \"state_attributes\": {}\n      },\n      \"lock\": {\n        \"state\": {\n          \"0\": \"Odblokowany\",\n          \"1\": \"Zablokowany od środka\",\n          \"2\": \"Zablokowany\",\n          \"3\": \"Częściowo odblokowany\",\n          \"4\": \"Nieznany\"\n        },\n        \"state_attributes\": {\n          \"decklidstatus\": {\n            \"name\": \"Klapa bagażnika\",\n            \"state\": {\n              \"false\": \"zamknięta\",\n              \"true\": \"otwarta\"\n            }\n          },\n          \"doorstatusfrontleft\": {\n            \"name\": \"Drzwi przednie lewe\",\n            \"state\": {\n              \"false\": \"zamknięte\",\n              \"true\": \"otwarte\"\n            }\n          },\n          \"doorstatusfrontright\": {\n            \"name\": \"Drzwi przednie prawe\",\n            \"state\": {\n              \"false\": \"zamknięte\",\n              \"true\": \"otwarte\"\n            }\n          },\n          \"doorstatusrearleft\": {\n            \"name\": \"Drzwi tylne lewe\",\n            \"state\": {\n              \"false\": \"zamknięte\",\n              \"true\": \"otwarte\"\n            }\n          },\n          \"doorstatusrearright\": {\n            \"name\": \"Drzwi tylne prawe\",\n            \"state\": {\n              \"false\": \"zamknięte\",\n              \"true\": \"otwarte\"\n            }\n          },\n          \"doorlockstatusfrontleft\": {\n            \"name\": \"Zamek drzwi przednich lewych\",\n            \"state\": {\n              \"false\": \"zablokowany\",\n              \"true\": \"odblokowany\"\n            }\n          },\n          \"doorlockstatusfrontright\": {\n            \"name\": \"Zamek drzwi przednich prawych\",\n            \"state\": {\n              \"false\": \"zablokowany\",\n              \"true\": \"odblokowany\"\n            }\n          },\n          \"doorlockstatusrearleft\": {\n            \"name\": \"Zamek drzwi tylnych lewych\",\n            \"state\": {\n              \"false\": \"zablokowany\",\n              \"true\": \"odblokowany\"\n            }\n          },\n          \"doorlockstatusrearright\": {\n            \"name\": \"Zamek drzwi tylnych prawych\",\n            \"state\": {\n              \"false\": \"zablokowany\",\n              \"true\": \"odblokowany\"\n            }\n          },\n          \"doorlockstatusgas\": {\n            \"name\": \"Klapka wlewu paliwa\",\n            \"state\": {\n              \"false\": \"zablokowana\",\n              \"true\": \"odblokowana\"\n            }\n          },\n          \"enginehoodstatus\": {\n            \"name\": \"Maska silnika\",\n            \"state\": {\n              \"false\": \"zamknięta\",\n              \"true\": \"otwarta\"\n            }\n          },\n          \"doorstatusoverall\": {\n            \"name\": \"Ogólny stan drzwi\",\n            \"state\": {\n              \"0\": \"otwarte\",\n              \"1\": \"zamknięte\",\n              \"2\": \"nieistniejące\",\n              \"3\": \"nieznany\"\n            }\n          },\n          \"sunroofstatus\": {\n            \"name\": \"Stan szyberdachu\",\n            \"state\": {\n              \"0\": \"zamknięty\",\n              \"1\": \"otwarty\",\n              \"2\": \"uchylanie\",\n              \"3\": \"działa\",\n              \"4\": \"pozycja cicha\",\n              \"5\": \"przesuwanie średnie\",\n              \"6\": \"unoszenie średnie\",\n              \"7\": \"otwieranie\",\n              \"8\": \"zamykanie\",\n              \"9\": \"unoszenie do pozycji cichej\",\n              \"10\": \"pozycja pośrednia\",\n              \"11\": \"otwieranie unoszenie\",\n              \"12\": \"zamykanie podnoszące\"\n            }\n          }\n        }\n      },\n      \"sunroofstatus\": {\n        \"state\": {\n          \"0\": \"Zamknięty\",\n          \"1\": \"Otwarty\",\n          \"2\": \"Otwarty unoszący\",\n          \"3\": \"W ruchu\",\n          \"4\": \"Pozycja cicha\",\n          \"5\": \"Średnie przesuwanie\",\n          \"6\": \"Średnie unoszenie\",\n          \"7\": \"Otwieranie\",\n          \"8\": \"Zamykanie\",\n          \"9\": \"Uchylony do pozycji cichej\",\n          \"10\": \"Pozycja pośrednia\",\n          \"11\": \"Otwieranie uchylenia\",\n          \"12\": \"Zamykanie uchylenia\"\n        },\n        \"state_attributes\": {}\n      },\n      \"starterbatterystate\": {\n        \"state\": {\n          \"0\": \"Zielony\",\n          \"1\": \"Żółty\",\n          \"2\": \"Czerwony\"\n        }\n      },\n      \"tirewarningsrdk\": {\n        \"state\": {\n          \"0\": \"Brak ostrzeżenia\",\n          \"1\": \"Łagodne ostrzeżenie\",\n          \"2\": \"Niskie ciśnienie\",\n          \"3\": \"Utrata powietrza\"\n        }\n      },\n      \"selectedchargeprogram\": {\n        \"state\": {\n          \"0\": \"Standardowy\",\n          \"2\": \"Dom\",\n          \"3\": \"Praca\",\n          \"4\": \"Nieobsługiwany\"\n        }\n      }\n    },\n    \"switch\": {\n      \"auxheat\": {\n        \"name\": \"Ogrzewanie dodatkowe\"\n      },\n      \"precond\": {\n        \"name\": \"Klimatyzacja wstępna\"\n      }\n    },\n    \"button\": {\n      \"btn_preheat_start_now\": {\n        \"name\": \"Rozpocznij klimatyzację wstępną\"\n      },\n      \"btn_preheat_stop_now\": {\n        \"name\": \"Zatrzymaj klimatyzację wstępną\"\n      },\n      \"btn_sigpos_start_now\": {\n        \"name\": \"Błysk świateł\"\n      }\n    }\n  },\n  \"selector\": {\n    \"charge_program\": {\n      \"options\": {\n        \"0\": \"Domyślny\",\n        \"2\": \"Dom\",\n        \"3\": \"Praca\"\n      }\n    },\n    \"charging_break_clocktimer_configure_action\": {\n      \"options\": {\n        \"notset\": \"Nie ustawiono\",\n        \"active\": \"Aktywny\",\n        \"inactive\": \"Nieaktywny\"\n      }\n    },\n    \"temperature_configure\": {\n      \"options\": {\n        \"0\": \"Niska\",\n        \"30\": \"Wysoka\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/pt.json",
    "content": "{\n  \"config\": {\n    \"abort\": {\n      \"already_configured\": \"O componente já está configurado.\",\n      \"reauth_successful\": \"Reautenticação bem-sucedida! Recarregamento do componente em curso.\"\n    },\n    \"error\": {\n      \"cannot_connect\": \"cannot_connect\",\n      \"invalid_auth\": \"invalid_auth\",\n      \"unknown\": \"Erro desconhecido. Por favor, verifique o registo do Home Assistant para mais informações.\",\n      \"2fa_required\": \"Contas com autenticação de dois fatores (2FA) não são suportadas.\",\n      \"legal_terms\": \"É necessário aceitar os termos legais no site da Mercedes primeiro\"\n    },\n    \"step\": {\n      \"user\": {\n        \"data\": {\n          \"region\": \"Região\"\n        },\n        \"description\": \"Selecione a sua região.\",\n        \"title\": \"Configurar a ligação Mercedes ME 2020\"\n      },\n      \"credentials\": {\n        \"data\": {\n          \"username\": \"Utilizador MB (endereço de e-mail)\",\n          \"password\": \"Palavra-passe\"\n        },\n        \"description\": \"Introduza os dados da sua conta.\",\n        \"title\": \"Mercedes ME 2020 - Iniciar sessão\"\n      },\n      \"pin\": {\n        \"data\": {\n          \"password\": \"TAN (recebido por e-mail ou SMS)\"\n        },\n        \"description\": \"Introduza o TAN que recebeu por e-mail ou SMS para concluir a autenticação. Se não recebeu um TAN, verifique a sua caixa de entrada de e-mail (e pasta de spam) ou as suas mensagens SMS.\",\n        \"title\": \"Mercedes ME 2020 - TAN\"\n      }\n    }\n  },\n  \"issues\": {\n    \"restart_required\": {\n      \"fix_flow\": {\n        \"step\": {\n          \"confirm_restart\": {\n            \"description\": \"É necessário reiniciar o Home Assistant para concluir a atualização de autenticação. Clique em submeter para reiniciar agora.\",\n            \"title\": \"Reinício necessário\"\n          }\n        }\n      },\n      \"title\": \"Reinício necessário\"\n    }\n  },\n  \"options\": {\n    \"abort\": {\n      \"already_configured\": \"O componente já está configurado.\",\n      \"reauth_successful\": \"Reautenticação bem-sucedida! Recarregamento do componente em curso.\"\n    },\n    \"step\": {\n      \"init\": {\n        \"data\": {\n          \"cap_check_disabled\": \"Desativar verificação de capacidades\",\n          \"enable_china_gcj_02\": \"Ativar tradução GCJ-02 (apenas China)\",\n          \"delete_auth_file\": \"Eliminar o token de autenticação agora. Requer um reinício do Home Assistant após guardar.\",\n          \"excluded_cars\": \"VINs excluídos (separados por vírgula)\",\n          \"pin\": \"PIN de segurança (a criar na aplicação móvel)\",\n          \"save_files\": \"APENAS DEBUG: Ativar guardar mensagens do servidor na pasta de mensagens\",\n          \"overwrite_cap_precondnow\": \"Exp: Substituir capacidade precondnow (definir como verdadeiro)\"\n        },\n        \"description\": \"Configure as suas opções. Algumas alterações requerem um reinício do Home Assistant.\",\n        \"title\": \"Opções Mercedes ME 2020\"\n      }\n    }\n  },\n  \"system_health\": {\n    \"info\": {\n      \"api_endpoint_reachable\": \"API MB acessível\",\n      \"websocket_connection_state\": \"Estado WS MB\",\n      \"cars_connected\": \"Carros ligados\",\n      \"version\": \"Versão\"\n    }\n  },\n  \"services\": {\n    \"refresh_access_token\": {\n      \"name\": \"Atualizar token de acesso\",\n      \"description\": \"Atualizar o token de acesso à API\"\n    },\n    \"auxheat_configure\": {\n      \"name\": \"Configurar aquecimento auxiliar\",\n      \"description\": \"Comando para configurar o aquecimento auxiliar. É possível definir três horários e selecionar um horário ativo.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"time_selection\": {\n          \"name\": \"Seleção de horário\",\n          \"description\": \"O horário predefinido de aquecimento auxiliar ativado (0=sem_seleção, 1=time_1, 2=time_2, 3=time_3)\"\n        },\n        \"time_1\": {\n          \"name\": \"time_1\",\n          \"description\": \"Hora do dia em minutos após a meia-noite. Ex.: o valor válido para as 8h seria 480. O intervalo de valores é de 0 a 1439.\"\n        },\n        \"time_2\": {\n          \"name\": \"time_2\",\n          \"description\": \"Hora do dia em minutos após a meia-noite. Ex.: o valor válido para as 8h seria 480. O intervalo de valores é de 0 a 1439.\"\n        },\n        \"time_3\": {\n          \"name\": \"time_3\",\n          \"description\": \"Hora do dia em minutos após a meia-noite. Ex.: o valor válido para as 8h seria 480. O intervalo de valores é de 0 a 1439.\"\n        }\n      }\n    },\n    \"auxheat_start\": {\n      \"name\": \"Iniciar aquecimento auxiliar\",\n      \"description\": \"Iniciar o aquecimento auxiliar de um carro definido por um vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        }\n      }\n    },\n    \"auxheat_stop\": {\n      \"name\": \"Parar aquecimento auxiliar\",\n      \"description\": \"Parar o aquecimento auxiliar de um carro definido por um vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        }\n      }\n    },\n    \"battery_max_soc_configure\": {\n      \"name\": \"Configurar SOC máximo da bateria\",\n      \"description\": \"Configurar o valor máximo para o estado de carga da bateria HV de um carro definido por um vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"max_soc\": {\n          \"name\": \"SOC Máx\",\n          \"description\": \"O valor máximo para o estado de carga da bateria HV (o valor deve estar entre 50 (alguns carros novos como o CLA 2025 suportam 30) e 100 e ser divisível por dez)\"\n        },\n        \"charge_program\": {\n          \"name\": \"Programa de carregamento\",\n          \"description\": \"(Opcional, Predefinido=0) Programa de carregamento a alterar (0=Predefinido, 2=Casa, 3=Trabalho) (não utilizado para o CLA 2025)\"\n        }\n      }\n    },\n    \"charge_program_configure\": {\n      \"name\": \"Configurar programa de carregamento\",\n      \"description\": \"Comando para selecionar o programa de carregamento.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"charge_program\": {\n          \"name\": \"Programa de carregamento\",\n          \"description\": \"O programa de carregamento ativado (0=Predefinido, 2=Casa, 3=Trabalho)\"\n        },\n        \"max_soc\": {\n          \"name\": \"SOC Máx\",\n          \"description\": \"O valor máximo para o estado de carga da bateria HV (o valor deve estar entre 50 e 100 e ser divisível por dez)\"\n        }\n      }\n    },\n    \"doors_unlock\": {\n      \"name\": \"Destrancar portas\",\n      \"description\": \"Destrancar um carro definido por um vin. Configuração de PIN necessária. Consulte o diálogo de opções da integração.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de segurança, necessário se não estiver guardado nas definições.\"\n        }\n      }\n    },\n    \"doors_lock\": {\n      \"name\": \"Trancar portas\",\n      \"description\": \"Trancar um carro definido por um vin\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        }\n      }\n    },\n    \"download_images\": {\n      \"name\": \"Transferir imagens\",\n      \"description\": \"Transfere as imagens da aplicação para a pasta de recursos do componente para um carro definido por um vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        }\n      }\n    },\n    \"engine_start\": {\n      \"name\": \"Ligar motor\",\n      \"description\": \"Ligar o motor de um carro definido por um vin. Configuração de PIN necessária. Consulte o diálogo de opções da integração.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de segurança, necessário se não estiver guardado nas definições.\"\n        }\n      }\n    },\n    \"engine_stop\": {\n      \"name\": \"Desligar motor\",\n      \"description\": \"Desligar o motor de um carro definido por um vin. Configuração de PIN necessária. Consulte o diálogo de opções da integração.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        }\n      }\n    },\n    \"hv_battery_start_conditioning\": {\n      \"name\": \"Iniciar condicionamento da bateria HV\",\n      \"description\": \"Iniciar o condicionamento da bateria HV de um carro definido por um vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        }\n      }\n    },\n    \"hv_battery_stop_conditioning\": {\n      \"name\": \"Parar condicionamento da bateria HV\",\n      \"description\": \"Parar o condicionamento da bateria HV de um carro definido por um vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        }\n      }\n    },\n    \"preconditioning_configure_seats\": {\n      \"name\": \"Configurar pré-condicionamento dos bancos\",\n      \"description\": \"Enviar um comando de configuração de pré-condicionamento dos bancos para um carro definido por um VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"front_left\": {\n          \"name\": \"Dianteiro esquerdo\",\n          \"description\": \"Ativar se o banco dianteiro esquerdo deve ser pré-condicionado.\"\n        },\n        \"front_right\": {\n          \"name\": \"Dianteiro direito\",\n          \"description\": \"Ativar se o banco dianteiro direito deve ser pré-condicionado.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Traseiro esquerdo\",\n          \"description\": \"Ativar se o banco traseiro esquerdo deve ser pré-condicionado.\"\n        },\n        \"rear_right\": {\n          \"name\": \"Traseiro direito\",\n          \"description\": \"Ativar se o banco traseiro direito deve ser pré-condicionado.\"\n        }\n      }\n    },\n    \"preheat_start\": {\n      \"name\": \"Iniciar pré-condicionamento\",\n      \"description\": \"Iniciar o pré-condicionamento de um carro definido por um vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"type\": {\n          \"name\": \"Tipo\",\n          \"description\": \"Método utilizado para iniciar o processo. 0=Agora (Predefinido), 1=Imediato - Utilize Imediato caso o seu carro não suporte Agora.\"\n        }\n      }\n    },\n    \"preheat_start_departure_time\": {\n      \"name\": \"Iniciar pré-condicionamento com hora de partida\",\n      \"description\": \"Iniciar o pré-condicionamento de um carro definido por um vin e uma hora de partida especificada.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"time\": {\n          \"name\": \"Hora\",\n          \"description\": \"Hora de partida em minutos após a meia-noite. Ex.: o valor válido para as 8h seria 480. O intervalo de valores é de 0 a 1439.\"\n        }\n      }\n    },\n    \"preheat_stop\": {\n      \"name\": \"Parar pré-condicionamento\",\n      \"description\": \"Parar o pré-condicionamento de um carro definido por um vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        }\n      }\n    },\n    \"preheat_stop_departure_time\": {\n      \"name\": \"Parar modo de pré-condicionamento com hora de partida\",\n      \"description\": \"Parar o pré-condicionamento com hora de partida configurada de um carro definido por um vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        }\n      }\n    },\n    \"preconditioning_configure\": {\n      \"name\": \"Configurar partida com pré-condicionamento\",\n      \"description\": \"Configurar o modo de hora de partida do pré-condicionamento. Utilize o modo 0 (Desativado) para cancelar o pré-condicionamento de partida agendado.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"departure_time_mode\": {\n          \"name\": \"Modo de hora de partida\",\n          \"description\": \"0=Desativado, 1=Partida única, 2=Partida semanal\"\n        },\n        \"departure_time\": {\n          \"name\": \"Hora de partida\",\n          \"description\": \"Hora de partida em minutos após a meia-noite (0-1439). Utilizado apenas quando o modo > 0.\"\n        }\n      }\n    },\n    \"sigpos_start\": {\n      \"name\": \"Iniciar sinal de posição\",\n      \"description\": \"Iniciar sinalização luminosa de um carro definido por um vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        }\n      }\n    },\n    \"sunroof_open\": {\n      \"name\": \"Abrir teto de abrir\",\n      \"description\": \"Abrir o teto de abrir de um carro definido por um vin. Configuração de PIN necessária. Consulte o diálogo de opções da integração.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de segurança, necessário se não estiver guardado nas definições.\"\n        }\n      }\n    },\n    \"sunroof_tilt\": {\n      \"name\": \"Inclinar teto de abrir\",\n      \"description\": \"Inclinar o teto de abrir de um carro definido por um vin. Configuração de PIN necessária. Consulte o diálogo de opções da integração.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de segurança, necessário se não estiver guardado nas definições.\"\n        }\n      }\n    },\n    \"sunroof_close\": {\n      \"name\": \"Fechar teto de abrir\",\n      \"description\": \"Fechar o teto de abrir de um carro definido por um vin.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        }\n      }\n    },\n    \"temperature_configure\": {\n      \"name\": \"Configurar temperatura alvo (pré-cond/aquec. auxiliar)\",\n      \"description\": \"Configurar as temperaturas alvo de pré-condicionamento/aquecimento auxiliar para zonas num carro definido por um VIN.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"front_left\": {\n          \"name\": \"Dianteiro esquerdo\",\n          \"description\": \"Temperatura alvo para a zona dianteira esquerda em CELSIUS.\"\n        },\n        \"front_right\": {\n          \"name\": \"Dianteiro direito\",\n          \"description\": \"Temperatura alvo para a zona dianteira direita em CELSIUS.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Traseiro esquerdo\",\n          \"description\": \"Temperatura alvo para a zona traseira esquerda em CELSIUS. (se disponível)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Traseiro direito\",\n          \"description\": \"Temperatura alvo para a zona traseira direita em CELSIUS. (se disponível)\"\n        }\n      }\n    },\n    \"windows_open\": {\n      \"name\": \"Abrir janelas\",\n      \"description\": \"Abrir as janelas de um carro definido por um vin. Configuração de PIN necessária. Consulte o diálogo de opções da integração.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de segurança, necessário se não estiver guardado nas definições.\"\n        }\n      }\n    },\n    \"windows_close\": {\n      \"name\": \"Fechar janelas\",\n      \"description\": \"Fechar as janelas de um carro definido por um vin. Configuração de PIN necessária. Consulte o diálogo de opções da integração.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        }\n      }\n    },\n    \"windows_move\": {\n      \"name\": \"Mover janelas\",\n      \"description\": \"Mover as janelas de um carro definido por um vin para uma nova posição. Configuração de PIN necessária. Consulte o diálogo de opções da integração.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"pin\": {\n          \"name\": \"Pin\",\n          \"description\": \"PIN de segurança, necessário se não estiver guardado nas definições.\"\n        },\n        \"front_left\": {\n          \"name\": \"Dianteira esquerda\",\n          \"description\": \"A nova posição da janela dianteira esquerda (0=fechada, 10=ventilação, 100=aberta)\"\n        },\n        \"front_right\": {\n          \"name\": \"Dianteira direita\",\n          \"description\": \"A nova posição da janela dianteira direita (0=fechada, 10=ventilação, 100=aberta)\"\n        },\n        \"rear_left\": {\n          \"name\": \"Traseira esquerda\",\n          \"description\": \"A nova posição da janela traseira esquerda (0=fechada, 10=ventilação, 100=aberta)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Traseira direita\",\n          \"description\": \"A nova posição da janela traseira direita (0=fechada, 10=ventilação, 100=aberta)\"\n        }\n      }\n    },\n    \"send_route\": {\n      \"name\": \"Enviar rota\",\n      \"description\": \"Envia uma rota para o carro. (Apenas localização única)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"title\": {\n          \"name\": \"Título\",\n          \"description\": \"Título da rota\"\n        },\n        \"latitude\": {\n          \"name\": \"Latitude\",\n          \"description\": \"Latitude da localização\"\n        },\n        \"longitude\": {\n          \"name\": \"Longitude\",\n          \"description\": \"Longitude da localização\"\n        },\n        \"city\": {\n          \"name\": \"Cidade\",\n          \"description\": \"Nome da cidade da localização\"\n        },\n        \"postcode\": {\n          \"name\": \"Código postal\",\n          \"description\": \"Código postal da localização\"\n        },\n        \"street\": {\n          \"name\": \"Rua\",\n          \"description\": \"Nome da rua da localização\"\n        }\n      }\n    },\n    \"charging_break_clocktimer_configure\": {\n      \"name\": \"Configurar temporizador de pausa de carregamento\",\n      \"description\": \"Configurar pausas de carregamento (apenas AC). Isto irá substituir a configuração completa para todos os slots no seu carro.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Vin/Fin do carro\"\n        },\n        \"status_timer_1\": {\n          \"name\": \"Estado (Temporizador 1)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_1\": {\n          \"name\": \"Hora de início (Temporizador 1)\",\n          \"description\": \"Hora de início da janela de pausa de carregamento (Temporizador 1)\"\n        },\n        \"stoptime_timer_1\": {\n          \"name\": \"Hora de fim (Temporizador 1)\",\n          \"description\": \"Hora de fim da janela de pausa de carregamento (Temporizador 1)\"\n        },\n        \"status_timer_2\": {\n          \"name\": \"Estado (Temporizador 2)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_2\": {\n          \"name\": \"Hora de início (Temporizador 2)\",\n          \"description\": \"Hora de início da janela de pausa de carregamento (Temporizador 2)\"\n        },\n        \"stoptime_timer_2\": {\n          \"name\": \"Hora de fim (Temporizador 2)\",\n          \"description\": \"Hora de fim da janela de pausa de carregamento (Temporizador 2)\"\n        },\n        \"status_timer_3\": {\n          \"name\": \"Estado (Temporizador 3)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_3\": {\n          \"name\": \"Hora de início (Temporizador 3)\",\n          \"description\": \"Hora de início da janela de pausa de carregamento (Temporizador 3)\"\n        },\n        \"stoptime_timer_3\": {\n          \"name\": \"Hora de fim (Temporizador 3)\",\n          \"description\": \"Hora de fim da janela de pausa de carregamento (Temporizador 3)\"\n        },\n        \"status_timer_4\": {\n          \"name\": \"Estado (Temporizador 4)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_4\": {\n          \"name\": \"Hora de início (Temporizador 4)\",\n          \"description\": \"Hora de início da janela de pausa de carregamento (Temporizador 4)\"\n        },\n        \"stoptime_timer_4\": {\n          \"name\": \"Hora de fim (Temporizador 4)\",\n          \"description\": \"Hora de fim da janela de pausa de carregamento (Temporizador 4)\"\n        }\n      }\n    }\n  },\n  \"entity\": {\n    \"binary_sensor\": {\n      \"chargingactive\": {\n        \"name\": \"Carregamento ativo\"\n      }\n    },\n    \"sensor\": {\n      \"chargingpowerecolimit\": {\n        \"name\": \"Limite de potência de carregamento\"\n      },\n      \"auxheatstatus\": {\n        \"state\": {\n          \"0\": \"Inativo\",\n          \"1\": \"Aquecimento normal\",\n          \"2\": \"Ventilação normal\",\n          \"3\": \"Aquecimento manual\",\n          \"4\": \"Pós-aquecimento\",\n          \"5\": \"Pós-ventilação\",\n          \"6\": \"Aquecimento automático\"\n        }\n      },\n      \"chargeflapacstatus\": {\n        \"state\": {\n          \"0\": \"Aberta\",\n          \"1\": \"Fechada\",\n          \"2\": \"Aba pressionada\",\n          \"3\": \"Desconhecido\"\n        }\n      },\n      \"chargeflapdcstatus\": {\n        \"state\": {\n          \"0\": \"Aberta\",\n          \"1\": \"Fechada\",\n          \"2\": \"Aba pressionada\",\n          \"3\": \"Desconhecido\"\n        }\n      },\n      \"chargingstatus\": {\n        \"state\": {\n          \"0\": \"A carregar\",\n          \"1\": \"Carregamento a terminar\",\n          \"2\": \"Pausa de carregamento\",\n          \"3\": \"Desligado\",\n          \"4\": \"Falha\",\n          \"5\": \"Lento\",\n          \"6\": \"Rápido\",\n          \"7\": \"A descarregar\",\n          \"8\": \"Sem carregamento\",\n          \"9\": \"Carregamento lento após atingir meta de viagem\",\n          \"10\": \"A carregar após atingir meta de viagem\",\n          \"11\": \"Carregamento rápido após atingir meta de viagem\",\n          \"12\": \"Ligado\",\n          \"13\": \"Carregamento AC\",\n          \"14\": \"Carregamento DC\",\n          \"15\": \"Calibração da bateria ativa\",\n          \"16\": \"Desconhecido\"\n        }\n      },\n      \"departuretimemode\": {\n        \"state\": {\n          \"0\": \"Desativado\",\n          \"1\": \"Diário\",\n          \"2\": \"Semanal\"\n        }\n      },\n      \"ignitionstate\": {\n        \"state\": {\n          \"0\": \"Trancado\",\n          \"1\": \"Desligado\",\n          \"2\": \"Acessório\",\n          \"4\": \"Ligado\",\n          \"5\": \"Arranque\"\n        }\n      },\n      \"interiorprotectionsensorstatus\": {\n        \"state\": {\n          \"0\": \"Não ativo\",\n          \"1\": \"Não ativo\",\n          \"2\": \"Ativo\"\n        },\n        \"state_attributes\": {}\n      },\n      \"lock\": {\n        \"state\": {\n          \"0\": \"Destrancado\",\n          \"1\": \"Trancado int\",\n          \"2\": \"Trancado\",\n          \"3\": \"Parcialmente destrancado\",\n          \"4\": \"Desconhecido\"\n        },\n        \"state_attributes\": {\n          \"decklidstatus\": {\n            \"name\": \"Tampa da mala\",\n            \"state\": {\n              \"false\": \"fechada\",\n              \"true\": \"aberta\"\n            }\n          },\n          \"doorstatusfrontleft\": {\n            \"name\": \"Porta dianteira esquerda\",\n            \"state\": {\n              \"false\": \"fechada\",\n              \"true\": \"aberta\"\n            }\n          },\n          \"doorstatusfrontright\": {\n            \"name\": \"Porta dianteira direita\",\n            \"state\": {\n              \"false\": \"fechada\",\n              \"true\": \"aberta\"\n            }\n          },\n          \"doorstatusrearleft\": {\n            \"name\": \"Porta traseira esquerda\",\n            \"state\": {\n              \"false\": \"fechada\",\n              \"true\": \"aberta\"\n            }\n          },\n          \"doorstatusrearright\": {\n            \"name\": \"Porta traseira direita\",\n            \"state\": {\n              \"false\": \"fechada\",\n              \"true\": \"aberta\"\n            }\n          },\n          \"doorlockstatusfrontleft\": {\n            \"name\": \"Fecho da porta dianteira esquerda\",\n            \"state\": {\n              \"false\": \"trancada\",\n              \"true\": \"destrancada\"\n            }\n          },\n          \"doorlockstatusfrontright\": {\n            \"name\": \"Fecho da porta dianteira direita\",\n            \"state\": {\n              \"false\": \"trancada\",\n              \"true\": \"destrancada\"\n            }\n          },\n          \"doorlockstatusrearleft\": {\n            \"name\": \"Fecho da porta traseira esquerda\",\n            \"state\": {\n              \"false\": \"trancada\",\n              \"true\": \"destrancada\"\n            }\n          },\n          \"doorlockstatusrearright\": {\n            \"name\": \"Fecho da porta traseira direita\",\n            \"state\": {\n              \"false\": \"trancada\",\n              \"true\": \"destrancada\"\n            }\n          },\n          \"doorlockstatusgas\": {\n            \"name\": \"Fecho do depósito\",\n            \"state\": {\n              \"false\": \"trancado\",\n              \"true\": \"destrancado\"\n            }\n          },\n          \"enginehoodstatus\": {\n            \"name\": \"Capô do motor\",\n            \"state\": {\n              \"false\": \"fechado\",\n              \"true\": \"aberto\"\n            }\n          },\n          \"doorstatusoverall\": {\n            \"name\": \"Estado geral das portas\",\n            \"state\": {\n              \"0\": \"aberta\",\n              \"1\": \"fechada\",\n              \"2\": \"não existente\",\n              \"3\": \"desconhecido\"\n            }\n          },\n          \"sunroofstatus\": {\n            \"name\": \"Estado do teto de abrir\",\n            \"state\": {\n              \"0\": \"fechado\",\n              \"1\": \"aberto\",\n              \"2\": \"abertura por elevação\",\n              \"3\": \"em funcionamento\",\n              \"4\": \"posição anti-vibração\",\n              \"5\": \"deslizamento intermédio\",\n              \"6\": \"elevação intermédia\",\n              \"7\": \"a abrir\",\n              \"8\": \"a fechar\",\n              \"9\": \"elevação anti-vibração\",\n              \"10\": \"posição intermédia\",\n              \"11\": \"abertura por elevação\",\n              \"12\": \"fecho por elevação\"\n            }\n          }\n        }\n      },\n      \"sunroofstatus\": {\n        \"state\": {\n          \"0\": \"Fechado\",\n          \"1\": \"Aberto\",\n          \"2\": \"Abertura por elevação\",\n          \"3\": \"Em funcionamento\",\n          \"4\": \"Anti-vibração\",\n          \"5\": \"Deslizamento intermédio\",\n          \"6\": \"Elevação intermédia\",\n          \"7\": \"A abrir\",\n          \"8\": \"A fechar\",\n          \"9\": \"Elevação anti-vibração\",\n          \"10\": \"Posição intermédia\",\n          \"11\": \"Abertura por elevação\",\n          \"12\": \"Fecho por elevação\"\n        },\n        \"state_attributes\": {}\n      },\n      \"starterbatterystate\": {\n        \"state\": {\n          \"0\": \"Verde\",\n          \"1\": \"Amarelo\",\n          \"2\": \"Vermelho\"\n        }\n      },\n      \"tirewarningsrdk\": {\n        \"state\": {\n          \"0\": \"Sem aviso\",\n          \"1\": \"Aviso suave\",\n          \"2\": \"Pressão baixa\",\n          \"3\": \"Furo\"\n        }\n      },\n      \"selectedchargeprogram\": {\n        \"state\": {\n          \"0\": \"Padrão\",\n          \"2\": \"Casa\",\n          \"3\": \"Trabalho\",\n          \"4\": \"Não suportado\"\n        }\n      }\n    },\n    \"switch\": {\n      \"auxheat\": {\n        \"name\": \"Aquecimento auxiliar\"\n      },\n      \"precond\": {\n        \"name\": \"Climatização pré-entrada\"\n      }\n    },\n    \"button\": {\n      \"btn_preheat_start_now\": {\n        \"name\": \"Iniciar pré-climatização\"\n      },\n      \"btn_preheat_stop_now\": {\n        \"name\": \"Parar pré-climatização\"\n      },\n      \"btn_sigpos_start_now\": {\n        \"name\": \"Piscar luzes\"\n      }\n    }\n  },\n  \"selector\": {\n    \"charge_program\": {\n      \"options\": {\n        \"0\": \"Predefinido\",\n        \"2\": \"Casa\",\n        \"3\": \"Trabalho\"\n      }\n    },\n    \"charging_break_clocktimer_configure_action\": {\n      \"options\": {\n        \"notset\": \"Não definido\",\n        \"active\": \"Ativo\",\n        \"inactive\": \"Inativo\"\n      }\n    },\n    \"temperature_configure\": {\n      \"options\": {\n        \"0\": \"Baixo\",\n        \"30\": \"Alto\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/sv.json",
    "content": "{\n  \"config\": {\n    \"abort\": {\n      \"already_configured\": \"Komponenten är redan konfigurerad.\",\n      \"reauth_successful\": \"Återautentisering lyckades! Komponenten laddas om.\"\n    },\n    \"error\": {\n      \"cannot_connect\": \"cannot_connect\",\n      \"invalid_auth\": \"invalid_auth\",\n      \"unknown\": \"Okänt fel. Kontrollera Home Assistant-loggen för mer information.\",\n      \"2fa_required\": \"Tvåfaktorsautentisering (2FA)-konton stöds inte.\",\n      \"legal_terms\": \"Du måste först godkänna de juridiska villkoren på Mercedes webbplats\"\n    },\n    \"step\": {\n      \"user\": {\n        \"data\": {\n          \"region\": \"Region\"\n        },\n        \"description\": \"Välj region.\",\n        \"title\": \"Konfigurera Mercedes ME 2020-anslutningen\"\n      },\n      \"credentials\": {\n        \"data\": {\n          \"username\": \"MB användarnamn (e-postadress)\",\n          \"password\": \"Lösenord\"\n        },\n        \"description\": \"Ange dina kontouppgifter.\",\n        \"title\": \"Mercedes ME 2020 - Inloggningsuppgifter\"\n      },\n      \"pin\": {\n        \"data\": {\n          \"password\": \"TAN (mottaget via e-post eller SMS)\"\n        },\n        \"description\": \"Ange det TAN-nummer du har fått via e-post eller SMS för att slutföra autentiseringen. Om du inte har fått något TAN, kontrollera din e-postinkorg (och skräppostmappen) eller dina SMS-meddelanden.\",\n        \"title\": \"Mercedes ME 2020 - TAN\"\n      }\n    }\n  },\n  \"issues\": {\n    \"restart_required\": {\n      \"fix_flow\": {\n        \"step\": {\n          \"confirm_restart\": {\n            \"description\": \"Omstart av Home Assistant krävs för att slutföra autentiseringsuppdateringen. Klicka på skicka för att starta om nu.\",\n            \"title\": \"Omstart krävs\"\n          }\n        }\n      },\n      \"title\": \"Omstart krävs\"\n    }\n  },\n  \"options\": {\n    \"abort\": {\n      \"already_configured\": \"Komponenten är redan konfigurerad.\",\n      \"reauth_successful\": \"Återautentisering lyckades! Komponenten laddas om.\"\n    },\n    \"step\": {\n      \"init\": {\n        \"data\": {\n          \"cap_check_disabled\": \"Inaktivera kompabilitetskontroll\",\n          \"enable_china_gcj_02\": \"Aktivera GCJ-02-översättning (endast Kina)\",\n          \"delete_auth_file\": \"Ta bort autentiseringstoken nu. Kräver att Home Assistant startas om efter att du har sparat.\",\n          \"excluded_cars\": \"VIN-nummer exkluderade (komma-separerade)\",\n          \"pin\": \"Säkerhets-PIN (ska skapas i mobilappen)\",\n          \"save_files\": \"ENDAST DEBUG: Aktivera spara servermeddelanden i mappen meddelanden\",\n          \"overwrite_cap_precondnow\": \"Exp: Skriv över funktionsförutsättning nu (inställd på sant)\"\n        },\n        \"description\": \"Konfigurera dina inställningar. Vissa ändringar kräver att Home Assistant startas om.\",\n        \"title\": \"Mercedes ME 2020 Inställningar\"\n      }\n    }\n  },\n  \"system_health\": {\n    \"info\": {\n      \"api_endpoint_reachable\": \"MB API är nåbart\",\n      \"websocket_connection_state\": \"MB WS-tillstånd\",\n      \"cars_connected\": \"Anslutna bilar\",\n      \"version\": \"Version\"\n    }\n  },\n  \"services\": {\n    \"refresh_access_token\": {\n      \"name\": \"Uppdatera åtkomsttoken\",\n      \"description\": \"Uppdatera API-åtkomsttoken\"\n    },\n    \"auxheat_configure\": {\n      \"name\": \"Konfigurera parkeringsvärmare\",\n      \"description\": \"Kommando för att konfigurera parkeringsvärmaren. Det är möjligt att definiera tre tidpunkter och välja en aktiv tid.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"time_selection\": {\n          \"name\": \"Välj tid\",\n          \"description\": \"Den aktiverade förinställda tiden för extravärmaren (0=inget_val, 1=tid_1, 2=tid_2, 3=tid_3)\"\n        },\n        \"time_1\": {\n          \"name\": \"time_1\",\n          \"description\": \"Tidpunkt i minuter efter midnatt. Exempelvis är 480 ett giltigt värde för kl. 08.00. Värdeområdet är 0 till 1439.\"\n        },\n        \"time_2\": {\n          \"name\": \"time_2\",\n          \"description\": \"Tidpunkt i minuter efter midnatt. T.ex. är 480 ett giltigt värde för kl. 08.00. Värdeområdet är 0 till 1439.\"\n        },\n        \"time_3\": {\n          \"name\": \"time_3\",\n          \"description\": \"Tidpunkt i minuter efter midnatt. T.ex. är 480 ett giltigt värde för kl. 08.00. Värdeområdet är 0 till 1439.\"\n        }\n      }\n    },\n    \"auxheat_start\": {\n      \"name\": \"Starta parkeringsvärmare\",\n      \"description\": \"Starta parkeringsvärmaren för en bil definierad av ett VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"auxheat_stop\": {\n      \"name\": \"Stoppa parkeringsvärmare\",\n      \"description\": \"Stoppa parkeringsvärmaren för en bil definierad av ett VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"battery_max_soc_configure\": {\n      \"name\": \"Konfigurera batteriets maximala laddningsnivå (SoC)\",\n      \"description\": \"Konfigurera det maximala värdet för laddningsnivån (SoC) i högspänningsbatteriet för en bil definierad av ett VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"max_soc\": {\n          \"name\": \"Maximal laddningsnivå (SoC)\",\n          \"description\": \"Det maximala värdet för högspänningsbatteriets laddningsnivå (SoC). Värdet måste vara mellan 50 (vissa nya bilar, som 2025 års CLA, stöder 30) och 100, samt vara jämnt delbart med tio.\"\n        },\n        \"charge_program\": {\n          \"name\": \"Laddningsprogram\",\n          \"description\": \"(Valfritt, förvalt=0) Laddningsprogram som ska ändras (0=Förvalt, 2=Hem, 3=Arbete) (används ej för 2025 års CLA)\"\n        }\n      }\n    },\n    \"charge_program_configure\": {\n      \"name\": \"Konfigurera laddningsprogram\",\n      \"description\": \"Kommando för att välja laddningsprogram.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"charge_program\": {\n          \"name\": \"Laddningsprogram\",\n          \"description\": \"Det aktiverade laddningsprogrammet (0=Förvalt, 2=Hem, 3=Arbete)\"\n        },\n        \"max_soc\": {\n          \"name\": \"Maximal laddningsnivå (SoC)\",\n          \"description\": \"Det maximala värdet för högspänningsbatteriets laddningsnivå (SoC). Värdet måste vara mellan 50 och 100 och vara jämnt delbart med tio.\"\n        }\n      }\n    },\n    \"doors_unlock\": {\n      \"name\": \"Lås upp dörrar\",\n      \"description\": \"Lås upp en bil definierad av ett VIN-nummer. Konfiguration av PIN-kod krävs. Se integreringsalternativen i inställningarna.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kod\",\n          \"description\": \"Säkerhetskod (PIN), krävs om den inte finns sparad i inställningarna.\"\n        }\n      }\n    },\n    \"doors_lock\": {\n      \"name\": \"Lås dörrar\",\n      \"description\": \"Lås en bil definierad av ett VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"download_images\": {\n      \"name\": \"Hämta bilder\",\n      \"description\": \"Hämtar app-bilder till komponentens resursmapp för en bil definierad av ett VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"engine_start\": {\n      \"name\": \"Starta motor\",\n      \"description\": \"Starta motorn på en bil definierad av ett VIN-nummer. Konfiguration av PIN-kod krävs. Se integreringsalternativen i inställningarna.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kod\",\n          \"description\": \"Säkerhetskod (PIN), krävs om den inte finns sparad i inställningarna.\"\n        }\n      }\n    },\n    \"engine_stop\": {\n      \"name\": \"Stäng av motor\",\n      \"description\": \"Stäng av motorn på en bil definierad av ett VIN-nummer. Konfiguration av PIN-kod krävs. Se integreringsalternativen i inställningarna.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"hv_battery_start_conditioning\": {\n      \"name\": \"Starta konditionering av högspänningsbatteri\",\n      \"description\": \"Starta konditioneringen av högspänningsbatteriet för en bil definierad av ett VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"hv_battery_stop_conditioning\": {\n      \"name\": \"Stoppa konditionering av högspänningsbatteri\",\n      \"description\": \"Stoppa konditioneringen av högspänningsbatteriet för en bil definierad av ett VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"preconditioning_configure_seats\": {\n      \"name\": \"Konfigurera säten för förklimatisering\",\n      \"description\": \"Skicka ett konfigurationskommando för sätesförklimatisering till en bil definierad av ett VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"front_left\": {\n          \"name\": \"Vänster fram\",\n          \"description\": \"Aktivera om det vänstra framsätet ska förklimatiseras.\"\n        },\n        \"front_right\": {\n          \"name\": \"Höger fram\",\n          \"description\": \"Aktivera om det högra framsätet ska förklimatiseras.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Vänster bak\",\n          \"description\": \"Aktivera om det vänstra baksätet ska förklimatiseras.\"\n        },\n        \"rear_right\": {\n          \"name\": \"Höger bak\",\n          \"description\": \"Aktivera om det högra baksätet ska förklimatiseras.\"\n        }\n      }\n    },\n    \"preheat_start\": {\n      \"name\": \"Starta förklimatisering\",\n      \"description\": \"Starta förklimatiseringen för en bil definierad av ett VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"type\": {\n          \"name\": \"Typ\",\n          \"description\": \"Metod som används för att initiera startprocessen. 0=Nu (Standard), 1=Omedelbart - Använd Omedelbart om din bil inte stöder Nu.\"\n        }\n      }\n    },\n    \"preheat_start_departure_time\": {\n      \"name\": \"Starta förklimatisering med avresetid\",\n      \"description\": \"Starta förklimatiseringen för en bil definierad av ett VIN-nummer och en angiven avresetid.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"time\": {\n          \"name\": \"Tid\",\n          \"description\": \"Avresetid i minuter efter midnatt. Exempelvis är 480 ett giltigt värde för kl. 08.00. Värdeområdet är 0 till 1439.\"\n        }\n      }\n    },\n    \"preheat_stop\": {\n      \"name\": \"Stoppa förklimatisering\",\n      \"description\": \"Stoppa förklimatiseringen för en bil definierad av ett VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"preheat_stop_departure_time\": {\n      \"name\": \"Stoppa förklimatisering för avresetid\",\n      \"description\": \"Stoppa den konfigurerade förklimatiseringen för avresetid för en bil definierad av ett VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"preconditioning_configure\": {\n      \"name\": \"Konfigurera förklimatisering för avresa\",\n      \"description\": \"Konfigurera läge för förklimatisering vid avresa. Använd läge 0 (Inaktiverad) för att avbryta schemalagd förklimatisering vid avresa.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"departure_time_mode\": {\n          \"name\": \"Läge för avresetid\",\n          \"description\": \"0=Inaktiverad, 1=Enskild avresa, 2=Veckovis avresa\"\n        },\n        \"departure_time\": {\n          \"name\": \"Avresetid\",\n          \"description\": \"Avresetid i minuter efter midnatt (0-1439). Används endast när läget är > 0.\"\n        }\n      }\n    },\n    \"sigpos_start\": {\n      \"name\": \"Starta signalposition\",\n      \"description\": \"Starta ljussignalering för en bil definierad av ett VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"sunroof_open\": {\n      \"name\": \"Öppna taklucka\",\n      \"description\": \"Öppna takluckan på en bil definierad av ett VIN-nummer. Konfiguration av PIN-kod krävs. Se integreringsalternativen i inställningarna.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kod\",\n          \"description\": \"Säkerhetskod (PIN), krävs om den inte finns sparad i inställningarna.\"\n        }\n      }\n    },\n    \"sunroof_tilt\": {\n      \"name\": \"Vinkla taklucka\",\n      \"description\": \"Vinkla takluckan på en bil definierad av ett VIN-nummer. Konfiguration av PIN-kod krävs. Se integreringsalternativen i inställningarna.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kod\",\n          \"description\": \"Säkerhetskod (PIN), krävs om den inte finns sparad i inställningarna.\"\n        }\n      }\n    },\n    \"sunroof_close\": {\n      \"name\": \"Stäng taklucka\",\n      \"description\": \"Stäng takluckan på en bil definierad av ett VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"temperature_configure\": {\n      \"name\": \"Konfigurera måltemperatur (förklimatisering/parkeringsvärmare)\",\n      \"description\": \"Konfigurera måltemperaturer för förklimatisering/parkeringsvärmare för zoner i en bil definierad av ett VIN-nummer.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"front_left\": {\n          \"name\": \"Vänster fram\",\n          \"description\": \"Måltemperatur för zonen vänster fram i CELSIUS.\"\n        },\n        \"front_right\": {\n          \"name\": \"Höger fram\",\n          \"description\": \"Måltemperatur för zonen höger fram i CELSIUS.\"\n        },\n        \"rear_left\": {\n          \"name\": \"Vänster bak\",\n          \"description\": \"Måltemperatur för zonen vänster bak i CELSIUS. (om tillgängligt)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Höger bak\",\n          \"description\": \"Måltemperatur för zonen höger bak i CELSIUS. (om tillgängligt)\"\n        }\n      }\n    },\n    \"windows_open\": {\n      \"name\": \"Öppna fönster\",\n      \"description\": \"Öppna fönstren på en bil definierad av ett VIN-nummer. Konfiguration av PIN-kod krävs. Se integreringsalternativen i inställningarna.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kod\",\n          \"description\": \"Säkerhetskod (PIN), krävs om den inte finns sparad i inställningarna.\"\n        }\n      }\n    },\n    \"windows_close\": {\n      \"name\": \"Stäng fönster\",\n      \"description\": \"Stäng fönstren på en bil definierad av ett VIN-nummer. Konfiguration av PIN-kod krävs. Se integreringsalternativen i inställningarna.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        }\n      }\n    },\n    \"windows_move\": {\n      \"name\": \"Flytta fönster\",\n      \"description\": \"Flytta fönstren på en bil definierad av ett VIN-nummer till en ny position. Konfiguration av PIN-kod krävs. Se integreringsalternativen i inställningarna.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"pin\": {\n          \"name\": \"PIN-kod\",\n          \"description\": \"Säkerhetskod (PIN), krävs om den inte finns sparad i inställningarna.\"\n        },\n        \"front_left\": {\n          \"name\": \"Vänster fram\",\n          \"description\": \"Den nya positionen för vänster framfönster (0=stängt, 10=vädring, 100=öppet)\"\n        },\n        \"front_right\": {\n          \"name\": \"Höger fram\",\n          \"description\": \"Den nya positionen för höger framfönster (0=stängt, 10=vädring, 100=öppet)\"\n        },\n        \"rear_left\": {\n          \"name\": \"Vänster bak\",\n          \"description\": \"Den nya positionen för vänster bakfönster (0=stängt, 10=vädring, 100=öppet)\"\n        },\n        \"rear_right\": {\n          \"name\": \"Höger bak\",\n          \"description\": \"Den nya positionen för höger bakfönster (0=stängt, 10=vädring, 100=öppet)\"\n        }\n      }\n    },\n    \"send_route\": {\n      \"name\": \"Skicka rutt\",\n      \"description\": \"Skickar en rutt till bilen. (Endast en plats)\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"title\": {\n          \"name\": \"Titel\",\n          \"description\": \"Ruttens titel\"\n        },\n        \"latitude\": {\n          \"name\": \"Latitud\",\n          \"description\": \"Platsens latitud\"\n        },\n        \"longitude\": {\n          \"name\": \"Longitud\",\n          \"description\": \"Platsens longitud\"\n        },\n        \"city\": {\n          \"name\": \"Stad\",\n          \"description\": \"Platsens stadsnamn\"\n        },\n        \"postcode\": {\n          \"name\": \"Postnummer\",\n          \"description\": \"Platsens postnummer\"\n        },\n        \"street\": {\n          \"name\": \"Gata\",\n          \"description\": \"Platsens gatunamn\"\n        }\n      }\n    },\n    \"charging_break_clocktimer_configure\": {\n      \"name\": \"Konfigurera tidsinställning för laddningspaus\",\n      \"description\": \"Konfigurera laddningspauser (endast AC). Detta kommer att skriva över hela konfigurationen för alla platser i din bil.\",\n      \"fields\": {\n        \"vin\": {\n          \"name\": \"Vin\",\n          \"description\": \"Bilens Vin/Fin\"\n        },\n        \"status_timer_1\": {\n          \"name\": \"Status (Timer 1)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_1\": {\n          \"name\": \"Starttid (Timer 1)\",\n          \"description\": \"Starttid för laddningspausfönstret (Timer 1)\"\n        },\n        \"stoptime_timer_1\": {\n          \"name\": \"Sluttid (Timer 1)\",\n          \"description\": \"Sluttid för laddningspausfönstret (Timer 1)\"\n        },\n        \"status_timer_2\": {\n          \"name\": \"Status (Timer 2)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_2\": {\n          \"name\": \"Starttid (Timer 2)\",\n          \"description\": \"Starttid för laddningspausfönstret (Timer 2)\"\n        },\n        \"stoptime_timer_2\": {\n          \"name\": \"Sluttid (Timer 2)\",\n          \"description\": \"Sluttid för laddningspausfönstret (Timer 2)\"\n        },\n        \"status_timer_3\": {\n          \"name\": \"Status (Timer 3)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_3\": {\n          \"name\": \"Starttid (Timer 3)\",\n          \"description\": \"Starttid för laddningspausfönstret (Timer 3)\"\n        },\n        \"stoptime_timer_3\": {\n          \"name\": \"Sluttid (Timer 3)\",\n          \"description\": \"Sluttid för laddningspausfönstret (Timer 3)\"\n        },\n        \"status_timer_4\": {\n          \"name\": \"Status (Timer 4)\",\n          \"description\": \"\"\n        },\n        \"starttime_timer_4\": {\n          \"name\": \"Starttid (Timer 4)\",\n          \"description\": \"Starttid för laddningspausfönstret (Timer 4)\"\n        },\n        \"stoptime_timer_4\": {\n          \"name\": \"Sluttid (Timer 4)\",\n          \"description\": \"Sluttid för laddningspausfönstret (Timer 4)\"\n        }\n      }\n    }\n  },\n  \"entity\": {\n    \"binary_sensor\": {\n      \"chargingactive\": {\n        \"name\": \"Laddning aktiv\"\n      }\n    },\n    \"sensor\": {\n      \"chargingpowerecolimit\": {\n        \"name\": \"Laddningseffektgräns\"\n      },\n      \"auxheatstatus\": {\n        \"state\": {\n          \"0\": \"Inaktiv\",\n          \"1\": \"Normal uppvärmning\",\n          \"2\": \"Normal ventilation\",\n          \"3\": \"Manuell uppvärmning\",\n          \"4\": \"Eftervärmning\",\n          \"5\": \"Efterventilation\",\n          \"6\": \"Automatisk uppvärmning\"\n        }\n      },\n      \"chargeflapacstatus\": {\n        \"state\": {\n          \"0\": \"Öppen\",\n          \"1\": \"Stängd\",\n          \"2\": \"Lucka nedtryckt\",\n          \"3\": \"Okänd\"\n        }\n      },\n      \"chargeflapdcstatus\": {\n        \"state\": {\n          \"0\": \"Öppen\",\n          \"1\": \"Stängd\",\n          \"2\": \"Lucka nedtryckt\",\n          \"3\": \"Okänd\"\n        }\n      },\n      \"chargingstatus\": {\n        \"state\": {\n          \"0\": \"laddar\",\n          \"1\": \"laddning avslutas\",\n          \"2\": \"Laddningspaus\",\n          \"3\": \"urkopplad\",\n          \"4\": \"fel\",\n          \"5\": \"långsam\",\n          \"6\": \"snabb\",\n          \"7\": \"laddar ur\",\n          \"8\": \"laddar inte\",\n          \"9\": \"långsam laddning efter att ha nått resemål\",\n          \"10\": \"laddning efter att ha nått resemål\",\n          \"11\": \"snabb laddning efter att ha nått resemål\",\n          \"12\": \"Ansluten\",\n          \"13\": \"AC-laddning\",\n          \"14\": \"DC-laddning\",\n          \"15\": \"Batterikalibrering aktiv\",\n          \"16\": \"okänd\"\n        }\n      },\n      \"departuretimemode\": {\n        \"state\": {\n          \"0\": \"Inaktiverad\",\n          \"1\": \"Dagligen\",\n          \"2\": \"Veckovis\"\n        }\n      },\n      \"ignitionstate\": {\n        \"state\": {\n          \"0\": \"Låst\",\n          \"1\": \"Av\",\n          \"2\": \"Tillbehör\",\n          \"4\": \"På\",\n          \"5\": \"Start\"\n        }\n      },\n      \"interiorprotectionsensorstatus\": {\n        \"state\": {\n          \"0\": \"Ej aktiv\",\n          \"1\": \"Ej aktiv\",\n          \"2\": \"Aktiv\"\n        },\n        \"state_attributes\": {}\n      },\n      \"lock\": {\n        \"state\": {\n          \"0\": \"Upplåst\",\n          \"1\": \"Låst internt\",\n          \"2\": \"Låst\",\n          \"3\": \"Delvis upplåst\",\n          \"4\": \"Okänd\"\n        },\n        \"state_attributes\": {\n          \"decklidstatus\": {\n            \"name\": \"Bagagelucka\",\n            \"state\": {\n              \"false\": \"stängd\",\n              \"true\": \"öppen\"\n            }\n          },\n          \"doorstatusfrontleft\": {\n            \"name\": \"Dörr vänster fram\",\n            \"state\": {\n              \"false\": \"stängd\",\n              \"true\": \"öppen\"\n            }\n          },\n          \"doorstatusfrontright\": {\n            \"name\": \"Dörr höger fram\",\n            \"state\": {\n              \"false\": \"stängd\",\n              \"true\": \"öppen\"\n            }\n          },\n          \"doorstatusrearleft\": {\n            \"name\": \"Dörr vänster bak\",\n            \"state\": {\n              \"false\": \"stängd\",\n              \"true\": \"öppen\"\n            }\n          },\n          \"doorstatusrearright\": {\n            \"name\": \"Dörr höger bak\",\n            \"state\": {\n              \"false\": \"stängd\",\n              \"true\": \"öppen\"\n            }\n          },\n          \"doorlockstatusfrontleft\": {\n            \"name\": \"Dörrlås vänster fram\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"upplåst\"\n            }\n          },\n          \"doorlockstatusfrontright\": {\n            \"name\": \"Dörrlås höger fram\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"upplåst\"\n            }\n          },\n          \"doorlockstatusrearleft\": {\n            \"name\": \"Dörrlås vänster bak\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"upplåst\"\n            }\n          },\n          \"doorlockstatusrearright\": {\n            \"name\": \"Dörrlås höger bak\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"upplåst\"\n            }\n          },\n          \"doorlockstatusgas\": {\n            \"name\": \"Tanklucka\",\n            \"state\": {\n              \"false\": \"låst\",\n              \"true\": \"upplåst\"\n            }\n          },\n          \"enginehoodstatus\": {\n            \"name\": \"Motorhuv\",\n            \"state\": {\n              \"false\": \"stängd\",\n              \"true\": \"öppen\"\n            }\n          },\n          \"doorstatusoverall\": {\n            \"name\": \"Övergripande dörrstatus\",\n            \"state\": {\n              \"0\": \"öppen\",\n              \"1\": \"stängd\",\n              \"2\": \"finns ej\",\n              \"3\": \"okänd\"\n            }\n          },\n          \"sunroofstatus\": {\n            \"name\": \"Takluckestatus\",\n            \"state\": {\n              \"0\": \"stängd\",\n              \"1\": \"öppen\",\n              \"2\": \"lyft öppen\",\n              \"3\": \"körs\",\n              \"4\": \"vindavvisande läge\",\n              \"5\": \"mellanläge glidande\",\n              \"6\": \"mellanläge lyftande\",\n              \"7\": \"öppnar\",\n              \"8\": \"stänger\",\n              \"9\": \"vindavvisande lyftning\",\n              \"10\": \"mellanläge\",\n              \"11\": \"öppnar lyftning\",\n              \"12\": \"stänger lyftning\"\n            }\n          }\n        }\n      },\n      \"sunroofstatus\": {\n        \"state\": {\n          \"0\": \"Stängd\",\n          \"1\": \"Öppen\",\n          \"2\": \"Öppen lyftning\",\n          \"3\": \"Körs\",\n          \"4\": \"Vindavvisande läge\",\n          \"5\": \"Mellanläge glidande\",\n          \"6\": \"Mellanläge lyftande\",\n          \"7\": \"Öppnar\",\n          \"8\": \"Stänger\",\n          \"9\": \"Vindavvisande lyftning\",\n          \"10\": \"Mellanposition\",\n          \"11\": \"Öppnar lyftning\",\n          \"12\": \"Stänger lyftning\"\n        },\n        \"state_attributes\": {}\n      },\n      \"starterbatterystate\": {\n        \"state\": {\n          \"0\": \"Grön\",\n          \"1\": \"Gul\",\n          \"2\": \"Röd\"\n        }\n      },\n      \"tirewarningsrdk\": {\n        \"state\": {\n          \"0\": \"Ingen varning\",\n          \"1\": \"Mjuk varning\",\n          \"2\": \"Lågt tryck\",\n          \"3\": \"Punktering\"\n        }\n      },\n      \"selectedchargeprogram\": {\n        \"state\": {\n          \"0\": \"Standard\",\n          \"2\": \"Hem\",\n          \"3\": \"Arbete\",\n          \"4\": \"Stöds inte\"\n        }\n      }\n    },\n    \"switch\": {\n      \"auxheat\": {\n        \"name\": \"Parkeringsvärmare\"\n      },\n      \"precond\": {\n        \"name\": \"Förklimatisering\"\n      }\n    },\n    \"button\": {\n      \"btn_preheat_start_now\": {\n        \"name\": \"Starta förklimatisering\"\n      },\n      \"btn_preheat_stop_now\": {\n        \"name\": \"Stoppa förklimatisering\"\n      },\n      \"btn_sigpos_start_now\": {\n        \"name\": \"Blinka lampor\"\n      }\n    }\n  },\n  \"selector\": {\n    \"charge_program\": {\n      \"options\": {\n        \"0\": \"Förvalt\",\n        \"2\": \"Hem\",\n        \"3\": \"Arbete\"\n      }\n    },\n    \"charging_break_clocktimer_configure_action\": {\n      \"options\": {\n        \"notset\": \"Inte inställd\",\n        \"active\": \"Aktiv\",\n        \"inactive\": \"Inaktiv\"\n      }\n    },\n    \"temperature_configure\": {\n      \"options\": {\n        \"0\": \"Låg\",\n        \"30\": \"Hög\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/translations/ta.json",
    "content": "{\n    \"config\": {\n        \"abort\": {\n            \"already_configured\": \"கூறு ஏற்கனவே கட்டமைக்கப்பட்டுள்ளது.\",\n            \"reauth_successful\": \"மறுஅங்கீகாரம் வெற்றிகரமாக! கூறு மறுஏற்றம் முன்னேற்றத்தில்.\"\n        },\n        \"error\": {\n            \"cannot_connect\": \"cannot_connect\",\n            \"invalid_auth\": \"invalid_auth\",\n            \"unknown\": \"தெரியாத பிழை. மேலும் தகவலுக்கு ஹோம் அசிஸ்டன்ட் பதிவை சரிபார்க்கவும்.\",\n            \"2fa_required\": \"இரு-காரணி அங்கீகாரம் (2FA) கணக்குகள் ஆதரிக்கப்படவில்லை.\",\n            \"legal_terms\": \"முதலில் மெர்சிடிஸ் இணையதளத்தில் சட்ட விதிமுறைகளை ஏற்றுக்கொள்ள வேண்டும்\"\n        },\n        \"step\": {\n            \"user\": {\n                \"data\": {\n                    \"region\": \"பகுதி\"\n                },\n                \"description\": \"உங்கள் பகுதியைத் தேர்ந்தெடுக்கவும்.\",\n                \"title\": \"Mercedes ME 2020 இணைப்பை அமைக்கவும்\"\n            },\n            \"credentials\": {\n                \"data\": {\n                    \"username\": \"MB பயனர்பெயர் (மின்னஞ்சல் முகவரி)\",\n                    \"password\": \"கடவுச்சொல்\"\n                },\n                \"description\": \"உங்கள் கணக்கு விவரங்களை உள்ளிடவும்.\",\n                \"title\": \"Mercedes ME 2020 - உள்நுழைவு\"\n            },\n            \"pin\": {\n                \"data\": {\n                    \"password\": \"TAN (மின்னஞ்சல் அல்லது SMS மூலம் பெறப்பட்டது)\"\n                },\n                \"description\": \"அங்கீகாரத்தை முடிக்க மின்னஞ்சல் அல்லது SMS மூலம் பெற்ற TAN ஐ உள்ளிடவும். நீங்கள் TAN பெறவில்லை என்றால், உங்கள் மின்னஞ்சல் இன்பாக்ஸ் (மற்றும் ஸ்பேம் கோப்புறை) அல்லது உங்கள் SMS செய்திகளைச் சரிபார்க்கவும்.\",\n                \"title\": \"Mercedes ME 2020 - டான்\"\n            }\n        }\n    },\n    \"issues\": {\n        \"restart_required\": {\n            \"fix_flow\": {\n                \"step\": {\n                    \"confirm_restart\": {\n                        \"description\": \"அங்கீகார புதுப்பிப்பை முடிக்க ஹோம் அசிஸ்டன்ட் மறுதொடக்கம் தேவை, இப்போது மறுதொடக்கம் செய்ய சமர்ப்பிக்கவும்.\",\n                        \"title\": \"மறுதொடக்கம் தேவை\"\n                    }\n                }\n            },\n            \"title\": \"மறுதொடக்கம் தேவை\"\n        }\n    },\n    \"options\": {\n        \"abort\": {\n            \"already_configured\": \"கூறு ஏற்கனவே கட்டமைக்கப்பட்டுள்ளது.\",\n            \"reauth_successful\": \"மறுஅங்கீகாரம் வெற்றிகரமாக! கூறு மறுஏற்றம் முன்னேற்றத்தில்.\"\n        },\n        \"step\": {\n            \"init\": {\n                \"data\": {\n                    \"cap_check_disabled\": \"திறன்கள் சரிபார்ப்பை முடக்கு\",\n                    \"enable_china_gcj_02\": \"GCJ-02 மொழிபெயர்ப்பை இயக்கவும் (சீனா மட்டும்)\",\n                    \"delete_auth_file\": \"அங்கீகார டோக்கனை இப்போது நீக்கு. சேமித்த பிறகு ஹோம் அசிஸ்டன்ட் மறுதொடக்கம் தேவை.\",\n                    \"excluded_cars\": \"விலக்கப்பட்ட VIN கள் (கமா-பிரிப்பு)\",\n                    \"pin\": \"பாதுகாப்பு PIN (மொபைல் பயன்பாட்டில் உருவாக்கப்பட வேண்டும்)\",\n                    \"save_files\": \"பிழைத்திருத்தம் மட்டும்: சேவையக செய்திகளை செய்திகள் கோப்புறையில் சேமிக்கவும்\",\n                    \"overwrite_cap_precondnow\": \"சோதனை: precondnow திறனை மேலெழுதவும் (உண்மை என அமைக்கவும்)\"\n                },\n                \"description\": \"உங்கள் விருப்பங்களை உள்ளமைக்கவும். சில மாற்றங்களுக்கு ஹோம் அசிஸ்டன்ட் மறுதொடக்கம் தேவைப்படுகிறது.\",\n                \"title\": \"Mercedes ME 2020 விருப்பங்கள்\"\n            }\n        }\n    },\n    \"system_health\": {\n        \"info\": {\n            \"api_endpoint_reachable\": \"MB API அடையக்கூடியது\",\n            \"websocket_connection_state\": \"MB WS நிலை\",\n            \"cars_connected\": \"இணைக்கப்பட்ட கார்கள்\",\n            \"version\": \"பதிப்பு\"\n        }\n    },\n    \"services\": {\n        \"refresh_access_token\": {\n            \"name\": \"அணுகல் டோக்கனைப் புதுப்பிக்கவும்\",\n            \"description\": \"API அணுகல் டோக்கனைப் புதுப்பிக்கவும்\"\n        },\n        \"auxheat_configure\": {\n            \"name\": \"துணை வெப்பமாக்கல் உள்ளமைவு\",\n            \"description\": \"துணை வெப்பத்தை உள்ளமைப்பதற்கான கட்டளை. மூன்று பகல் நேரங்களை வரையறுத்து ஒரு செயலில் நேரத்தைத் தேர்ந்தெடுக்க முடியும்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"time_selection\": {\n                    \"name\": \"நேர தேர்வு\",\n                    \"description\": \"செயல்படுத்தப்பட்ட துணை வெப்பமாக்கல் முன்னமைக்கப்பட்ட நேரம் (0=தேர்வு_இல்லை, 1=நேரம்_1, 2=நேரம்_2, 3=நேரம்_3)\"\n                },\n                \"time_1\": {\n                    \"name\": \"time_1\",\n                    \"description\": \"நள்ளிரவுக்குப் பிறகு நிமிடங்களில் பகல் நேரம். எ.கா. காலை 8 மணிக்கு செல்லுபடியாகும் மதிப்பு 480 ஆக இருக்கும். மதிப்பு வரம்பு 0 முதல் 1439 வரை.\"\n                },\n                \"time_2\": {\n                    \"name\": \"time_2\",\n                    \"description\": \"நள்ளிரவுக்குப் பிறகு நிமிடங்களில் பகல் நேரம். எ.கா. காலை 8 மணிக்கு செல்லுபடியாகும் மதிப்பு 480 ஆக இருக்கும். மதிப்பு வரம்பு 0 முதல் 1439 வரை.\"\n                },\n                \"time_3\": {\n                    \"name\": \"time_3\",\n                    \"description\": \"நள்ளிரவுக்குப் பிறகு நிமிடங்களில் பகல் நேரம். எ.கா. காலை 8 மணிக்கு செல்லுபடியாகும் மதிப்பு 480 ஆக இருக்கும். மதிப்பு வரம்பு 0 முதல் 1439 வரை.\"\n                }\n            }\n        },\n        \"auxheat_start\": {\n            \"name\": \"துணை வெப்பமாக்கல் தொடக்கம்\",\n            \"description\": \"ஒரு VIN ஆல் வரையறுக்கப்பட்ட காரின் துணை வெப்பத்தைத் தொடங்குங்கள்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                }\n            }\n        },\n        \"auxheat_stop\": {\n            \"name\": \"துணை வெப்பமாக்கல் நிறுத்தம்\",\n            \"description\": \"ஒரு வின் ஆல் வரையறுக்கப்பட்ட காரின் துணை வெப்பத்தை நிறுத்துங்கள்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                }\n            }\n        },\n        \"battery_max_soc_configure\": {\n            \"name\": \"பேட்டரி அதிகபட்ச soc உள்ளமைவு\",\n            \"description\": \"ஒரு VIN ஆல் வரையறுக்கப்பட்ட காரின் HV பேட்டரியின் சார்ஜ் நிலைக்கான அதிகபட்ச மதிப்பை உள்ளமைக்கவும்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"max_soc\": {\n                    \"name\": \"அதிகபட்ச soc\",\n                    \"description\": \"HV பேட்டரியின் சார்ஜ் நிலைக்கான அதிகபட்ச மதிப்பு (மதிப்பு 50 (2025 CLA போன்ற சில புதிய கார்கள் 30 ஐ ஆதரிக்கின்றன) முதல் 100 வரை இருக்க வேண்டும் மற்றும் பத்தால் வகுபடக்கூடியதாக இருக்க வேண்டும்)\"\n                },\n                \"charge_program\": {\n                    \"name\": \"சார்ஜிங் நிரல்\",\n                    \"description\": \"(விரும்பினால், இயல்புநிலை=0) மாற்ற வேண்டிய சார்ஜ் நிரல் (0=இயல்புநிலை, 2=வீடு, 3=வேலை) (2025 CLA க்கு பயன்படுத்தப்படாது)\"\n                }\n            }\n        },\n        \"charge_program_configure\": {\n            \"name\": \"சார்ஜ் நிரல் உள்ளமைவு\",\n            \"description\": \"சார்ஜ் நிரலைத் தேர்ந்தெடுக்க கட்டளை.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"charge_program\": {\n                    \"name\": \"சார்ஜிங் நிரல்\",\n                    \"description\": \"செயல்படுத்தப்பட்ட சார்ஜிங் நிரல் (0=இயல்புநிலை, 2=வீடு, 3=வேலை)\"\n                },\n                \"max_soc\": {\n                    \"name\": \"அதிகபட்ச soc\",\n                    \"description\": \"எச்வி பேட்டரியின் சார்ஜ் நிலைக்கான அதிகபட்ச மதிப்பு (50 முதல் 100 வரை மதிப்பு இருக்க வேண்டும் மற்றும் பத்தால் வகுபடக்கூடியதாக இருக்க வேண்டும்)\"\n                }\n            }\n        },\n        \"doors_unlock\": {\n            \"name\": \"கதவுகள் திறப்பு\",\n            \"description\": \"ஒரு VIN ஆல் வரையறுக்கப்பட்ட காரைத் திறக்கவும். PIN அமைப்பு தேவை. ஒருங்கிணைப்பின் விருப்பங்கள் உரையாடலைக் காண்க.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"pin\": {\n                    \"name\": \"பின்\",\n                    \"description\": \"பாதுகாப்பு பின், அமைப்புகளில் சேமிக்கப்படாவிட்டால் தேவை.\"\n                }\n            }\n        },\n        \"doors_lock\": {\n            \"name\": \"கதவுகள் பூட்டு\",\n            \"description\": \"ஒரு வின் ஆல் வரையறுக்கப்பட்ட காரைப் பூட்டவும்\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                }\n            }\n        },\n        \"download_images\": {\n            \"name\": \"படங்களைப் பதிவிறக்கவும்\",\n            \"description\": \"ஒரு வின் ஆல் வரையறுக்கப்பட்ட காருக்கான பயன்பாட்டு படங்களைக் கூறுகளின் வள கோப்புறையில் பதிவிறக்குகிறது.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                }\n            }\n        },\n        \"engine_start\": {\n            \"name\": \"எஞ்சின் தொடக்கம்\",\n            \"description\": \"ஒரு VIN ஆல் வரையறுக்கப்பட்ட காரின் இயந்திரத்தைத் தொடங்குங்கள். PIN அமைப்பு தேவை. ஒருங்கிணைப்பின் விருப்பங்கள் உரையாடலைக் காண்க.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"pin\": {\n                    \"name\": \"பின்\",\n                    \"description\": \"பாதுகாப்பு பின், அமைப்புகளில் சேமிக்கப்படாவிட்டால் தேவை.\"\n                }\n            }\n        },\n        \"engine_stop\": {\n            \"name\": \"எஞ்சின் நிறுத்தம்\",\n            \"description\": \"ஒரு VIN ஆல் வரையறுக்கப்பட்ட காரின் இயந்திரத்தை நிறுத்துங்கள். PIN அமைப்பு தேவை. ஒருங்கிணைப்பின் விருப்பங்கள் உரையாடலைக் காண்க.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                }\n            }\n        },\n        \"hv_battery_start_conditioning\": {\n            \"name\": \"HV பேட்டரி கண்டிஷனிங் தொடக்கம்\",\n            \"description\": \"ஒரு VIN ஆல் வரையறுக்கப்பட்ட காரின் HV பேட்டரி கண்டிஷனிங்கைத் தொடங்குங்கள்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                }\n            }\n        },\n        \"hv_battery_stop_conditioning\": {\n            \"name\": \"HV பேட்டரி கண்டிஷனிங் நிறுத்தம்\",\n            \"description\": \"ஒரு VIN ஆல் வரையறுக்கப்பட்ட காரின் HV பேட்டரி கண்டிஷனிங்கை நிறுத்துங்கள்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                }\n            }\n        },\n        \"preconditioning_configure_seats\": {\n            \"name\": \"முன்நிபந்தனை இருக்கைகள் உள்ளமைவு\",\n            \"description\": \"ஒரு VIN ஆல் வரையறுக்கப்பட்ட காருக்கு முன்நிபந்தனை இருக்கை உள்ளமைவு கட்டளையை அனுப்பவும்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"front_left\": {\n                    \"name\": \"முன் இடது\",\n                    \"description\": \"முன் இடது இருக்கை முன்நிபந்தனை செய்யப்பட வேண்டும் என்றால் செயல்படுத்தவும்.\"\n                },\n                \"front_right\": {\n                    \"name\": \"முன் வலது\",\n                    \"description\": \"முன் வலது இருக்கை முன்நிபந்தனை செய்யப்பட வேண்டும் என்றால் செயல்படுத்தவும்.\"\n                },\n                \"rear_left\": {\n                    \"name\": \"பின்புற இடது\",\n                    \"description\": \"பின்புற இடது இருக்கை முன்நிபந்தனை செய்யப்பட வேண்டும் என்றால் செயல்படுத்தவும்.\"\n                },\n                \"rear_right\": {\n                    \"name\": \"பின்புற வலது\",\n                    \"description\": \"பின்புற வலது இருக்கை முன்நிபந்தனை செய்யப்பட வேண்டும் என்றால் செயல்படுத்தவும்.\"\n                }\n            }\n        },\n        \"preheat_start\": {\n            \"name\": \"முன்நிபந்தனை தொடக்கம்\",\n            \"description\": \"ஒரு வின் ஆல் வரையறுக்கப்பட்ட காரின் முன்நிபந்தனையைத் தொடங்குங்கள்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"type\": {\n                    \"name\": \"வகை\",\n                    \"description\": \"தொடக்க செயல்முறையைத் தொடங்கப் பயன்படும் முறை. 0=இப்போது (இயல்புநிலை), 1=உடனடி - உங்கள் கார் 'இப்போது' ஆதரிக்காவிட்டால் 'உடனடி' பயன்படுத்தவும்.\"\n                }\n            }\n        },\n        \"preheat_start_departure_time\": {\n            \"name\": \"புறப்படும் நேரத்துடன் முன்நிபந்தனை தொடக்கம்\",\n            \"description\": \"ஒரு வின் மற்றும் கொடுக்கப்பட்ட புறப்படும் நேரத்தால் வரையறுக்கப்பட்ட காரின் முன்நிபந்தனையைத் தொடங்குங்கள்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"time\": {\n                    \"name\": \"நேரம்\",\n                    \"description\": \"நள்ளிரவுக்குப் பிறகு நிமிடங்களில் புறப்படும் நேரம். எ.கா. காலை 8 மணிக்கு செல்லுபடியாகும் மதிப்பு 480 ஆக இருக்கும். மதிப்பு வரம்பு 0 முதல் 1439 வரை.\"\n                }\n            }\n        },\n        \"preheat_stop\": {\n            \"name\": \"முன்நிபந்தனை நிறுத்தம்\",\n            \"description\": \"ஒரு வின் ஆல் வரையறுக்கப்பட்ட காரின் முன்நிபந்தனையை நிறுத்துங்கள்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                }\n            }\n        },\n        \"preheat_stop_departure_time\": {\n            \"name\": \"முன்நிபந்தனை நிறுத்த முறை புறப்படும் நேரம்\",\n            \"description\": \"ஒரு வின் ஆல் வரையறுக்கப்பட்ட காரின் கட்டமைக்கப்பட்ட புறப்படும் நேர முன்நிபந்தனையை நிறுத்துங்கள்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                }\n            }\n        },\n        \"preconditioning_configure\": {\n            \"name\": \"முன்நிபந்தனை புறப்படுதலை உள்ளமைக்கவும்\",\n            \"description\": \"முன்நிபந்தனை புறப்படும் நேர முறையை உள்ளமைக்கவும். திட்டமிடப்பட்ட புறப்படுதல் முன்நிபந்தனையை ரத்து செய்ய முறை 0 (முடக்கப்பட்டது) பயன்படுத்தவும்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"departure_time_mode\": {\n                    \"name\": \"புறப்படும் நேர முறை\",\n                    \"description\": \"0=முடக்கப்பட்டது, 1=ஒற்றை புறப்படுதல், 2=வாராந்திர புறப்படுதல்\"\n                },\n                \"departure_time\": {\n                    \"name\": \"புறப்படும் நேரம்\",\n                    \"description\": \"நள்ளிரவுக்குப் பிறகு நிமிடங்களில் புறப்படும் நேரம் (0-1439). முறை > 0 ஆக இருக்கும்போது மட்டும் பயன்படுத்தப்படும்.\"\n                }\n            }\n        },\n        \"sigpos_start\": {\n            \"name\": \"சமிக்ஞை நிலை தொடக்கம்\",\n            \"description\": \"ஒரு வின் ஆல் வரையறுக்கப்பட்ட காரின் ஒளி சமிக்ஞையைத் தொடங்குங்கள்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                }\n            }\n        },\n        \"sunroof_open\": {\n            \"name\": \"சன்ரூஃப் திறப்பு\",\n            \"description\": \"ஒரு VIN ஆல் வரையறுக்கப்பட்ட காரின் சன்ரூஃப்பைத் திறக்கவும். PIN அமைப்பு தேவை. ஒருங்கிணைப்பின் விருப்பங்கள் உரையாடலைக் காண்க.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"pin\": {\n                    \"name\": \"பின்\",\n                    \"description\": \"பாதுகாப்பு பின், அமைப்புகளில் சேமிக்கப்படாவிட்டால் தேவை.\"\n                }\n            }\n        },\n        \"sunroof_tilt\": {\n            \"name\": \"சன்ரூஃப் சாய்வு\",\n            \"description\": \"ஒரு VIN ஆல் வரையறுக்கப்பட்ட காரின் சன்ரூஃப்பை சாய்க்கவும். PIN அமைப்பு தேவை. ஒருங்கிணைப்பின் விருப்பங்கள் உரையாடலைக் காண்க.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"pin\": {\n                    \"name\": \"பின்\",\n                    \"description\": \"பாதுகாப்பு பின், அமைப்புகளில் சேமிக்கப்படாவிட்டால் தேவை.\"\n                }\n            }\n        },\n        \"sunroof_close\": {\n            \"name\": \"சன்ரூஃப் மூடல்\",\n            \"description\": \"ஒரு வின் ஆல் வரையறுக்கப்பட்ட காரின் சன்ரூஃப்பை மூடவும்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                }\n            }\n        },\n        \"temperature_configure\": {\n            \"name\": \"இலக்கு வெப்பநிலை உள்ளமைவு (முன்நிபந்தனை/துணை வெப்பமாக்கல்)\",\n            \"description\": \"ஒரு VIN ஆல் வரையறுக்கப்பட்ட காரில் மண்டலங்களுக்கான இலக்கு முன்நிபந்தனை/துணை வெப்பமாக்கல் வெப்பநிலையை உள்ளமைக்கவும்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"front_left\": {\n                    \"name\": \"முன் இடது\",\n                    \"description\": \"செல்சியசில் முன்_இடது மண்டலத்திற்கான இலக்கு வெப்பநிலை.\"\n                },\n                \"front_right\": {\n                    \"name\": \"முன் வலது\",\n                    \"description\": \"செல்சியசில் முன்_வலது மண்டலத்திற்கான இலக்கு வெப்பநிலை.\"\n                },\n                \"rear_left\": {\n                    \"name\": \"பின்புற இடது\",\n                    \"description\": \"செல்சியசில் பின்புற_இடது மண்டலத்திற்கான இலக்கு வெப்பநிலை. (கிடைத்தால்)\"\n                },\n                \"rear_right\": {\n                    \"name\": \"பின்புற வலது\",\n                    \"description\": \"செல்சியசில் பின்புற_வலது மண்டலத்திற்கான இலக்கு வெப்பநிலை. (கிடைத்தால்)\"\n                }\n            }\n        },\n        \"windows_open\": {\n            \"name\": \"சாளரங்கள் திறப்பு\",\n            \"description\": \"ஒரு VIN ஆல் வரையறுக்கப்பட்ட காரின் சாளரங்களைத் திறக்கவும். PIN அமைப்பு தேவை. ஒருங்கிணைப்பின் விருப்பங்கள் உரையாடலைக் காண்க.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"pin\": {\n                    \"name\": \"பின்\",\n                    \"description\": \"பாதுகாப்பு பின், அமைப்புகளில் சேமிக்கப்படாவிட்டால் தேவை.\"\n                }\n            }\n        },\n        \"windows_close\": {\n            \"name\": \"சாளரங்கள் மூடல்\",\n            \"description\": \"ஒரு VIN ஆல் வரையறுக்கப்பட்ட காரின் சாளரங்களை மூடவும். PIN அமைப்பு தேவை. ஒருங்கிணைப்பின் விருப்பங்கள் உரையாடலைக் காண்க.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                }\n            }\n        },\n        \"windows_move\": {\n            \"name\": \"சாளரங்கள் நகர்வு\",\n            \"description\": \"ஒரு VIN ஆல் வரையறுக்கப்பட்ட காரின் சாளரங்களை புதிய நிலைக்கு நகர்த்தவும். PIN அமைப்பு தேவை. ஒருங்கிணைப்பின் விருப்பங்கள் உரையாடலைக் காண்க.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"pin\": {\n                    \"name\": \"பின்\",\n                    \"description\": \"பாதுகாப்பு பின், அமைப்புகளில் சேமிக்கப்படாவிட்டால் தேவை.\"\n                },\n                \"front_left\": {\n                    \"name\": \"முன் இடது\",\n                    \"description\": \"முன் இடது சாளரத்தின் புதிய நிலை (0=மூடியது, 10=காற்றோட்டம், 100=திறந்தது)\"\n                },\n                \"front_right\": {\n                    \"name\": \"முன் வலது\",\n                    \"description\": \"முன் இடது சாளரத்தின் புதிய நிலை (0=மூடியது, 10=காற்றோட்டம், 100=திறந்தது)\"\n                },\n                \"rear_left\": {\n                    \"name\": \"பின்புற இடது\",\n                    \"description\": \"முன் இடது சாளரத்தின் புதிய நிலை (0=மூடியது, 10=காற்றோட்டம், 100=திறந்தது)\"\n                },\n                \"rear_right\": {\n                    \"name\": \"பின்புற வலது\",\n                    \"description\": \"முன் இடது சாளரத்தின் புதிய நிலை (0=மூடியது, 10=காற்றோட்டம், 100=திறந்தது)\"\n                }\n            }\n        },\n        \"send_route\": {\n            \"name\": \"வழி அனுப்பு\",\n            \"description\": \"காருக்கு ஒரு வழியை அனுப்புகிறது. (ஒற்றை இடம் மட்டும்)\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"title\": {\n                    \"name\": \"தலைப்பு\",\n                    \"description\": \"வழியின் தலைப்பு\"\n                },\n                \"latitude\": {\n                    \"name\": \"அகலாங்கு\",\n                    \"description\": \"இருப்பிடத்தின் அட்சரேகை\"\n                },\n                \"longitude\": {\n                    \"name\": \"நெட்டாங்கு\",\n                    \"description\": \"இருப்பிடத்தின் தீர்க்கரேகை\"\n                },\n                \"city\": {\n                    \"name\": \"நகரம்\",\n                    \"description\": \"இருப்பிடத்தின் நகரப் பெயர்\"\n                },\n                \"postcode\": {\n                    \"name\": \"அஞ்சல் குறியீடு\",\n                    \"description\": \"இருப்பிடத்தின் அஞ்சல் குறியீடு\"\n                },\n                \"street\": {\n                    \"name\": \"தெரு\",\n                    \"description\": \"இருப்பிடத்தின் தெருப் பெயர்\"\n                }\n            }\n        },\n        \"charging_break_clocktimer_configure\": {\n            \"name\": \"சார்ஜிங் இடைவெளி கடிகார நேரமிடல் உள்ளமைவு\",\n            \"description\": \"சார்ஜிங் இடைவெளிகளை உள்ளமைக்கவும் (AC மட்டும்). இது உங்கள் காரில் உள்ள அனைத்து இடங்களுக்கும் முழுமையான உள்ளமைவை மேலெழுதும்.\",\n            \"fields\": {\n                \"vin\": {\n                    \"name\": \"வின்\",\n                    \"description\": \"காரின் வின்/ஃபின்\"\n                },\n                \"status_timer_1\": {\n                    \"name\": \"நிலை (டைமர் 1)\",\n                    \"description\": \"Services.charging_break_clocktimer_configure.fields.status_timer_1.விளக்கம்\"\n                },\n                \"starttime_timer_1\": {\n                    \"name\": \"தொடக்க நேரம் (டைமர் 1)\",\n                    \"description\": \"சார்ஜ் இடைவெளி சாளரத்தின் தொடக்க நேரம் (டைமர் 1)\"\n                },\n                \"stoptime_timer_1\": {\n                    \"name\": \"இறுதி நேரம் (டைமர் 1)\",\n                    \"description\": \"சார்ஜ் இடைவெளி சாளரத்தின் இறுதி நேரம் (டைமர் 1)\"\n                },\n                \"status_timer_2\": {\n                    \"name\": \"நிலை (டைமர் 2)\",\n                    \"description\": \"Services.charging_break_clocktimer_configure.fields.status_timer_2.description\"\n                },\n                \"starttime_timer_2\": {\n                    \"name\": \"தொடக்க நேரம் (டைமர் 2)\",\n                    \"description\": \"சார்ஜ் இடைவெளி சாளரத்தின் தொடக்க நேரம் (டைமர் 2)\"\n                },\n                \"stoptime_timer_2\": {\n                    \"name\": \"இறுதி நேரம் (டைமர் 2)\",\n                    \"description\": \"சார்ஜ் இடைவெளி சாளரத்தின் இறுதி நேரம் (டைமர் 2)\"\n                },\n                \"status_timer_3\": {\n                    \"name\": \"நிலை (டைமர் 3)\",\n                    \"description\": \"services.charging_break_clocktimer_configure.fields.status_timer_3.description\"\n                },\n                \"starttime_timer_3\": {\n                    \"name\": \"தொடக்க நேரம் (டைமர் 3)\",\n                    \"description\": \"சார்ஜ் இடைவெளி சாளரத்தின் தொடக்க நேரம் (டைமர் 3)\"\n                },\n                \"stoptime_timer_3\": {\n                    \"name\": \"இறுதி நேரம் (டைமர் 3)\",\n                    \"description\": \"சார்ஜ் இடைவெளி சாளரத்தின் இறுதி நேரம் (டைமர் 3)\"\n                },\n                \"status_timer_4\": {\n                    \"name\": \"நிலை (டைமர் 4)\",\n                    \"description\": \"services.charging_break_clocktimer_configure.fields.status_timer_4.description\"\n                },\n                \"starttime_timer_4\": {\n                    \"name\": \"தொடக்க நேரம் (டைமர் 4)\",\n                    \"description\": \"சார்ஜ் இடைவெளி சாளரத்தின் தொடக்க நேரம் (டைமர் 4)\"\n                },\n                \"stoptime_timer_4\": {\n                    \"name\": \"இறுதி நேரம் (டைமர் 4)\",\n                    \"description\": \"சார்ஜ் இடைவெளி சாளரத்தின் இறுதி நேரம் (டைமர் 4)\"\n                }\n            }\n        }\n    },\n    \"entity\": {\n        \"binary_sensor\": {\n            \"chargingactive\": {\n                \"name\": \"சார்ஜிங் செயலில்\"\n            }\n        },\n        \"sensor\": {\n            \"chargingpowerecolimit\": {\n                \"name\": \"சார்ஜிங் சக்தி வரம்பு\"\n            },\n            \"auxheatstatus\": {\n                \"state\": {\n                    \"0\": \"செயலற்றது\",\n                    \"1\": \"இயல்பான வெப்பமாக்கல்\",\n                    \"2\": \"இயல்பான காற்றோட்டம்\",\n                    \"3\": \"கையேடு வெப்பமாக்கல்\",\n                    \"4\": \"பிந்தைய வெப்பமாக்கல்\",\n                    \"5\": \"பிந்தைய காற்றோட்டம்\",\n                    \"6\": \"தானியங்கி வெப்பமாக்கல்\"\n                }\n            },\n            \"chargeflapacstatus\": {\n                \"state\": {\n                    \"0\": \"திறந்தது\",\n                    \"1\": \"மூடியது\",\n                    \"2\": \"மடல் அழுத்தப்பட்டது\",\n                    \"3\": \"தெரியவில்லை\"\n                }\n            },\n            \"chargeflapdcstatus\": {\n                \"state\": {\n                    \"0\": \"திறந்தது\",\n                    \"1\": \"மூடியது\",\n                    \"2\": \"மடல் அழுத்தப்பட்டது\",\n                    \"3\": \"தெரியவில்லை\"\n                }\n            },\n            \"chargingstatus\": {\n                \"state\": {\n                    \"0\": \"சார்ஜிங்\",\n                    \"1\": \"சார்ஜிங் முடிகிறது\",\n                    \"2\": \"சார்ஜ் இடைவெளி\",\n                    \"3\": \"துண்டிக்கப்பட்டது\",\n                    \"4\": \"தோல்வி\",\n                    \"5\": \"மெதுவான\",\n                    \"6\": \"வேகமான\",\n                    \"7\": \"டிஸ்சார்ஜிங்\",\n                    \"8\": \"சார்ஜ் ஆகவில்லை\",\n                    \"9\": \"பயண இலக்கை அடைந்த பின் மெதுவான சார்ஜிங்\",\n                    \"10\": \"பயண இலக்கை அடைந்த பின் சார்ஜிங்\",\n                    \"11\": \"பயண இலக்கை அடைந்த பின் வேகமான சார்ஜிங்\",\n                    \"12\": \"இணைக்கப்பட்டது\",\n                    \"13\": \"AC சார்ஜிங்\",\n                    \"14\": \"DC சார்ஜிங்\",\n                    \"15\": \"பேட்டரி அளவுத்திருத்தம் செயலில்\",\n                    \"16\": \"தெரியவில்லை\"\n                }\n            },\n            \"departuretimemode\": {\n                \"state\": {\n                    \"0\": \"முடக்கப்பட்டது\",\n                    \"1\": \"நாள்தோறும்\",\n                    \"2\": \"வாராந்திர\"\n                }\n            },\n            \"ignitionstate\": {\n                \"state\": {\n                    \"0\": \"பூட்டப்பட்டது\",\n                    \"1\": \"அணைக்கப்பட்டது\",\n                    \"2\": \"துணை\",\n                    \"4\": \"இயக்கத்தில்\",\n                    \"5\": \"தொடக்கம்\"\n                }\n            },\n            \"interiorprotectionsensorstatus\": {\n                \"state\": {\n                    \"0\": \"செயலில் இல்லை\",\n                    \"1\": \"செயலில் இல்லை\",\n                    \"2\": \"செயலில்\"\n                }\n            },\n            \"lock\": {\n                \"state\": {\n                    \"0\": \"திறக்கப்பட்டது\",\n                    \"1\": \"உள்பூட்டப்பட்டது\",\n                    \"2\": \"பூட்டப்பட்டது\",\n                    \"3\": \"ஓரளவு திறக்கப்பட்டது\",\n                    \"4\": \"தெரியவில்லை\"\n                },\n                \"state_attributes\": {\n                    \"decklidstatus\": {\n                        \"name\": \"டெக் மூடி\",\n                        \"state\": {\n                            \"false\": \"மூடியது\",\n                            \"true\": \"திறந்தது\"\n                        }\n                    },\n                    \"doorstatusfrontleft\": {\n                        \"name\": \"கதவு முன் இடது\",\n                        \"state\": {\n                            \"false\": \"மூடியது\",\n                            \"true\": \"திறந்தது\"\n                        }\n                    },\n                    \"doorstatusfrontright\": {\n                        \"name\": \"கதவு முன் வலது\",\n                        \"state\": {\n                            \"false\": \"மூடியது\",\n                            \"true\": \"திறந்தது\"\n                        }\n                    },\n                    \"doorstatusrearleft\": {\n                        \"name\": \"கதவு பின்புற இடது\",\n                        \"state\": {\n                            \"false\": \"மூடியது\",\n                            \"true\": \"திறந்தது\"\n                        }\n                    },\n                    \"doorstatusrearright\": {\n                        \"name\": \"கதவு பின்புற வலது\",\n                        \"state\": {\n                            \"false\": \"மூடியது\",\n                            \"true\": \"திறந்தது\"\n                        }\n                    },\n                    \"doorlockstatusfrontleft\": {\n                        \"name\": \"கதவு பூட்டு முன் இடது\",\n                        \"state\": {\n                            \"false\": \"பூட்டப்பட்டது\",\n                            \"true\": \"திறக்கப்பட்டது\"\n                        }\n                    },\n                    \"doorlockstatusfrontright\": {\n                        \"name\": \"கதவு பூட்டு முன் வலது\",\n                        \"state\": {\n                            \"false\": \"பூட்டப்பட்டது\",\n                            \"true\": \"திறக்கப்பட்டது\"\n                        }\n                    },\n                    \"doorlockstatusrearleft\": {\n                        \"name\": \"கதவு பூட்டு பின்புற இடது\",\n                        \"state\": {\n                            \"false\": \"பூட்டப்பட்டது\",\n                            \"true\": \"திறக்கப்பட்டது\"\n                        }\n                    },\n                    \"doorlockstatusrearright\": {\n                        \"name\": \"கதவு பூட்டு பின்புற வலது\",\n                        \"state\": {\n                            \"false\": \"பூட்டப்பட்டது\",\n                            \"true\": \"திறக்கப்பட்டது\"\n                        }\n                    },\n                    \"doorlockstatusgas\": {\n                        \"name\": \"எரிவாயு பூட்டு\",\n                        \"state\": {\n                            \"false\": \"பூட்டப்பட்டது\",\n                            \"true\": \"திறக்கப்பட்டது\"\n                        }\n                    },\n                    \"enginehoodstatus\": {\n                        \"name\": \"எஞ்சின் ஹுட்\",\n                        \"state\": {\n                            \"false\": \"மூடியது\",\n                            \"true\": \"திறந்தது\"\n                        }\n                    },\n                    \"doorstatusoverall\": {\n                        \"name\": \"ஒட்டுமொத்த கதவு நிலை\",\n                        \"state\": {\n                            \"0\": \"திறந்தது\",\n                            \"1\": \"மூடியது\",\n                            \"2\": \"இல்லாதது\",\n                            \"3\": \"தெரியவில்லை\"\n                        }\n                    },\n                    \"sunroofstatus\": {\n                        \"name\": \"சன்ரூஃப் நிலை\",\n                        \"state\": {\n                            \"0\": \"மூடியது\",\n                            \"1\": \"திறந்தது\",\n                            \"2\": \"உயர்த்தி திறப்பு\",\n                            \"3\": \"இயங்குகிறது\",\n                            \"4\": \"அதிர்வு எதிர்ப்பு நிலை\",\n                            \"5\": \"நழுவும் இடைநிலை\",\n                            \"6\": \"உயர்த்தும் இடைநிலை\",\n                            \"7\": \"திறக்கிறது\",\n                            \"8\": \"மூடுகிறது\",\n                            \"9\": \"அதிர்வு எதிர்ப்பு உயர்த்துதல்\",\n                            \"10\": \"இடைநிலை நிலை\",\n                            \"11\": \"உயர்த்தி திறக்கிறது\",\n                            \"12\": \"உயர்த்தி மூடுகிறது\"\n                        }\n                    }\n                }\n            },\n            \"sunroofstatus\": {\n                \"state\": {\n                    \"0\": \"மூடியது\",\n                    \"1\": \"திறந்தது\",\n                    \"2\": \"உயர்த்தி திறப்பு\",\n                    \"3\": \"இயங்குகிறது\",\n                    \"4\": \"அதிர்வு எதிர்ப்பு\",\n                    \"5\": \"நழுவும் இடைநிலை\",\n                    \"6\": \"உயர்த்தும் இடைநிலை\",\n                    \"7\": \"திறக்கிறது\",\n                    \"8\": \"மூடுகிறது\",\n                    \"9\": \"அதிர்வு எதிர்ப்பு உயர்த்துதல்\",\n                    \"10\": \"இடைநிலை நிலை\",\n                    \"11\": \"உயர்த்தி திறக்கிறது\",\n                    \"12\": \"உயர்த்தி மூடுகிறது\"\n                }\n            },\n            \"starterbatterystate\": {\n                \"state\": {\n                    \"0\": \"பச்சை\",\n                    \"1\": \"மஞ்சள்\",\n                    \"2\": \"சிவப்பு\"\n                }\n            },\n            \"tirewarningsrdk\": {\n                \"state\": {\n                    \"0\": \"எச்சரிக்கை இல்லை\",\n                    \"1\": \"மென்மையான எச்சரிக்கை\",\n                    \"2\": \"குறைந்த அழுத்தம்\",\n                    \"3\": \"காற்றிழப்பு\"\n                }\n            },\n            \"selectedchargeprogram\": {\n                \"state\": {\n                    \"0\": \"நிலையான\",\n                    \"2\": \"வீடு\",\n                    \"3\": \"வேலை\",\n                    \"4\": \"ஆதரிக்கப்படவில்லை\"\n                }\n            }\n        },\n        \"switch\": {\n            \"auxheat\": {\n                \"name\": \"துணை வெப்பமாக்கல்\"\n            },\n            \"precond\": {\n                \"name\": \"முன் நுழைவு காலநிலை கட்டுப்பாடு\"\n            }\n        },\n        \"button\": {\n            \"btn_preheat_start_now\": {\n                \"name\": \"முன்வெப்பமாக்கல் தொடக்கம்\"\n            },\n            \"btn_preheat_stop_now\": {\n                \"name\": \"முன்வெப்பமாக்கல் நிறுத்தம்\"\n            },\n            \"btn_sigpos_start_now\": {\n                \"name\": \"விளக்குகள் ஒளிர்தல்\"\n            }\n        }\n    },\n    \"selector\": {\n        \"charge_program\": {\n            \"options\": {\n                \"0\": \"இயல்புநிலை\",\n                \"2\": \"வீடு\",\n                \"3\": \"வேலை\"\n            }\n        },\n        \"charging_break_clocktimer_configure_action\": {\n            \"options\": {\n                \"notset\": \"அமைக்கப்படவில்லை\",\n                \"active\": \"செயலில்\",\n                \"inactive\": \"செயலற்றது\"\n            }\n        },\n        \"temperature_configure\": {\n            \"options\": {\n                \"0\": \"குறைந்த\",\n                \"30\": \"உயர்ந்த\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "custom_components/mbapi2020/webapi.py",
    "content": "\"\"\"Define an object to interact with the REST API.\"\"\"\n\nfrom __future__ import annotations\n\nimport json\nimport logging\nimport ssl\nimport traceback\nimport uuid\n\nfrom aiohttp import ClientSession\nfrom aiohttp.client_exceptions import ClientError\nimport google.protobuf.message\n\nfrom homeassistant.core import HomeAssistant\nfrom homeassistant.helpers.aiohttp_client import async_get_clientsession\n\nfrom .const import (\n    REGION_CHINA,\n    RIS_APPLICATION_VERSION,\n    RIS_OS_VERSION,\n    RIS_SDK_VERSION,\n    SYSTEM_PROXY,\n    VERIFY_SSL,\n    WEBSOCKET_USER_AGENT,\n    WEBSOCKET_USER_AGENT_CN,\n    X_APPLICATIONNAME,\n)\nfrom .helper import UrlHelper as helper\nfrom .oauth import Oauth\nfrom .proto import vehicle_events_pb2\n\nLOGGER = logging.getLogger(__name__)\n\n\nclass WebApi:\n    \"\"\"Define the API object.\"\"\"\n\n    def __init__(\n        self,\n        hass: HomeAssistant,\n        oauth: Oauth,\n        session: ClientSession,\n        region: str,\n    ) -> None:\n        \"\"\"Initialize.\"\"\"\n        self._session: ClientSession = session\n        self._oauth: Oauth = oauth\n        self._region = region\n        self.hass = hass\n        self.session_id = str(uuid.uuid4()).upper()\n\n    async def _request(\n        self,\n        method: str,\n        endpoint: str,\n        rcp_headers: bool = False,\n        ignore_errors: bool = False,\n        return_as_json: bool = True,\n        **kwargs,\n    ):\n        \"\"\"Make a request against the API.\"\"\"\n\n        url = f\"{helper.Rest_url(self._region)}{endpoint}\"\n        kwargs.setdefault(\"headers\", {})\n        kwargs.setdefault(\"proxy\", SYSTEM_PROXY)\n\n        token = await self._oauth.async_get_cached_token()\n\n        if not rcp_headers:\n            kwargs[\"headers\"] = {\n                \"Authorization\": f\"Bearer {token['access_token']}\",\n                \"X-SessionId\": self.session_id,\n                \"X-TrackingId\": str(uuid.uuid4()).upper(),\n                \"X-ApplicationName\": X_APPLICATIONNAME,\n                \"ris-application-version\": RIS_APPLICATION_VERSION,\n                \"ris-os-name\": \"ios\",\n                \"ris-os-version\": RIS_OS_VERSION,\n                \"ris-sdk-version\": RIS_SDK_VERSION,\n                \"X-Locale\": \"de-DE\",\n                \"User-Agent\": WEBSOCKET_USER_AGENT,\n                \"Content-Type\": \"application/json; charset=UTF-8\",\n            }\n        else:\n            kwargs[\"headers\"] = {\n                \"Authorization\": f\"Bearer {token['access_token']}\",\n                \"User-Agent\": WEBSOCKET_USER_AGENT,\n                \"Accept-Language\": \"de-DE;q=1.0, en-DE;q=0.9\",\n            }\n\n        if not self._session or self._session.closed:\n            self._session = async_get_clientsession(self.hass, VERIFY_SSL)\n\n        try:\n            if \"url\" in kwargs:\n                async with self._session.request(method, **kwargs) as resp:\n                    # resp.raise_for_status()\n                    if return_as_json:\n                        return await resp.json(content_type=None)\n\n                    return await resp.read()\n            else:\n                async with self._session.request(method, url, **kwargs) as resp:\n                    if 400 <= resp.status < 500:\n                        try:\n                            error = await resp.text()\n                            error_json = json.loads(error)\n                            if error_json:\n                                error_message = f\"Error requesting: {url} - {resp.status} -  {error_json['code']} - {error_json['errors']}\"\n                            else:\n                                error_message = f\"Error requesting: {url} - {resp.status} - 0 - {error}\"\n                        except (json.JSONDecodeError, KeyError):\n                            error_message = f\"Error requesting: {url} - {resp.status} - 0 - {error}\"\n\n                        LOGGER.error(error_message) if not ignore_errors else LOGGER.info(error_message)\n                    else:\n                        resp.raise_for_status()\n\n                    if return_as_json:\n                        return await resp.json(content_type=None)\n\n                    return await resp.read()\n\n        except ClientError as err:\n            LOGGER.debug(traceback.format_exc())\n            if not ignore_errors:\n                raise ClientError from err\n\n            return []\n        except Exception:\n            LOGGER.debug(traceback.format_exc())\n\n    async def get_config(self):\n        \"\"\"Get standard user information.\"\"\"\n        return await self._request(\"get\", \"/v1/config\")\n\n    async def get_user(self):\n        \"\"\"Get standard user information.\"\"\"\n        return await self._request(\"get\", \"/v1/user\")\n\n    async def get_user_info(self):\n        \"\"\"Get all devices associated with an API key.\"\"\"\n        return await self._request(\"get\", \"/v2/vehicles\")\n\n    async def get_car_capabilities(self, vin: str):\n        \"\"\"Get all car capabilities associated with an vin.\"\"\"\n        return await self._request(\"get\", f\"/v1/vehicle/{vin}/capabilities\")\n\n    async def get_car_capabilities_commands(self, vin: str):\n        \"\"\"Get all car capabilities associated with an vin.\"\"\"\n        return await self._request(\"get\", f\"/v1/vehicle/{vin}/capabilities/commands\")\n\n    async def get_car_rcp_supported_settings(self, vin: str):\n        \"\"\"Get all supported car rcp options associated.\"\"\"\n        url = f\"{helper.RCP_url(self._region)}/api/v1/vehicles/{vin}/settings\"\n\n        LOGGER.debug(\"get_car_rcp_supported_settings: %s\", url)\n        return await self._request(\"get\", \"\", url=url, rcp_headers=True)\n\n    async def get_car_rcp_settings(self, vin: str, setting: str):\n        \"\"\"Get all rcp setting for a car.\"\"\"\n        url = f\"{helper.RCP_url(self._region)}/api/v1/vehicles/{vin}/settings/{setting}\"\n\n        LOGGER.debug(\"get_car_rcp_settings: %s\", url)\n        return await self._request(\"get\", \"\", url=url, rcp_headers=True)\n\n    async def send_route_to_car(\n        self,\n        vin: str,\n        title: str,\n        latitude: float,\n        longitude: float,\n        city: str,\n        postcode: str,\n        street: str,\n    ):\n        \"\"\"Send route to car associated by vin.\"\"\"\n        data = {\n            \"routeTitle\": title,\n            \"routeType\": \"singlePOI\",\n            \"waypoints\": [\n                {\n                    \"city\": city,\n                    \"latitude\": latitude,\n                    \"longitude\": longitude,\n                    \"postalCode\": postcode,\n                    \"street\": street,\n                    \"title\": title,\n                }\n            ],\n        }\n\n        return await self._request(\"post\", f\"/v1/vehicle/{vin}/route\", data=json.dumps(data))\n\n    async def get_car_geofencing_violations(self, vin: str):\n        \"\"\"Get all geofencing violations for a car.\"\"\"\n        url = f\"/v1/geofencing/vehicles/{vin}/fences/violations\"\n        return await self._request(\"get\", url, rcp_headers=False, ignore_errors=True)\n\n    async def get_fleet_info(self, company: str, fleet: str):\n        \"\"\"Get fleet information.\"\"\"\n        url = f\"/v1/company/{company}/fleet/{fleet}?size=100&filter=\"\n        return await self._request(\"get\", url, rcp_headers=False, ignore_errors=True)\n\n    async def is_car_rcp_supported(self, vin: str, **kwargs):\n        \"\"\"Return if is car rcp supported.\"\"\"\n        token = await self._oauth.async_get_cached_token()\n        headers = {\n            \"Authorization\": f\"Bearer {token['access_token']}\",\n            \"User-Agent\": WEBSOCKET_USER_AGENT if self._region != REGION_CHINA else WEBSOCKET_USER_AGENT_CN,\n        }\n\n        kwargs.setdefault(\"headers\", headers)\n        kwargs.setdefault(\"proxy\", SYSTEM_PROXY)\n\n        url = f\"{helper.PSAG_url(self._region)}/api/app/v2/vehicles/{vin}/profileInformation\"\n\n        if not self._session or self._session.closed:\n            self._session = async_get_clientsession(self.hass, VERIFY_SSL)\n\n        async with self._session.request(\"get\", url, **kwargs) as resp:\n            resp_status = resp.status\n            await resp.text()\n            return bool(resp_status == 200)\n\n    async def download_images(self, vin: str):\n        \"\"\"Download the car images and store it to the components ressource folder.\"\"\"\n        url = f\"/v1/vehicle/{vin}/topviewimage\"\n        return await self._request(\"get\", url, rcp_headers=False, ignore_errors=False, return_as_json=False)\n\n    async def get_car_p2b_data_via_rest(self, vin: str):\n        \"\"\"Get vehicleattributes via rest.\"\"\"\n        url = f\"{helper.Widget_url(self._region)}/v1/vehicle/{vin}/vehicleattributes\"\n\n        try:\n            data = await self._request(\"get\", \"\", url=url, return_as_json=False)\n            message = vehicle_events_pb2.VEPUpdate()\n            message.ParseFromString(data)\n        except TypeError as err:\n            LOGGER.error(\"could not decode data (%s) from websocket: %s\", data, err)\n        except google.protobuf.message.DecodeError as err:\n            LOGGER.error(\"could not decode data (%s) from websocket: %s\", data, err)\n        return message if message else None\n"
  },
  {
    "path": "custom_components/mbapi2020/websocket.py",
    "content": "\"\"\"Define an object to interact with the Websocket API.\"\"\"\n\nfrom __future__ import annotations\n\nimport asyncio\nfrom collections.abc import Awaitable, Callable\nimport contextlib  # NEW\nfrom datetime import datetime, timezone\nimport logging\nimport time\nimport uuid\n\nfrom aiohttp import ClientSession, WSMsgType, WSServerHandshakeError, client_exceptions\n\nfrom homeassistant.const import EVENT_HOMEASSISTANT_STOP\nfrom homeassistant.core import HomeAssistant\nfrom homeassistant.exceptions import HomeAssistantError\nfrom homeassistant.helpers.aiohttp_client import async_get_clientsession\n\nfrom .const import (\n    REGION_APAC,\n    REGION_CHINA,\n    REGION_EUROPE,\n    REGION_NORAM,\n    RIS_APPLICATION_VERSION,\n    RIS_APPLICATION_VERSION_CN,\n    RIS_APPLICATION_VERSION_NA,\n    RIS_APPLICATION_VERSION_PA,\n    RIS_OS_NAME,\n    RIS_OS_VERSION,\n    RIS_SDK_VERSION,\n    RIS_SDK_VERSION_CN,\n    SYSTEM_PROXY,\n    VERIFY_SSL,\n    WEBSOCKET_USER_AGENT,\n    WEBSOCKET_USER_AGENT_CN,\n    WEBSOCKET_USER_AGENT_PA,\n    WEBSOCKET_USER_AGENT_US,\n)\nfrom .helper import LogHelper as loghelper, UrlHelper as helper, Watchdog\nfrom .oauth import Oauth\nfrom .proto import vehicle_events_pb2\n\nDEFAULT_WATCHDOG_TIMEOUT = 30\nDEFAULT_WATCHDOG_TIMEOUT_CARCOMMAND = 180\nINITIAL_WATCHDOG_TIMEOUT = 30\nPING_WATCHDOG_TIMEOUT = 32\nRECONNECT_WATCHDOG_TIMEOUT = 60\nSTATE_CONNECTED = \"connected\"\nSTATE_RECONNECTING = \"reconnecting\"\nINITIATE_RELOGIN_AFTER_429 = True\nMAX_RELOGIN_ATTEMPTS = 3\n\nLOGGER = logging.getLogger(__name__)\n\n\nclass _PrefixAdapter(logging.LoggerAdapter):\n    \"\"\"Logger adapter that prefixes messages with config entry and instance ID.\"\"\"\n\n    def process(self, msg, kwargs):\n        \"\"\"Prepend entry_id and instance_id to log message.\"\"\"\n        return f\"[{self.extra['entry_id']}][inst#{self.extra['instance_id']}] {msg}\", kwargs\n\n\nclass Websocket:\n    \"\"\"Define the websocket.\"\"\"\n\n    _instance_counter: int = 0\n\n    def __init__(\n        self, hass, oauth, region, session_id=str(uuid.uuid4()).upper(), ignition_states: dict[str, bool] | None = None\n    ) -> None:\n        \"\"\"Initialize.\"\"\"\n        Websocket._instance_counter += 1\n        self._instance_id = Websocket._instance_counter\n\n        if ignition_states is None:\n            ignition_states = {}\n        self.oauth: Oauth = oauth\n        self._hass: HomeAssistant = hass\n        self.is_stopping: bool = False\n        self._on_data_received: Callable[..., Awaitable] = None\n        self._connection = None\n        self._region = region\n        self.connection_state = \"unknown\"\n        self.is_connecting = False\n        self.ha_stop_handler = None\n        self._watchdog: Watchdog = Watchdog(\n            self.initiatiate_connection_disconnect_with_reconnect,\n            topic=\"Connection\",\n            timeout_seconds=INITIAL_WATCHDOG_TIMEOUT,\n            log_events=True,\n        )\n        self._pingwatchdog: Watchdog = Watchdog(\n            self.ping, topic=\"Ping\", timeout_seconds=PING_WATCHDOG_TIMEOUT, log_events=False\n        )\n        self._reconnectwatchdog: Watchdog = Watchdog(\n            self._reconnect_attempt, topic=\"Reconnect\", timeout_seconds=RECONNECT_WATCHDOG_TIMEOUT, log_events=True\n        )\n        self.component_reload_watcher: Watchdog = Watchdog(\n            self._blocked_account_reload_check, 30, \"Blocked_account_reload\", False\n        )\n\n        if getattr(self.oauth, \"_config_entry\", None):\n            self._LOGGER = _PrefixAdapter(\n                LOGGER, {\"entry_id\": self.oauth._config_entry.entry_id, \"instance_id\": self._instance_id}\n            )\n        else:\n            self._LOGGER = _PrefixAdapter(LOGGER, {\"entry_id\": \"unknown\", \"instance_id\": self._instance_id})\n\n        self._LOGGER.info(\n            \"Websocket instance created (total instances created: %d, obj_id: %s)\",\n            Websocket._instance_counter,\n            id(self),\n        )\n        self._queue = asyncio.Queue()\n        self._queue_shutdown_sentinel = object()  # Sentinel für graceful shutdown\n        self.session_id = session_id\n        self._ignition_states: dict[str, bool] = ignition_states\n        self.ws_connect_retry_counter_reseted: bool = False\n        self.ws_connect_retry_counter: int = 0\n        self.account_blocked: bool = False\n        self.ws_blocked_connection_error_logged = False\n        self._connection_start_time: float | None = None\n        self._initial_timeout_used: bool = False\n\n        self._queue_task: asyncio.Task = None\n        self._websocket_task: asyncio.Task = None\n        self._relogin_429_attempts: int = 0\n        self._async_stop_call_count: int = 0\n        self._connect_internal_active_count: int = 0\n        self._blocked_since_time: float | None = None\n        self._last_backup_reload_time: float | None = None\n\n    async def _reconnect_attempt(self) -> None:\n        \"\"\"Attempt reconnection without cancelling the reconnect watchdog.\"\"\"\n        self._LOGGER.debug(\"Starting reconnect attempt\")\n        try:\n            await self._async_connect_internal()\n        except Exception as err:\n            self._LOGGER.error(\"Reconnect attempt failed: %s (%s)\", err, type(err).__name__)\n        finally:\n            # Re-trigger reconnect watchdog if not stopping and not connected\n            if not self.is_stopping and self.connection_state != STATE_CONNECTED:\n                self._LOGGER.debug(\"Re-triggering reconnect watchdog after failed attempt\")\n                await self._reconnectwatchdog.trigger()\n\n    async def async_connect(self, on_data=None) -> None:\n        \"\"\"Connect to the socket.\"\"\"\n        # Cancel reconnect watchdog for manual connections\n        self._reconnectwatchdog.cancel(graceful=True)\n        await self._async_connect_internal(on_data)\n\n    async def _async_connect_internal(self, on_data=None) -> None:\n        \"\"\"Internal connect method without cancelling reconnect watchdog.\"\"\"\n        if self.is_connecting:\n            return\n\n        self._connect_internal_active_count += 1\n        self._LOGGER.debug(\n            \"_async_connect_internal ENTER (active_count: %d, queue_task: %s, ws_task: %s)\",\n            self._connect_internal_active_count,\n            self._queue_task.get_name() if self._queue_task and not self._queue_task.done() else \"None/done\",\n            self._websocket_task.get_name()\n            if self._websocket_task and not self._websocket_task.done()\n            else \"None/done\",\n        )\n\n        async def _async_stop_handler(event):\n            \"\"\"Stop when Home Assistant is shutting down.\"\"\"\n            await self.async_stop()\n\n        if on_data:\n            self._on_data_received = on_data\n\n        self.is_connecting = True\n        self.is_stopping = False\n\n        if not self.ha_stop_handler:\n            # NICHT sofort aufrufen – Rückruf behalten, nicht deregistrieren\n            self.ha_stop_handler = self._hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _async_stop_handler)\n\n        session = async_get_clientsession(self._hass, VERIFY_SSL)\n\n        # Tasks erstellen und verwalten\n        self._queue_task = asyncio.create_task(self._start_queue_handler(), name=\"mbapi2020.queue\")\n        self._websocket_task = asyncio.create_task(self._start_websocket_handler(session), name=\"mbapi2020.ws\")\n\n        # Warten, dass Tasks laufen - mit ordnungsgemäßer Exception-Behandlung\n        try:\n            await asyncio.gather(self._queue_task, self._websocket_task, return_exceptions=True)\n        except Exception as e:\n            self._LOGGER.debug(\"async_connect tasks finished with exception: %s\", e)\n        finally:\n            self._connect_internal_active_count -= 1\n            self._LOGGER.debug(\n                \"_async_connect_internal EXIT (remaining active: %d)\", self._connect_internal_active_count\n            )\n            # Sicherstellen, dass Tasks ordnungsgemäß beendet werden\n            await self._cleanup_tasks()\n\n    async def async_stop(self, now: datetime = datetime.now()):\n        \"\"\"Close connection.\"\"\"\n        self._async_stop_call_count += 1\n        self._LOGGER.debug(\n            \"async_stop called (call #%d, is_stopping_already: %s)\", self._async_stop_call_count, self.is_stopping\n        )\n        self.is_stopping = True\n\n        # Watchdogs anhalten (graceful: laufenden expire-Task nicht killen)\n        self._pingwatchdog.cancel(graceful=True)\n        self._reconnectwatchdog.cancel(graceful=True)\n        self._watchdog.cancel(graceful=True)\n\n        # Dann WebSocket-Verbindung ordentlich schließen (gegen Cancel geschützt)\n        if self._connection is not None and not self._connection.closed:\n            try:\n                self._LOGGER.debug(\"Closing WebSocket connection...\")\n                await asyncio.shield(\n                    asyncio.wait_for(\n                        self._connection.close(code=1000, message=b\"Client shutdown\"),\n                        timeout=1.0,\n                    )\n                )\n                self._LOGGER.debug(\"ws.close awaited (handshake done)\")\n            except asyncio.TimeoutError:\n                self._LOGGER.warning(\"WebSocket close() timed out (no server CLOSE). Proceeding with shutdown.\")\n            except asyncio.CancelledError:\n                # Beim Shutdown nicht re-raisen\n                self._LOGGER.error(\"WebSocket close() was cancelled by outer task; ignoring during shutdown.\")\n            except Exception as e:\n                self._LOGGER.debug(\"Error closing WebSocket connection: %s\", e)\n\n        # Zustände zurücksetzen\n        self._watchdog.cancel(graceful=True)\n        self.connection_state = \"closed\"\n        self._connection_start_time = None\n        self._initial_timeout_used = False\n\n        # Queue-Handler zum Beenden signalisieren\n        try:\n            self._queue.put_nowait(self._queue_shutdown_sentinel)\n        except asyncio.QueueFull:\n            self._LOGGER.warning(\"Queue full during shutdown, forcing queue cleanup\")\n            await self._cleanup_queue(\"async_stop:queue_full\")\n\n        # Tasks ordnungsgemäß beenden (shield + kleine Timeouts)\n        await self._await_tasks_then_cleanup()\n\n    async def initiatiate_connection_disconnect_with_reconnect(self):\n        \"\"\"Initiate a connection disconnect.\"\"\"\n\n        if any(self._ignition_states.values()):\n            self._LOGGER.debug(\n                \"initiatiate_connection_disconnect_with_reconnect canceled - Reason: ignitions_state: %s\",\n                [loghelper.Mask_VIN(key) for key, value in self._ignition_states.items() if value],\n            )\n            await self._watchdog.trigger()\n            return\n\n        # Verhindere Reentrancy: weitere Trigger sofort unterbinden, aber laufenden Task nicht killen\n        self.is_stopping = True\n        loop = asyncio.get_running_loop()\n        self._watchdog.cancel(graceful=True)\n        self._reconnectwatchdog.cancel(graceful=True)\n\n        # Graceful shutdown in separatem Task ausführen, um Self-Cancel zu vermeiden\n        loop.create_task(self._graceful_shutdown_and_optionally_reconnect(), name=\"mbapi2020.shutdown\")\n\n    async def _graceful_shutdown_and_optionally_reconnect(self):\n        try:\n            await self.async_stop()\n        finally:\n            # Wenn direkt ein Reconnect gewollt ist, hier starten:\n            await self._reconnectwatchdog.trigger()\n\n    async def ping(self):\n        \"\"\"Send a ping to the MB websocket servers.\"\"\"\n        if self.is_stopping:\n            return\n\n        try:\n            await self._connection.ping()\n            await self._pingwatchdog.trigger()\n        except (client_exceptions.ClientError, ConnectionResetError):\n            await self._pingwatchdog.trigger()\n\n    async def call(self, message, car_command: bool = False):\n        \"\"\"Send a message to the MB websocket servers.\"\"\"\n        if self.is_stopping:\n            return\n\n        try:\n            reconnect_task = None\n\n            if not self._connection or self._connection.closed:\n                reconnect_task = asyncio.create_task(self.async_connect())\n\n            if car_command:\n                self._set_watchdog_timeout(DEFAULT_WATCHDOG_TIMEOUT_CARCOMMAND)\n                await self._watchdog.trigger()\n\n            if reconnect_task:\n                for _ in range(50):\n                    if self._connection and not self._connection.closed:\n                        break\n                    await asyncio.sleep(0.1)\n\n            await self._connection.send_bytes(message)\n\n        except client_exceptions.ClientError as err:\n            raise HomeAssistantError(\n                \"MB-Websocket connection is not active. Can't execute the call. Check the homeassistant.log for more details Error: %s\",\n                err,\n            ) from err\n\n    async def _start_queue_handler(self):\n        \"\"\"Start the queue handler - entry point for the task.\"\"\"\n        await self._queue_handler()\n\n    async def _queue_handler(self):\n        while not self.is_stopping:\n            try:\n                # Timeout für graceful shutdown\n                data = await asyncio.wait_for(self._queue.get(), timeout=1.0)\n\n                # Check for shutdown sentinel\n                if data is self._queue_shutdown_sentinel:\n                    self._LOGGER.debug(\"Queue handler received shutdown signal\")\n                    self._queue.task_done()\n                    break\n\n                try:\n                    message = vehicle_events_pb2.PushMessage()\n                    message.ParseFromString(data)\n                except TypeError as err:\n                    self._LOGGER.error(\"could not decode data (%s) from websocket: %s\", data, err)\n                    self._queue.task_done()\n                    continue\n\n                if message is None:\n                    self._queue.task_done()\n                    continue\n\n                self._LOGGER.debug(\"Got notification: %s\", message.WhichOneof(\"msg\"))\n\n                try:\n                    ack_message = self._on_data_received(message)\n                    if ack_message:\n                        if isinstance(ack_message, str):\n                            await self.call(bytes.fromhex(ack_message))\n                        else:\n                            await self.call(ack_message.SerializeToString())\n                except Exception as err:\n                    self._LOGGER.error(\"Error processing queue message: %s\", err)\n\n                self._queue.task_done()\n\n            except asyncio.TimeoutError:\n                # Timeout ist normal - weiter prüfen ob stopping\n                continue\n            except asyncio.CancelledError:\n                self._LOGGER.debug(\"Queue handler cancelled\")\n                break\n            except Exception as err:\n                self._LOGGER.error(\"Unexpected error in queue handler: %s\", err)\n                break\n\n        self._LOGGER.debug(\"Queue handler stopped\")\n\n    async def _start_websocket_handler(self, session: ClientSession):\n        retry_in: int = 10\n\n        self._LOGGER.debug(\n            \"_start_websocket_handler (is_stopping: %s, session.closed: %s)\",\n            self.is_stopping,\n            session.closed,\n        )\n\n        while not self.is_stopping and not session.closed:\n            try:\n                await self.component_reload_watcher.trigger()\n                await self._websocket_handler(session)\n            except client_exceptions.ClientConnectionError as cce:  # noqa: PERF203\n                self._LOGGER.error(\"Could not connect: %s, retry in %s seconds...\", cce, retry_in)\n                self._LOGGER.debug(cce)\n                self.connection_state = STATE_RECONNECTING\n                await asyncio.sleep(retry_in)\n                retry_in = retry_in * 2 if retry_in < 120 else 120\n                self.ws_connect_retry_counter += 1\n            except ConnectionResetError as cce:\n                self._LOGGER.info(\"Connection reseted: %s, retry in %s seconds...\", cce, retry_in)\n                self._LOGGER.debug(cce)\n                self.connection_state = STATE_RECONNECTING\n                await asyncio.sleep(retry_in)\n                retry_in = retry_in * 2 if retry_in < 120 else 120\n                self.ws_connect_retry_counter += 1\n            except WSServerHandshakeError as error:\n                if not self.ws_blocked_connection_error_logged:\n                    self._LOGGER.info(\n                        \"MB-API access blocked. (First Message, expect a re-login) %s, retry in %s seconds...\",\n                        error,\n                        retry_in,\n                    )\n                    self.ws_blocked_connection_error_logged = True\n                else:\n                    self._LOGGER.warning(\"WSS Connection blocked: %s, retry in %s seconds...\", error, retry_in)\n\n                if \"429\" in str(error.code):\n                    self.account_blocked = True\n                    # Setze Zeitstempel für Backup-Reload\n                    if self._blocked_since_time is None:\n                        self._blocked_since_time = time.time()\n\n                    if INITIATE_RELOGIN_AFTER_429 and self._relogin_429_attempts < MAX_RELOGIN_ATTEMPTS:\n                        config_entry = getattr(self.oauth, \"_config_entry\", None)\n                        if config_entry and \"password\" in config_entry.data:\n                            password = config_entry.data[\"password\"]\n                            username = config_entry.data.get(\"username\").strip()\n                            region = config_entry.data.get(\"region\")\n                            if username and password and hasattr(self.oauth, \"async_login_new\"):\n                                self._LOGGER.info(\"429 detected: Trying relogin with stored password\")\n                                try:\n                                    token_info = await self.oauth.async_login_new(username, password)\n                                    self._LOGGER.info(\"Relogin successful after 429\")\n                                    self._relogin_429_attempts = MAX_RELOGIN_ATTEMPTS\n                                except Exception as relogin_err:\n                                    self._relogin_429_attempts += 1\n                                    self._LOGGER.error(\n                                        \"Relogin after 429 failed (attempt %d/%d): %s\",\n                                        self._relogin_429_attempts,\n                                        MAX_RELOGIN_ATTEMPTS,\n                                        relogin_err,\n                                    )\n\n                self.ws_connect_retry_counter += 1\n                self.connection_state = STATE_RECONNECTING\n                await asyncio.sleep(retry_in)\n                retry_in = 10 * self.ws_connect_retry_counter * self.ws_connect_retry_counter\n            except Exception as error:\n                self._LOGGER.error(\"Other error: %s (%s)\", error, type(error).__name__)\n                self.connection_state = STATE_RECONNECTING\n                await asyncio.sleep(retry_in)\n                retry_in = retry_in * 2 if retry_in < 120 else 120\n                self.ws_connect_retry_counter += 1\n\n    async def _websocket_handler(self, session: ClientSession, **kwargs):\n        websocket_url = helper.Websocket_url(self._region)\n\n        kwargs.setdefault(\"proxy\", SYSTEM_PROXY)\n        kwargs.setdefault(\"headers\", await self._websocket_connection_headers())\n\n        self.is_connecting = True\n        self._LOGGER.debug(\"Connecting to %s\", websocket_url)\n        self._connection = await session.ws_connect(websocket_url, **kwargs)\n        self._LOGGER.debug(\"Connected to mercedes websocket at %s\", websocket_url)\n\n        # Always reset to initial timeout for each new connection (including reconnects)\n        self._connection_start_time = asyncio.get_running_loop().time()\n        self._initial_timeout_used = True\n        self._watchdog.timeout = INITIAL_WATCHDOG_TIMEOUT\n\n        await self._watchdog.trigger()\n\n        while not self._connection.closed:\n            if self.is_stopping:\n                break\n            self.is_connecting = False\n\n            self.connection_state = STATE_CONNECTED\n            # Reset blocked timestamp wenn Verbindung erfolgreich ist\n            if self._blocked_since_time is not None:\n                self._blocked_since_time = None\n            self._relogin_429_attempts = 0\n\n            msg = await self._connection.receive()\n\n            # Wichtig: alle Close-Varianten sauber behandeln\n            if msg.type in (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.CLOSED):\n                self._LOGGER.debug(\"websocket connection is closing (%s)\", msg.type)\n                break\n            if msg.type == WSMsgType.ERROR:\n                self._LOGGER.debug(\"websocket connection is closing - message type error.\")\n                break\n            if msg.type == WSMsgType.BINARY:\n                self._queue.put_nowait(msg.data)\n                await self._pingwatchdog.trigger()\n                await self._watchdog.trigger()\n\n    async def _websocket_connection_headers(self):\n        token = await self.oauth.async_get_cached_token()\n        header = {\n            \"Authorization\": token[\"access_token\"],\n            \"APP-SESSION-ID\": self.session_id,\n            \"OUTPUT-FORMAT\": \"PROTO\",\n            \"X-SessionId\": self.session_id,\n            \"X-TrackingId\": str(uuid.uuid4()).upper(),\n            \"ris-os-name\": RIS_OS_NAME,\n            \"ris-os-version\": RIS_OS_VERSION,\n            # \"ris-websocket-type\": \"ios-native\",\n            \"ris-sdk-version\": RIS_SDK_VERSION,\n            \"X-Locale\": \"de-DE\",\n            \"User-Agent\": WEBSOCKET_USER_AGENT,\n            # \"Accept-Language\": \" de-DE,de;q=0.9\",\n        }\n\n        return self._get_region_header(header)\n\n    def _get_region_header(self, header) -> list:\n        if self._region == REGION_EUROPE:\n            header[\"X-ApplicationName\"] = \"mycar-store-ece\"\n            header[\"ris-application-version\"] = RIS_APPLICATION_VERSION\n\n        if self._region == REGION_NORAM:\n            header[\"X-ApplicationName\"] = \"mycar-store-us\"\n            header[\"ris-application-version\"] = RIS_APPLICATION_VERSION_NA\n            header[\"User-Agent\"] = WEBSOCKET_USER_AGENT_US\n            header[\"X-Locale\"] = \"en-US\"\n            header[\"Accept-Encoding\"] = \"gzip\"\n            header[\"Sec-WebSocket-Extensions\"] = \"permessage-deflate\"\n\n        if self._region == REGION_APAC:\n            header[\"X-ApplicationName\"] = \"mycar-store-ap\"\n            header[\"ris-application-version\"] = RIS_APPLICATION_VERSION_PA\n            header[\"User-Agent\"] = WEBSOCKET_USER_AGENT_PA\n\n        if self._region == REGION_CHINA:\n            header[\"X-ApplicationName\"] = \"mycar-store-cn\"\n            header[\"ris-application-version\"] = RIS_APPLICATION_VERSION_CN\n            header[\"User-Agent\"] = WEBSOCKET_USER_AGENT_CN\n            header[\"ris-sdk-version\"] = RIS_SDK_VERSION_CN\n\n        return header\n\n    async def _blocked_account_reload_check(self):\n        if self.account_blocked and self.ws_connect_retry_counter_reseted:\n            self.account_blocked = False\n            self.ws_connect_retry_counter_reseted = False\n            self._blocked_since_time = None\n            self._last_backup_reload_time = None\n\n            self._LOGGER.info(\"Initiating component reload after account got unblocked...\")\n            self._hass.config_entries.async_schedule_reload(self.oauth._config_entry.entry_id)\n\n        elif self.account_blocked and not self.ws_connect_retry_counter_reseted:\n            current_time = time.time()\n\n            # Prüfe ob Backup-Reload notwendig und erlaubt ist\n            if self._blocked_since_time is not None and self._should_trigger_backup_reload(current_time):\n                self._LOGGER.info(\n                    \"Initiating scheduled backup component reload during allowed time window \"\n                    \"(ignition mode or no message received)\"\n                )\n\n                self.account_blocked = False\n                self._blocked_since_time = None\n                self._last_backup_reload_time = current_time\n                self._hass.config_entries.async_schedule_reload(self.oauth._config_entry.entry_id)\n            else:\n                await self.component_reload_watcher.trigger()\n\n    def _should_trigger_backup_reload(self, current_time: float) -> bool:\n        \"\"\"Prüft ob Backup-Reload ausgeführt werden soll (alle 30 Min oder garantiert nach Mitternacht GMT).\"\"\"\n\n        # Kein Backup-Reload für China - Reauth ist dort nicht verfügbar\n        if self._region == REGION_CHINA:\n            return False\n\n        # Mindestens 5 Minuten blockiert sein\n        if current_time - self._blocked_since_time < 300:\n            return False\n\n        # Aktuelle Zeit in GMT\n        now_utc = datetime.fromtimestamp(current_time, tz=timezone.utc)\n\n        # GARANTIERT nach Mitternacht GMT (00:00 - 00:30 Zeitfenster)\n        if now_utc.hour == 0 and now_utc.minute <= 30:\n            # Prüfe ob schon heute nach Mitternacht ein Reload gemacht wurde\n            if self._last_backup_reload_time is not None:\n                last_reload_utc = datetime.fromtimestamp(self._last_backup_reload_time, tz=timezone.utc)\n                # Wenn der letzte Reload heute nach Mitternacht war, nicht nochmal\n                if (\n                    last_reload_utc.date() == now_utc.date()\n                    and last_reload_utc.hour == 0\n                    and last_reload_utc.minute <= 30\n                ):\n                    return False\n            return True\n\n        # Alle 30 Minuten, aber nur wenn mindestens 30 Min seit letztem Reload\n        if self._last_backup_reload_time is not None:\n            if current_time - self._last_backup_reload_time < 1800:  # 30 * 60 = 1800 Sekunden\n                return False\n\n        # 30-Minuten-Intervalle (:00, :30) mit 5-Minuten-Fenster\n        if now_utc.minute <= 5 or (25 <= now_utc.minute <= 35):\n            return True\n\n        return False\n\n    async def _await_tasks_then_cleanup(self):\n        \"\"\"Warte kurz auf natürliches Ende der Tasks und räume dann auf.\"\"\"\n        # Warten auf _websocket_task\n        if self._websocket_task and not self._websocket_task.done():\n            try:\n                await asyncio.shield(asyncio.wait_for(self._websocket_task, timeout=2.0))\n            except asyncio.TimeoutError:\n                self._LOGGER.warning(\"websocket task didn't finish in time, cancelling\")\n                if self._websocket_task:\n                    self._websocket_task.cancel()\n                with contextlib.suppress(Exception):\n                    await self._websocket_task\n            except asyncio.CancelledError:\n                # Beim Shutdown ignorieren\n                pass\n\n        # Queue-Task analog\n        if self._queue_task and not self._queue_task.done():\n            try:\n                await asyncio.shield(asyncio.wait_for(self._queue_task, timeout=2.0))\n            except asyncio.TimeoutError:\n                self._queue_task.cancel()\n                with contextlib.suppress(Exception):\n                    await self._queue_task\n            except asyncio.CancelledError:\n                pass\n\n        # Queue bereinigen\n        await self._cleanup_queue(\"_await_tasks_then_cleanup\")\n\n        # Task-Referenzen zurücksetzen\n        self._queue_task = None\n        self._websocket_task = None\n\n    async def _cleanup_tasks(self):\n        \"\"\"Cleanup running tasks properly (Fallback).\"\"\"\n        tasks_to_cancel = []\n\n        if self._queue_task and not self._queue_task.done():\n            tasks_to_cancel.append(self._queue_task)\n            self._LOGGER.debug(\"Cancelling _queue_task\")\n\n        if self._websocket_task and not self._websocket_task.done():\n            tasks_to_cancel.append(self._websocket_task)\n            self._LOGGER.debug(\"Cancelling _websocket_task\")\n\n        if tasks_to_cancel:\n            for task in tasks_to_cancel:\n                task.cancel()\n\n            # Warten auf ordnungsgemäße Beendigung mit Timeout\n            try:\n                await asyncio.wait_for(asyncio.gather(*tasks_to_cancel, return_exceptions=True), timeout=5.0)\n            except asyncio.TimeoutError:\n                self._LOGGER.warning(\"Some websocket tasks did not terminate within 5 seconds\")\n\n        # Queue bereinigen\n        await self._cleanup_queue(\"_cleanup_tasks\")\n\n        # Task-Referenzen zurücksetzen\n        self._queue_task = None\n        self._websocket_task = None\n\n    async def _cleanup_queue(self, caller: str = \"unknown\"):\n        \"\"\"Cleanup remaining queue items.\"\"\"\n        cleanup_count = 0\n        try:\n            while not self._queue.empty():\n                try:\n                    self._queue.get_nowait()\n                    self._queue.task_done()\n                    cleanup_count += 1\n                except asyncio.QueueEmpty:\n                    break\n        except Exception as err:\n            self._LOGGER.error(\"Error cleaning up queue: %s\", err)\n\n        if cleanup_count > 0:\n            self._LOGGER.debug(\n                \"Cleaned up %d remaining queue items (caller: %s, qsize: %d)\",\n                cleanup_count,\n                caller,\n                self._queue.qsize(),\n            )\n\n    def _set_watchdog_timeout(self, timeout: int) -> None:\n        \"\"\"Set watchdog timeout with protection period logic.\"\"\"\n        if not self._initial_timeout_used or self._connection_start_time is None:\n            # Not in initial timeout mode, allow any timeout change\n            self._watchdog.timeout = timeout\n            return\n\n        # After protection period, allow timeout changes and switch to default behavior\n        self._watchdog.timeout = timeout\n        # Reset to normal behavior after protection period (regardless of timeout value)\n        self._initial_timeout_used = False\n        self._connection_start_time = None\n\n    def _reset_watchdog_timeout(self) -> None:\n        \"\"\"Reset watchdog timeout to default and clear initial timeout state.\"\"\"\n        self._watchdog.timeout = DEFAULT_WATCHDOG_TIMEOUT\n        self._initial_timeout_used = False\n        self._connection_start_time = None\n"
  },
  {
    "path": "hacs.json",
    "content": "{\n    \"name\": \"MercedesME 2020\",\n    \"homeassistant\": \"2024.02.0\",\n    \"zip_release\": true,\n    \"filename\": \"mbapi2020.zip\",\n    \"render_readme\": true\n}"
  },
  {
    "path": "mypi.ini",
    "content": "# Automatically generated by hassfest.\n#\n# To update, run python3 -m script.hassfest -p mypy_config\n\n[mypy]\npython_version = 3.13\nplugins = pydantic.mypy\nshow_error_codes = true\nfollow_imports = silent\nlocal_partial_types = true\nstrict_equality = true\nno_implicit_optional = true\nwarn_incomplete_stub = true\nwarn_redundant_casts = true\nwarn_unused_configs = true\nwarn_unused_ignores = true\nenable_error_code = ignore-without-code, redundant-self, truthy-iterable\ndisable_error_code = annotation-unchecked, import-not-found, import-untyped\nextra_checks = false\ncheck_untyped_defs = true\ndisallow_incomplete_defs = true\ndisallow_subclassing_any = true\ndisallow_untyped_calls = true\ndisallow_untyped_decorators = true\ndisallow_untyped_defs = true\nwarn_return_any = true\nwarn_unreachable = true\n\n[pydantic-mypy]\ninit_forbid_extra = true\ninit_typed = true\nwarn_required_dynamic_aliases = true\nwarn_untyped_fields = true\n\n\n[mypy-custom_components.*]\ncheck_untyped_defs = false\ndisallow_incomplete_defs = false\ndisallow_subclassing_any = false\ndisallow_untyped_calls = false\ndisallow_untyped_decorators = false\ndisallow_untyped_defs = false\nwarn_return_any = false\nwarn_unreachable = false\nno_implicit_reexport = false\nignore_missing_imports = True\nfollow_imports = silent\n\n[mypy-simulator]\ncheck_untyped_defs = false\ndisallow_incomplete_defs = false\ndisallow_subclassing_any = false\ndisallow_untyped_calls = false\ndisallow_untyped_decorators = false\ndisallow_untyped_defs = false\nwarn_return_any = false\nwarn_unreachable = false\nno_implicit_reexport = false\nignore_missing_imports = True\nfollow_imports = silent\n\n[mypy-tests.*]\ncheck_untyped_defs = false\ndisallow_incomplete_defs = false\ndisallow_subclassing_any = false\ndisallow_untyped_calls = false\ndisallow_untyped_decorators = false\ndisallow_untyped_defs = false\nwarn_return_any = false\nwarn_unreachable = false\n\n\n\n[mypy.voluptuous]\nignore_missing_imports = True\nfollow_imports = silent"
  },
  {
    "path": "pyproject.toml",
    "content": "[tool.pylint.MAIN]\npy-version = \"3.14\"\n# Use a conservative default here; 2 should speed up most setups and not hurt\n# any too bad. Override on command line as appropriate.\njobs = 2\ninit-hook = \"\"\"\\\n    from pathlib import Path; \\\n    import sys; \\\n\n    from pylint.config import find_default_config_files; \\\n\n    sys.path.append( \\\n        str(Path(next(find_default_config_files())).parent.joinpath('pylint/plugins'))\n    ) \\\n    \"\"\"\nload-plugins = [\n    \"pylint.extensions.code_style\",\n    \"pylint.extensions.typing\",\n    \"pylint_per_file_ignores\",\n]\npersistent = false\nextension-pkg-allow-list = [\n    \"av.audio.stream\",\n    \"av.logging\",\n    \"av.stream\",\n    \"ciso8601\",\n    \"orjson\",\n    \"cv2\",\n]\n\n\n[tool.pylint.BASIC]\nclass-const-naming-style = \"any\"\n\n[tool.pylint.\"MESSAGES CONTROL\"]\n# Reasons disabled:\n# format - handled by ruff\n# locally-disabled - it spams too much\n# duplicate-code - unavoidable\n# cyclic-import - doesn't test if both import on load\n# abstract-class-little-used - prevents from setting right foundation\n# unused-argument - generic callbacks and setup methods create a lot of warnings\n# too-many-* - are not enforced for the sake of readability\n# too-few-* - same as too-many-*\n# abstract-method - with intro of async there are always methods missing\n# inconsistent-return-statements - doesn't handle raise\n# too-many-ancestors - it's too strict.\n# wrong-import-order - isort guards this\n# possibly-used-before-assignment - too many errors / not necessarily issues\n# ---\n# Pylint CodeStyle plugin\n# consider-using-namedtuple-or-dataclass - too opinionated\n# consider-using-assignment-expr - decision to use := better left to devs\ndisable = [\n    \"format\",\n    \"abstract-method\",\n    \"cyclic-import\",\n    \"duplicate-code\",\n    \"inconsistent-return-statements\",\n    \"locally-disabled\",\n    \"not-context-manager\",\n    \"too-few-public-methods\",\n    \"too-many-ancestors\",\n    \"too-many-arguments\",\n    \"too-many-instance-attributes\",\n    \"too-many-lines\",\n    \"too-many-locals\",\n    \"too-many-public-methods\",\n    \"too-many-boolean-expressions\",\n    \"too-many-positional-arguments\",\n    \"wrong-import-order\",\n    \"consider-using-namedtuple-or-dataclass\",\n    \"consider-using-assignment-expr\",\n    # \"possibly-used-before-assignment\",\n\n    # Handled by ruff\n    # Ref: <https://github.com/astral-sh/ruff/issues/970>\n    \"await-outside-async\", # PLE1142\n    \"bad-str-strip-call\", # PLE1310\n    \"bad-string-format-type\", # PLE1307\n    \"bidirectional-unicode\", # PLE2502\n    \"continue-in-finally\", # PLE0116\n    \"duplicate-bases\", # PLE0241\n    \"misplaced-bare-raise\", # PLE0704\n    \"format-needs-mapping\", # F502\n    \"function-redefined\", # F811\n    # Needed because ruff does not understand type of __all__ generated by a function\n    # \"invalid-all-format\", # PLE0605\n    \"invalid-all-object\", # PLE0604\n    \"invalid-character-backspace\", # PLE2510\n    \"invalid-character-esc\", # PLE2513\n    \"invalid-character-nul\", # PLE2514\n    \"invalid-character-sub\", # PLE2512\n    \"invalid-character-zero-width-space\", # PLE2515\n    \"logging-too-few-args\", # PLE1206\n    \"logging-too-many-args\", # PLE1205\n    \"missing-format-string-key\", # F524\n    \"mixed-format-string\", # F506\n    \"no-method-argument\", # N805\n    \"no-self-argument\", # N805\n    \"nonexistent-operator\", # B002\n    \"nonlocal-without-binding\", # PLE0117\n    \"not-in-loop\", # F701, F702\n    \"notimplemented-raised\", # F901\n    \"return-in-init\", # PLE0101\n    \"return-outside-function\", # F706\n    \"syntax-error\", # E999\n    \"too-few-format-args\", # F524\n    \"too-many-format-args\", # F522\n    \"too-many-star-expressions\", # F622\n    \"truncated-format-string\", # F501\n    \"undefined-all-variable\", # F822\n    \"undefined-variable\", # F821\n    \"used-prior-global-declaration\", # PLE0118\n    \"yield-inside-async-function\", # PLE1700\n    \"yield-outside-function\", # F704\n    \"anomalous-backslash-in-string\", # W605\n    \"assert-on-string-literal\", # PLW0129\n    \"assert-on-tuple\", # F631\n    \"bad-format-string\", # W1302, F\n    \"bad-format-string-key\", # W1300, F\n    \"bare-except\", # E722\n    \"binary-op-exception\", # PLW0711\n    \"cell-var-from-loop\", # B023\n    # \"dangerous-default-value\", # B006, ruff catches new occurrences, needs more work\n    \"duplicate-except\", # B014\n    \"duplicate-key\", # F601\n    \"duplicate-string-formatting-argument\", # F\n    \"duplicate-value\", # F\n    \"eval-used\", # S307\n    \"exec-used\", # S102\n    \"expression-not-assigned\", # B018\n    \"f-string-without-interpolation\", # F541\n    \"forgotten-debug-statement\", # T100\n    \"format-string-without-interpolation\", # F\n    # \"global-statement\", # PLW0603, ruff catches new occurrences, needs more work\n    \"global-variable-not-assigned\", # PLW0602\n    \"implicit-str-concat\", # ISC001\n    \"import-self\", # PLW0406\n    \"inconsistent-quotes\", # Q000\n    \"invalid-envvar-default\", # PLW1508\n    \"keyword-arg-before-vararg\", # B026\n    \"logging-format-interpolation\", # G\n    \"logging-fstring-interpolation\", # G\n    \"logging-not-lazy\", # G\n    \"misplaced-future\", # F404\n    \"named-expr-without-context\", # PLW0131\n    \"nested-min-max\", # PLW3301\n    \"pointless-statement\", # B018\n    \"raise-missing-from\", # B904\n    \"redefined-builtin\", # A001\n    \"try-except-raise\", # TRY302\n    \"unused-argument\", # ARG001, we don't use it\n    \"unused-format-string-argument\", #F507\n    \"unused-format-string-key\", # F504\n    \"unused-import\", # F401\n    \"unused-variable\", # F841\n    \"useless-else-on-loop\", # PLW0120\n    \"wildcard-import\", # F403\n    \"bad-classmethod-argument\", # N804\n    \"consider-iterating-dictionary\", # SIM118\n    \"empty-docstring\", # D419\n    \"invalid-name\", # N815\n    \"line-too-long\", # E501, disabled globally\n    \"missing-class-docstring\", # D101\n    \"missing-final-newline\", # W292\n    \"missing-function-docstring\", # D103\n    \"missing-module-docstring\", # D100\n    \"multiple-imports\", #E401\n    \"singleton-comparison\", # E711, E712\n    \"subprocess-run-check\", # PLW1510\n    \"superfluous-parens\", # UP034\n    \"ungrouped-imports\", # I001\n    \"unidiomatic-typecheck\", # E721\n    \"unnecessary-direct-lambda-call\", # PLC3002\n    \"unnecessary-lambda-assignment\", # PLC3001\n    \"unnecessary-pass\", # PIE790\n    \"unneeded-not\", # SIM208\n    \"useless-import-alias\", # PLC0414\n    \"wrong-import-order\", # I001\n    \"wrong-import-position\", # E402\n    \"comparison-of-constants\", # PLR0133\n    \"comparison-with-itself\", # PLR0124\n    \"consider-alternative-union-syntax\", # UP007\n    \"consider-merging-isinstance\", # PLR1701\n    \"consider-using-alias\", # UP006\n    \"consider-using-dict-comprehension\", # C402\n    \"consider-using-generator\", # C417\n    \"consider-using-get\", # SIM401\n    \"consider-using-set-comprehension\", # C401\n    \"consider-using-sys-exit\", # PLR1722\n    \"consider-using-ternary\", # SIM108\n    \"literal-comparison\", # F632\n    \"property-with-parameters\", # PLR0206\n    \"super-with-arguments\", # UP008\n    \"too-many-branches\", # PLR0912\n    \"too-many-return-statements\", # PLR0911\n    \"too-many-statements\", # PLR0915\n    \"trailing-comma-tuple\", # COM818\n    \"unnecessary-comprehension\", # C416\n    \"use-a-generator\", # C417\n    \"use-dict-literal\", # C406\n    \"use-list-literal\", # C405\n    \"useless-object-inheritance\", # UP004\n    \"useless-return\", # PLR1711\n    \"no-else-break\", # RET508\n    \"no-else-continue\", # RET507\n    \"no-else-raise\", # RET506\n    \"no-else-return\", # RET505\n    \"broad-except\", # BLE001\n    \"protected-access\", # SLF001\n    \"broad-exception-raised\", # TRY002\n    \"consider-using-f-string\", # PLC0209\n    # \"no-self-use\", # PLR6301  # Optional plugin, not enabled\n\n    # Handled by mypy\n    # Ref: <https://github.com/antonagestam/pylint-mypy-overlap>\n    \"abstract-class-instantiated\",\n    \"arguments-differ\",\n    \"assigning-non-slot\",\n    \"assignment-from-no-return\",\n    \"assignment-from-none\",\n    \"bad-exception-cause\",\n    \"bad-format-character\",\n    \"bad-reversed-sequence\",\n    \"bad-super-call\",\n    \"bad-thread-instantiation\",\n    \"catching-non-exception\",\n    \"comparison-with-callable\",\n    \"deprecated-class\",\n    \"dict-iter-missing-items\",\n    \"format-combined-specification\",\n    \"global-variable-undefined\",\n    \"import-error\",\n    \"inconsistent-mro\",\n    \"inherit-non-class\",\n    \"init-is-generator\",\n    \"invalid-class-object\",\n    \"invalid-enum-extension\",\n    \"invalid-envvar-value\",\n    \"invalid-format-returned\",\n    \"invalid-hash-returned\",\n    \"invalid-metaclass\",\n    \"invalid-overridden-method\",\n    \"invalid-repr-returned\",\n    \"invalid-sequence-index\",\n    \"invalid-slice-index\",\n    \"invalid-slots-object\",\n    \"invalid-slots\",\n    \"invalid-star-assignment-target\",\n    \"invalid-str-returned\",\n    \"invalid-unary-operand-type\",\n    \"invalid-unicode-codec\",\n    \"isinstance-second-argument-not-valid-type\",\n    \"method-hidden\",\n    \"misplaced-format-function\",\n    \"missing-format-argument-key\",\n    \"missing-format-attribute\",\n    \"missing-kwoa\",\n    \"no-member\",\n    \"no-value-for-parameter\",\n    \"non-iterator-returned\",\n    \"non-str-assignment-to-dunder-name\",\n    \"nonlocal-and-global\",\n    \"not-a-mapping\",\n    \"not-an-iterable\",\n    \"not-async-context-manager\",\n    \"not-callable\",\n    \"not-context-manager\",\n    \"overridden-final-method\",\n    \"raising-bad-type\",\n    \"raising-non-exception\",\n    \"redundant-keyword-arg\",\n    \"relative-beyond-top-level\",\n    \"self-cls-assignment\",\n    \"signature-differs\",\n    \"star-needs-assignment-target\",\n    \"subclassed-final-class\",\n    \"super-without-brackets\",\n    \"too-many-function-args\",\n    \"typevar-double-variance\",\n    \"typevar-name-mismatch\",\n    \"unbalanced-dict-unpacking\",\n    \"unbalanced-tuple-unpacking\",\n    \"unexpected-keyword-arg\",\n    \"unhashable-member\",\n    \"unpacking-non-sequence\",\n    \"unsubscriptable-object\",\n    \"unsupported-assignment-operation\",\n    \"unsupported-binary-operation\",\n    \"unsupported-delete-operation\",\n    \"unsupported-membership-test\",\n    \"used-before-assignment\",\n    \"using-final-decorator-in-unsupported-version\",\n    \"wrong-exception-operation\",\n]\nenable = [\n    #\"useless-suppression\",  # temporarily every now and then to clean them up\n    \"use-symbolic-message-instead\",\n]\nper-file-ignores = [\n    # redefined-outer-name: Tests reference fixtures in the test function\n    # use-implicit-booleaness-not-comparison: Tests need to validate that a list\n    # or a dict is returned\n    \"/tests/:redefined-outer-name,use-implicit-booleaness-not-comparison\",\n]\n\n[tool.pylint.REPORTS]\nscore = false\n\n[tool.pylint.TYPECHECK]\nignored-classes = [\n    \"_CountingAttr\",  # for attrs\n]\nmixin-class-rgx = \".*[Mm]ix[Ii]n\"\n\n[tool.pylint.FORMAT]\nexpected-line-ending-format = \"LF\"\n\n[tool.pylint.EXCEPTIONS]\novergeneral-exceptions = [\n    \"builtins.BaseException\",\n    \"builtins.Exception\",\n    # \"homeassistant.exceptions.HomeAssistantError\",  # too many issues\n]\n\n[tool.pylint.TYPING]\nruntime-typing = false\n\n[tool.pylint.CODE_STYLE]\nmax-line-length-suggestions = 120\n\n[tool.pytest.ini_options]\ntestpaths = [\n    \"tests\",\n]\nnorecursedirs = [\n    \".git\",\n    \"testing_config\",\n]\nlog_format = \"%(asctime)s.%(msecs)03d %(levelname)-8s %(threadName)s %(name)s:%(filename)s:%(lineno)s %(message)s\"\nlog_date_format = \"%Y-%m-%d %H:%M:%S\"\nasyncio_mode = \"auto\"\nasyncio_default_fixture_loop_scope = \"function\"\nfilterwarnings = []\n\n\n[tool.ruff]\nline-length = 120\nrequired-version = \">=0.6.8\"\n\n[tool.ruff.lint]\nselect = [\n    \"A001\", # Variable {name} is shadowing a Python builtin\n    \"ASYNC210\", # Async functions should not call blocking HTTP methods\n    \"ASYNC220\", # Async functions should not create subprocesses with blocking methods\n    \"ASYNC221\", # Async functions should not run processes with blocking methods\n    \"ASYNC222\", # Async functions should not wait on processes with blocking methods\n    \"ASYNC230\", # Async functions should not open files with blocking methods like open\n    \"ASYNC251\", # Async functions should not call time.sleep\n    \"B002\", # Python does not support the unary prefix increment\n    \"B005\", # Using .strip() with multi-character strings is misleading\n    \"B007\", # Loop control variable {name} not used within loop body\n    \"B014\", # Exception handler with duplicate exception\n    \"B015\", # Pointless comparison. Did you mean to assign a value? Otherwise, prepend assert or remove it.\n    \"B017\", # pytest.raises(BaseException) should be considered evil\n    \"B018\", # Found useless attribute access. Either assign it to a variable or remove it.\n    \"B023\", # Function definition does not bind loop variable {name}\n    \"B026\", # Star-arg unpacking after a keyword argument is strongly discouraged\n    \"B032\", # Possible unintentional type annotation (using :). Did you mean to assign (using =)?\n    \"B904\", # Use raise from to specify exception cause\n    \"B905\", # zip() without an explicit strict= parameter\n    \"BLE\",\n    \"C\", # complexity\n    \"COM818\", # Trailing comma on bare tuple prohibited\n    \"D\", # docstrings\n    \"DTZ003\", # Use datetime.now(tz=) instead of datetime.utcnow()\n    \"DTZ004\", # Use datetime.fromtimestamp(ts, tz=) instead of datetime.utcfromtimestamp(ts)\n    \"E\", # pycodestyle\n    \"F\", # pyflakes/autoflake\n    \"F541\", # f-string without any placeholders\n    \"FLY\", # flynt\n    \"FURB\", # refurb\n    \"G\", # flake8-logging-format\n    \"I\", # isort\n    \"INP\", # flake8-no-pep420\n    \"ISC\", # flake8-implicit-str-concat\n    \"ICN001\", # import concentions; {name} should be imported as {asname}\n    \"LOG\", # flake8-logging\n    \"N804\", # First argument of a class method should be named cls\n    \"N805\", # First argument of a method should be named self\n    \"N815\", # Variable {name} in class scope should not be mixedCase\n    \"PERF\", # Perflint\n    \"PGH\", # pygrep-hooks\n    \"PIE\", # flake8-pie\n    \"PL\", # pylint\n    \"PT\", # flake8-pytest-style\n    \"PTH\", # flake8-pathlib\n    \"PYI\", # flake8-pyi\n    \"RET\", # flake8-return\n    \"RSE\", # flake8-raise\n    \"RUF005\", # Consider iterable unpacking instead of concatenation\n    \"RUF006\", # Store a reference to the return value of asyncio.create_task\n    \"RUF010\", # Use explicit conversion flag\n    \"RUF013\", # PEP 484 prohibits implicit Optional\n    \"RUF017\", # Avoid quadratic list summation\n    \"RUF018\", # Avoid assignment expressions in assert statements\n    \"RUF019\", # Unnecessary key check before dictionary access\n    # \"RUF100\", # Unused `noqa` directive; temporarily every now and then to clean them up\n    \"S102\", # Use of exec detected\n    \"S103\", # bad-file-permissions\n    \"S108\", # hardcoded-temp-file\n    \"S306\", # suspicious-mktemp-usage\n    \"S307\", # suspicious-eval-usage\n    \"S313\", # suspicious-xmlc-element-tree-usage\n    \"S314\", # suspicious-xml-element-tree-usage\n    \"S315\", # suspicious-xml-expat-reader-usage\n    \"S316\", # suspicious-xml-expat-builder-usage\n    \"S317\", # suspicious-xml-sax-usage\n    \"S318\", # suspicious-xml-mini-dom-usage\n    \"S319\", # suspicious-xml-pull-dom-usage\n    \n    \"S601\", # paramiko-call\n    \"S602\", # subprocess-popen-with-shell-equals-true\n    \"S604\", # call-with-shell-equals-true\n    \"S608\", # hardcoded-sql-expression\n    \"S609\", # unix-command-wildcard-injection\n    \"SIM\", # flake8-simplify\n    \"SLF\", # flake8-self\n    \"SLOT\", # flake8-slots\n    \"T100\", # Trace found: {name} used\n    \"T20\", # flake8-print\n    \"TCH\", # flake8-type-checking\n    \"TID\", # Tidy imports\n    \"TRY\", # tryceratops\n    \"UP\", # pyupgrade\n    \"UP031\", # Use format specifiers instead of percent format\n    \"UP032\", # Use f-string instead of `format` call\n    \"W\", # pycodestyle\n]\n\nignore = [\n    \"D202\", # No blank lines allowed after function docstring\n    \"D203\", # 1 blank line required before class docstring\n    \"D213\", # Multi-line docstring summary should start at the second line\n    \"D406\", # Section name should end with a newline\n    \"D407\", # Section name underlining\n    \"E501\", # line too long\n\n    \"PLC1901\", # {existing} can be simplified to {replacement} as an empty string is falsey; too many false positives\n    \"PLR0911\", # Too many return statements ({returns} > {max_returns})\n    \"PLR0912\", # Too many branches ({branches} > {max_branches})\n    \"PLR0913\", # Too many arguments to function call ({c_args} > {max_args})\n    \"PLR0915\", # Too many statements ({statements} > {max_statements})\n    \"PLR2004\", # Magic value used in comparison, consider replacing {value} with a constant variable\n    \"PLW2901\", # Outer {outer_kind} variable {name} overwritten by inner {inner_kind} target\n    \"PT011\", # pytest.raises({exception}) is too broad, set the `match` parameter or use a more specific exception\n    \"PT018\", # Assertion should be broken down into multiple parts\n    \"RUF001\", # String contains ambiguous unicode character.\n    \"RUF002\", # Docstring contains ambiguous unicode character.\n    \"RUF003\", # Comment contains ambiguous unicode character.\n    \"RUF015\", # Prefer next(...) over single element slice\n    \"SIM102\", # Use a single if statement instead of nested if statements\n    \"SIM103\", # Return the condition {condition} directly\n    \"SIM108\", # Use ternary operator {contents} instead of if-else-block\n    \"SIM115\", # Use context handler for opening files\n\n    # Moving imports into type-checking blocks can mess with pytest.patch()\n    \"TC001\", # Move application import {} into a type-checking block\n    \"TC002\", # Move third-party import {} into a type-checking block\n    \"TC003\", # Move standard library import {} into a type-checking block\n\n    \"TRY003\", # Avoid specifying long messages outside the exception class\n    \"TRY400\", # Use `logging.exception` instead of `logging.error`\n\n    # May conflict with the formatter, https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules\n    \"W191\",\n    \"E111\",\n    \"E114\",\n    \"E117\",\n    \"D206\",\n    \"D300\",\n    \"Q\",\n    \"COM812\",\n    \"COM819\",\n    \"ISC001\",\n\n    # Disabled because ruff does not understand type of __all__ generated by a function\n    \"PLE0605\",\n\n\n    \"SLF001\"\n]\n\n[tool.ruff.lint.flake8-import-conventions.extend-aliases]\nvoluptuous = \"vol\"\n\"homeassistant.components.air_quality.PLATFORM_SCHEMA\" = \"AIR_QUALITY_PLATFORM_SCHEMA\"\n\"homeassistant.components.alarm_control_panel.PLATFORM_SCHEMA\" = \"ALARM_CONTROL_PANEL_PLATFORM_SCHEMA\"\n\"homeassistant.components.binary_sensor.PLATFORM_SCHEMA\" = \"BINARY_SENSOR_PLATFORM_SCHEMA\"\n\"homeassistant.components.button.PLATFORM_SCHEMA\" = \"BUTTON_PLATFORM_SCHEMA\"\n\"homeassistant.components.calendar.PLATFORM_SCHEMA\" = \"CALENDAR_PLATFORM_SCHEMA\"\n\"homeassistant.components.camera.PLATFORM_SCHEMA\" = \"CAMERA_PLATFORM_SCHEMA\"\n\"homeassistant.components.climate.PLATFORM_SCHEMA\" = \"CLIMATE_PLATFORM_SCHEMA\"\n\"homeassistant.components.conversation.PLATFORM_SCHEMA\" = \"CONVERSATION_PLATFORM_SCHEMA\"\n\"homeassistant.components.cover.PLATFORM_SCHEMA\" = \"COVER_PLATFORM_SCHEMA\"\n\"homeassistant.components.date.PLATFORM_SCHEMA\" = \"DATE_PLATFORM_SCHEMA\"\n\"homeassistant.components.datetime.PLATFORM_SCHEMA\" = \"DATETIME_PLATFORM_SCHEMA\"\n\"homeassistant.components.device_tracker.PLATFORM_SCHEMA\" = \"DEVICE_TRACKER_PLATFORM_SCHEMA\"\n\"homeassistant.components.event.PLATFORM_SCHEMA\" = \"EVENT_PLATFORM_SCHEMA\"\n\"homeassistant.components.fan.PLATFORM_SCHEMA\" = \"FAN_PLATFORM_SCHEMA\"\n\"homeassistant.components.geo_location.PLATFORM_SCHEMA\" = \"GEO_LOCATION_PLATFORM_SCHEMA\"\n\"homeassistant.components.humidifier.PLATFORM_SCHEMA\" = \"HUMIDIFIER_PLATFORM_SCHEMA\"\n\"homeassistant.components.image.PLATFORM_SCHEMA\" = \"IMAGE_PLATFORM_SCHEMA\"\n\"homeassistant.components.image_processing.PLATFORM_SCHEMA\" = \"IMAGE_PROCESSING_PLATFORM_SCHEMA\"\n\"homeassistant.components.lawn_mower.PLATFORM_SCHEMA\" = \"LAWN_MOWER_PLATFORM_SCHEMA\"\n\"homeassistant.components.light.PLATFORM_SCHEMA\" = \"LIGHT_PLATFORM_SCHEMA\"\n\"homeassistant.components.lock.PLATFORM_SCHEMA\" = \"LOCK_PLATFORM_SCHEMA\"\n\"homeassistant.components.media_player.PLATFORM_SCHEMA\" = \"MEDIA_PLAYER_PLATFORM_SCHEMA\"\n\"homeassistant.components.notify.PLATFORM_SCHEMA\" = \"NOTIFY_PLATFORM_SCHEMA\"\n\"homeassistant.components.number.PLATFORM_SCHEMA\" = \"NUMBER_PLATFORM_SCHEMA\"\n\"homeassistant.components.remote.PLATFORM_SCHEMA\" = \"REMOTE_PLATFORM_SCHEMA\"\n\"homeassistant.components.scene.PLATFORM_SCHEMA\" = \"SCENE_PLATFORM_SCHEMA\"\n\"homeassistant.components.select.PLATFORM_SCHEMA\" = \"SELECT_PLATFORM_SCHEMA\"\n\"homeassistant.components.sensor.PLATFORM_SCHEMA\" = \"SENSOR_PLATFORM_SCHEMA\"\n\"homeassistant.components.siren.PLATFORM_SCHEMA\" = \"SIREN_PLATFORM_SCHEMA\"\n\"homeassistant.components.stt.PLATFORM_SCHEMA\" = \"STT_PLATFORM_SCHEMA\"\n\"homeassistant.components.switch.PLATFORM_SCHEMA\" = \"SWITCH_PLATFORM_SCHEMA\"\n\"homeassistant.components.text.PLATFORM_SCHEMA\" = \"TEXT_PLATFORM_SCHEMA\"\n\"homeassistant.components.time.PLATFORM_SCHEMA\" = \"TIME_PLATFORM_SCHEMA\"\n\"homeassistant.components.todo.PLATFORM_SCHEMA\" = \"TODO_PLATFORM_SCHEMA\"\n\"homeassistant.components.tts.PLATFORM_SCHEMA\" = \"TTS_PLATFORM_SCHEMA\"\n\"homeassistant.components.vacuum.PLATFORM_SCHEMA\" = \"VACUUM_PLATFORM_SCHEMA\"\n\"homeassistant.components.valve.PLATFORM_SCHEMA\" = \"VALVE_PLATFORM_SCHEMA\"\n\"homeassistant.components.update.PLATFORM_SCHEMA\" = \"UPDATE_PLATFORM_SCHEMA\"\n\"homeassistant.components.wake_word.PLATFORM_SCHEMA\" = \"WAKE_WORD_PLATFORM_SCHEMA\"\n\"homeassistant.components.water_heater.PLATFORM_SCHEMA\" = \"WATER_HEATER_PLATFORM_SCHEMA\"\n\"homeassistant.components.weather.PLATFORM_SCHEMA\" = \"WEATHER_PLATFORM_SCHEMA\"\n\"homeassistant.core.DOMAIN\" = \"HOMEASSISTANT_DOMAIN\"\n\"homeassistant.helpers.area_registry\" = \"ar\"\n\"homeassistant.helpers.category_registry\" = \"cr\"\n\"homeassistant.helpers.config_validation\" = \"cv\"\n\"homeassistant.helpers.device_registry\" = \"dr\"\n\"homeassistant.helpers.entity_registry\" = \"er\"\n\"homeassistant.helpers.floor_registry\" = \"fr\"\n\"homeassistant.helpers.issue_registry\" = \"ir\"\n\"homeassistant.helpers.label_registry\" = \"lr\"\n\"homeassistant.util.dt\" = \"dt_util\"\n\n[tool.ruff.lint.flake8-pytest-style]\nfixture-parentheses = false\nmark-parentheses = false\n\n[tool.ruff.lint.flake8-tidy-imports.banned-api]\n\"async_timeout\".msg = \"use asyncio.timeout instead\"\n\"pytz\".msg = \"use zoneinfo instead\"\n\n[tool.ruff.lint.isort]\nforce-sort-within-sections = true\nknown-first-party = [\n    \"homeassistant\",\n]\ncombine-as-imports = true\nsplit-on-trailing-comma = false\n\n[tool.ruff.lint.per-file-ignores]\n\n# Allow for main entry & scripts to write to stdout\n\"script/*\" = [\"T20\"]\n#\"script/burp-*\" = [\"W410\"]\n\n# Allow relative imports within auth and within components\n\"custom_components/*/*/*\" = [\"TID252\"]\n\n# Temporary\n\"tests/**\" = [\"PTH\"]\n\n\"custom_components/mbapi2020/proto/*.py\" = [\"F401\"]  # Alle .py-Dateien im src-Verzeichnis\n\n[tool.ruff.lint.mccabe]\nmax-complexity = 25\n\n[tool.ruff.lint.pydocstyle]\nproperty-decorators = [\"propcache.cached_property\"]\n\n"
  },
  {
    "path": "requirements.txt",
    "content": "protobuf>=3.19.1\npre-commit"
  },
  {
    "path": "scripts/burp-redirector.py",
    "content": "from burp import IBurpExtender, IHttpListener\n\nHOST_TO = \"localhost\"\n\nSERVER_PORT_MAP = {\n    \"bff.emea-prod.mobilesdk.mercedes-benz.com\": 8002,\n    \"websocket.emea-prod.mobilesdk.mercedes-benz.com\": 8001,\n}\n\n\nclass BurpExtender(IBurpExtender, IHttpListener):\n    #\n    # implement IBurpExtender\n    #\n\n    def registerExtenderCallbacks(self, callbacks):\n        # obtain an extension helpers object\n        self._helpers = callbacks.getHelpers()\n\n        # set our extension name\n        callbacks.setExtensionName(\"MB Traffic redirector\")\n\n        # register ourselves as an HTTP listener\n        callbacks.registerHttpListener(self)\n\n    #\n    # implement IHttpListener\n    #\n\n    def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):\n        # only process requests\n        if not messageIsRequest:\n            return\n\n        # get the HTTP service for the request\n        httpService = messageInfo.getHttpService()\n\n        host = httpService.getHost()\n\n        if host in SERVER_PORT_MAP:\n            messageInfo.setHttpService(\n                self._helpers.buildHttpService(HOST_TO, SERVER_PORT_MAP.get(host), httpService.getProtocol())\n            )\n"
  },
  {
    "path": "scripts/https-bff.py",
    "content": "from http.server import HTTPServer, SimpleHTTPRequestHandler\nimport logging\nimport os\nfrom pathlib import Path\nimport ssl\nimport sys\n\nLOGGER = logging.getLogger(__package__)\n\n\nclass SecureHTTPRequestHandler(SimpleHTTPRequestHandler):\n    \"\"\"Überschreibt die Methode, um das Basisverzeichnis anzupassen.\"\"\"\n\n    def translate_path(self, path):\n        \"\"\"Basisverzeichnis für Dateien.\"\"\"\n        base_directory = \"../local\"\n\n        # Anhängen von \".json\", wenn der Path keine Dateiendung enthält\n        if not Path(path).suffix:  # Kein \".\" in der Datei\n            path += \".json\"\n\n        # Normalisierung des Pfads\n        path = super().translate_path(path)\n\n        # Ersetzen des Basisverzeichnisses durch das angegebene\n        relative_path = os.path.relpath(path, Path.cwd())\n        LOGGER.debug(\"request %s\", Path(base_directory) / relative_path)\n        return Path(base_directory) / relative_path\n\n\ndef set_logger():\n    \"\"\"Set Logger properties.\"\"\"\n\n    fmt = \"%(asctime)s.%(msecs)03d %(levelname)s (%(threadName)s) [%(name)s] %(message)s\"\n    LOGGER.setLevel(logging.DEBUG)\n\n    handler = logging.StreamHandler(sys.stdout)\n    handler.setLevel(logging.DEBUG)\n    formatter = logging.Formatter(fmt)\n    handler.setFormatter(formatter)\n    LOGGER.addHandler(handler)\n\n\ndef start_server(host=\"127.0.0.1\", port=8002, certfile=\"../local/selfsigned.crt\", keyfile=\"../local/selfsigned.key\"):\n    \"\"\"HTTPS-Server mit dem spezifizierten Handler.\"\"\"\n    httpd = HTTPServer((host, port), SecureHTTPRequestHandler)\n\n    # SSL-Kontext erstellen\n    ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)\n    ssl_context.load_cert_chain(certfile=certfile, keyfile=keyfile)\n\n    # Socket mit SSL-Kontext umschließen\n    httpd.socket = ssl_context.wrap_socket(httpd.socket, server_side=True)\n\n    LOGGER.debug(\"HTTPS-Server gestartet auf https://%s:%s\", host, port)\n    LOGGER.debug(\"Daten werden aus dem Verzeichnis ../local geladen.\")\n    httpd.serve_forever()\n\n\nif __name__ == \"__main__\":\n    start_server()\n"
  },
  {
    "path": "scripts/https-ws-case-429.py",
    "content": "\"\"\"Simple HTTP Server to simulate http429.\"\"\"\n\nfrom __future__ import annotations\n\nfrom http.server import BaseHTTPRequestHandler, HTTPServer\nimport logging\nimport ssl\nimport sys\nfrom urllib.parse import urlparse\n\nHTTP_SERVER_IP = \"0.0.0.0\"\nHTTP_SERVER_PORT = 8001\nLOGGER = logging.getLogger(__package__)\n\n\nclass MBAPI2020SimulatorServer(BaseHTTPRequestHandler):\n    \"\"\"Simple HTTP Server to simulate the MBAPI2020 API.\"\"\"\n\n    def do_GET(self):\n        \"\"\"Answer get requests.\"\"\"\n\n        parsed = urlparse(self.path)\n        if parsed.path == \"/v2/ws\":\n            self.send_response(429)\n            self.send_header(\"Content-type\", \"\")\n            self.end_headers()\n            self.wfile.write(\"\".encode(\"utf-8\"))\n            return\n\n    def do_POST(self):\n        \"\"\"Answer post requests.\"\"\"\n        self.do_GET()\n\n\ndef set_logger():\n    \"\"\"Set Logger properties.\"\"\"\n\n    fmt = \"%(asctime)s.%(msecs)03d %(levelname)s (%(threadName)s) [%(name)s] %(message)s\"\n    LOGGER.setLevel(logging.DEBUG)\n\n    handler = logging.StreamHandler(sys.stdout)\n    handler.setLevel(logging.DEBUG)\n    formatter = logging.Formatter(fmt)\n    handler.setFormatter(formatter)\n    LOGGER.addHandler(handler)\n\n\nif __name__ == \"__main__\":\n    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)\n    context.load_cert_chain(certfile=\"../local/selfsigned.crt\", keyfile=\"../local/selfsigned.key\")\n    context.check_hostname = False\n\n    webServer = HTTPServer((HTTP_SERVER_IP, HTTP_SERVER_PORT), MBAPI2020SimulatorServer)\n    webServer.socket = context.wrap_socket(webServer.socket, server_side=True)\n\n    set_logger()\n\n    LOGGER.debug(\"Server started https://%s:%s\", HTTP_SERVER_IP, HTTP_SERVER_PORT)\n\n    webServer.serve_forever()\n    webServer.server_close()\n\n    LOGGER.debug(\"Server stopped.\")\n"
  },
  {
    "path": "scripts/setup",
    "content": "#!/usr/bin/env bash\n\nset -e\n\ncd \"$(dirname \"$0\")/..\"\nsudo apt-get update\nsudo apt-get install -y --no-install-recommends \\\n    libpcap-dev \\\n    libturbojpeg0\npython3 -m pip install --requirement requirements.txt\npre-commit install"
  },
  {
    "path": "token-requester/macOS/.gitignore",
    "content": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## User settings\nxcuserdata/\n\n## Obj-C/Swift specific\n*.hmap\n\n## App packaging\n*.ipa\n*.dSYM.zip\n*.dSYM\n\n## Playgrounds\ntimeline.xctimeline\nplayground.xcworkspace\n\n# Swift Package Manager\n#\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n# Package.pins\n# Package.resolved\n# *.xcodeproj\n#\n# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata\n# hence it is not needed unless you have added a package configuration file to your project\n# .swiftpm\n\n.build/\n\n# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control\n#\n# Pods/\n#\n# Add this line if you want to avoid checking in source code from the Xcode workspace\n# *.xcworkspace\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/Build/\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo.\n# Instead, use fastlane to re-generate the screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/#source-control\n\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots/**/*.png\nfastlane/test_output\n\n# General\n.DS_Store\n.AppleDouble\n.LSOverride\n\n# Icon must end with two \\r\nIcon\n\n# Thumbnails\n._*\n\n# Files that might appear in the root of a volume\n.DocumentRevisions-V100\n.fseventsd\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n.com.apple.timemachine.donotpresent\n\n# Directories potentially created on remote AFP share\n.AppleDB\n.AppleDesktop\nNetwork Trash Folder\nTemporary Items\n.apdisk"
  },
  {
    "path": "token-requester/macOS/MBAPI2020 Token Helper/MBAPI2020 Token Helper/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  MBAPI2020 Token Helper\n//\n//  Created by Rene Nulsch on 27.12.24.\n//\n\nimport Cocoa\n\n@main\nclass AppDelegate: NSObject, NSApplicationDelegate {\n\n    \n\n\n    func applicationDidFinishLaunching(_ aNotification: Notification) {\n        // Insert code here to initialize your application\n    }\n\n    func applicationWillTerminate(_ aNotification: Notification) {\n        // Insert code here to tear down your application\n    }\n\n    func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool {\n        return true\n    }\n\n\n}\n\n"
  },
  {
    "path": "token-requester/macOS/MBAPI2020 Token Helper/MBAPI2020 Token Helper/Assets.xcassets/AccentColor.colorset/Contents.json",
    "content": "{\n  \"colors\" : [\n    {\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "token-requester/macOS/MBAPI2020 Token Helper/MBAPI2020 Token Helper/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\"info\":{\"version\":1,\"author\":\"xcode\"},\"images\":[{\"scale\":\"1x\",\"size\":\"16x16\",\"filename\":\"mac16pt1x.png\",\"idiom\":\"mac\"},{\"idiom\":\"mac\",\"scale\":\"2x\",\"filename\":\"mac16pt2x.png\",\"size\":\"16x16\"},{\"size\":\"32x32\",\"idiom\":\"mac\",\"scale\":\"1x\",\"filename\":\"mac32pt1x.png\"},{\"size\":\"32x32\",\"idiom\":\"mac\",\"filename\":\"mac32pt2x.png\",\"scale\":\"2x\"},{\"size\":\"128x128\",\"scale\":\"1x\",\"filename\":\"mac128pt1x.png\",\"idiom\":\"mac\"},{\"idiom\":\"mac\",\"filename\":\"mac128pt2x.png\",\"scale\":\"2x\",\"size\":\"128x128\"},{\"scale\":\"1x\",\"size\":\"256x256\",\"idiom\":\"mac\",\"filename\":\"mac256pt1x.png\"},{\"idiom\":\"mac\",\"filename\":\"mac256pt2x.png\",\"size\":\"256x256\",\"scale\":\"2x\"},{\"scale\":\"1x\",\"filename\":\"mac512pt1x.png\",\"idiom\":\"mac\",\"size\":\"512x512\"},{\"size\":\"512x512\",\"filename\":\"mac512pt2x.png\",\"scale\":\"2x\",\"idiom\":\"mac\"}]}"
  },
  {
    "path": "token-requester/macOS/MBAPI2020 Token Helper/MBAPI2020 Token Helper/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "token-requester/macOS/MBAPI2020 Token Helper/MBAPI2020 Token Helper/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"23504\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"B8D-0N-5wS\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"23504\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n                        <items>\n                            <menuItem title=\"MBAPI2020 Token Helper\" id=\"1Xt-HY-uBw\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"MBAPI2020 Token Helper\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                                    <items>\n                                        <menuItem title=\"About MBAPI2020 Token Helper\" id=\"5kV-Vb-QxS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontStandardAboutPanel:\" target=\"Ady-hI-5gd\" id=\"Exp-CZ-Vem\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                                        <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                                        <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                                        <menuItem title=\"Hide MBAPI2020 Token Helper\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                            <connections>\n                                                <action selector=\"hide:\" target=\"Ady-hI-5gd\" id=\"PnN-Uc-m68\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"hideOtherApplications:\" target=\"Ady-hI-5gd\" id=\"VT4-aY-XCT\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"unhideAllApplications:\" target=\"Ady-hI-5gd\" id=\"Dhg-Le-xox\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                                        <menuItem title=\"Quit MBAPI2020 Token Helper\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                            <connections>\n                                                <action selector=\"terminate:\" target=\"Ady-hI-5gd\" id=\"Te7-pn-YzF\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                                    <items>\n                                        <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                            <connections>\n                                                <action selector=\"newDocument:\" target=\"Ady-hI-5gd\" id=\"4Si-XN-c54\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                            <connections>\n                                                <action selector=\"openDocument:\" target=\"Ady-hI-5gd\" id=\"bVn-NM-KNZ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                                <items>\n                                                    <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"clearRecentDocuments:\" target=\"Ady-hI-5gd\" id=\"Daa-9d-B3U\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                                        <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                            <connections>\n                                                <action selector=\"performClose:\" target=\"Ady-hI-5gd\" id=\"HmO-Ls-i7Q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                            <connections>\n                                                <action selector=\"saveDocument:\" target=\"Ady-hI-5gd\" id=\"teZ-XB-qJY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                            <connections>\n                                                <action selector=\"saveDocumentAs:\" target=\"Ady-hI-5gd\" id=\"mDf-zr-I0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Revert to Saved\" keyEquivalent=\"r\" id=\"KaW-ft-85H\">\n                                            <connections>\n                                                <action selector=\"revertDocumentToSaved:\" target=\"Ady-hI-5gd\" id=\"iJ3-Pv-kwq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                                        <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"runPageLayout:\" target=\"Ady-hI-5gd\" id=\"Din-rz-gC5\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                            <connections>\n                                                <action selector=\"print:\" target=\"Ady-hI-5gd\" id=\"qaZ-4w-aoO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                                    <items>\n                                        <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                            <connections>\n                                                <action selector=\"undo:\" target=\"Ady-hI-5gd\" id=\"M6e-cu-g7V\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                            <connections>\n                                                <action selector=\"redo:\" target=\"Ady-hI-5gd\" id=\"oIA-Rs-6OD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                                        <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                            <connections>\n                                                <action selector=\"cut:\" target=\"Ady-hI-5gd\" id=\"YJe-68-I9s\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                            <connections>\n                                                <action selector=\"copy:\" target=\"Ady-hI-5gd\" id=\"G1f-GL-Joy\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                            <connections>\n                                                <action selector=\"paste:\" target=\"Ady-hI-5gd\" id=\"UvS-8e-Qdg\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteAsPlainText:\" target=\"Ady-hI-5gd\" id=\"cEh-KX-wJQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"delete:\" target=\"Ady-hI-5gd\" id=\"0Mk-Ml-PaM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                            <connections>\n                                                <action selector=\"selectAll:\" target=\"Ady-hI-5gd\" id=\"VNm-Mi-diN\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                                        <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                                <items>\n                                                    <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"cD7-Qs-BN4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"WD3-Gg-5AJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"NDo-RZ-v9R\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"HOh-sY-3ay\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"U76-nv-p5D\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                                        <connections>\n                                                            <action selector=\"centerSelectionInVisibleArea:\" target=\"Ady-hI-5gd\" id=\"IOG-6D-g5B\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                                <items>\n                                                    <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                                        <connections>\n                                                            <action selector=\"showGuessPanel:\" target=\"Ady-hI-5gd\" id=\"vFj-Ks-hy3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                                        <connections>\n                                                            <action selector=\"checkSpelling:\" target=\"Ady-hI-5gd\" id=\"fz7-VC-reM\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                                    <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleContinuousSpellChecking:\" target=\"Ady-hI-5gd\" id=\"7w6-Qz-0kB\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleGrammarChecking:\" target=\"Ady-hI-5gd\" id=\"muD-Qn-j4w\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"Ady-hI-5gd\" id=\"2lM-Qi-WAP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                                <items>\n                                                    <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"orderFrontSubstitutionsPanel:\" target=\"Ady-hI-5gd\" id=\"oku-mr-iSq\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                                    <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleSmartInsertDelete:\" target=\"Ady-hI-5gd\" id=\"3IJ-Se-DZD\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"Ady-hI-5gd\" id=\"ptq-xd-QOA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDashSubstitution:\" target=\"Ady-hI-5gd\" id=\"oCt-pO-9gS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticLinkDetection:\" target=\"Ady-hI-5gd\" id=\"Gip-E3-Fov\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDataDetection:\" target=\"Ady-hI-5gd\" id=\"R1I-Nq-Kbl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticTextReplacement:\" target=\"Ady-hI-5gd\" id=\"DvP-Fe-Py6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                                <items>\n                                                    <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"uppercaseWord:\" target=\"Ady-hI-5gd\" id=\"sPh-Tk-edu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowercaseWord:\" target=\"Ady-hI-5gd\" id=\"iUZ-b5-hil\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"capitalizeWord:\" target=\"Ady-hI-5gd\" id=\"26H-TL-nsh\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                                <items>\n                                                    <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"startSpeaking:\" target=\"Ady-hI-5gd\" id=\"654-Ng-kyl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"stopSpeaking:\" target=\"Ady-hI-5gd\" id=\"dX8-6p-jy9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                                    <items>\n                                        <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                                <items>\n                                                    <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontFontPanel:\" target=\"YLy-65-1bz\" id=\"WHr-nq-2xA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"hqk-hr-sYV\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"IHV-OB-c03\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                                        <connections>\n                                                            <action selector=\"underline:\" target=\"Ady-hI-5gd\" id=\"FYS-2b-JAY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                                    <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"Uc7-di-UnL\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"HcX-Lf-eNd\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                                    <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardKerning:\" target=\"Ady-hI-5gd\" id=\"6dk-9l-Ckg\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffKerning:\" target=\"Ady-hI-5gd\" id=\"U8a-gz-Maa\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"tightenKerning:\" target=\"Ady-hI-5gd\" id=\"hr7-Nz-8ro\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"loosenKerning:\" target=\"Ady-hI-5gd\" id=\"8i4-f9-FKE\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardLigatures:\" target=\"Ady-hI-5gd\" id=\"7uR-wd-Dx6\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffLigatures:\" target=\"Ady-hI-5gd\" id=\"iX2-gA-Ilz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useAllLigatures:\" target=\"Ady-hI-5gd\" id=\"KcB-kA-TuK\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"unscript:\" target=\"Ady-hI-5gd\" id=\"0vZ-95-Ywn\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"superscript:\" target=\"Ady-hI-5gd\" id=\"3qV-fo-wpU\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"subscript:\" target=\"Ady-hI-5gd\" id=\"Q6W-4W-IGz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"raiseBaseline:\" target=\"Ady-hI-5gd\" id=\"4sk-31-7Q9\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"lowerBaseline:\" target=\"Ady-hI-5gd\" id=\"OF1-bc-KW4\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                                    <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontColorPanel:\" target=\"Ady-hI-5gd\" id=\"mSX-Xz-DV3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                                    <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyFont:\" target=\"Ady-hI-5gd\" id=\"GJO-xA-L4q\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteFont:\" target=\"Ady-hI-5gd\" id=\"JfD-CL-leO\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                                <items>\n                                                    <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                                        <connections>\n                                                            <action selector=\"alignLeft:\" target=\"Ady-hI-5gd\" id=\"zUv-R1-uAa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                                        <connections>\n                                                            <action selector=\"alignCenter:\" target=\"Ady-hI-5gd\" id=\"spX-mk-kcS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"alignJustified:\" target=\"Ady-hI-5gd\" id=\"ljL-7U-jND\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                                        <connections>\n                                                            <action selector=\"alignRight:\" target=\"Ady-hI-5gd\" id=\"r48-bG-YeY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                                    <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                            <items>\n                                                                <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"YGs-j5-SAR\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"qtV-5e-UBP\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"Lbh-J2-qVU\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"S0X-9S-QSf\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"jFq-tB-4Kx\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"5fk-qB-AqJ\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                                <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"Nop-cj-93Q\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"lPI-Se-ZHp\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"BgM-ve-c93\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"caW-Bv-w94\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"RB4-Sm-HuC\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"EXD-6r-ZUu\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                                    <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleRuler:\" target=\"Ady-hI-5gd\" id=\"FOx-HJ-KwY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyRuler:\" target=\"Ady-hI-5gd\" id=\"71i-fW-3W2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteRuler:\" target=\"Ady-hI-5gd\" id=\"cSh-wd-qM2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                                    <items>\n                                        <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleToolbarShown:\" target=\"Ady-hI-5gd\" id=\"BXY-wc-z0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"runToolbarCustomizationPalette:\" target=\"Ady-hI-5gd\" id=\"pQI-g3-MTW\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"hB3-LF-h0Y\"/>\n                                        <menuItem title=\"Show Sidebar\" keyEquivalent=\"s\" id=\"kIP-vf-haE\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleSidebar:\" target=\"Ady-hI-5gd\" id=\"iwa-gc-5KM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleFullScreen:\" target=\"Ady-hI-5gd\" id=\"dU3-MA-1Rq\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                                    <items>\n                                        <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                            <connections>\n                                                <action selector=\"performMiniaturize:\" target=\"Ady-hI-5gd\" id=\"VwT-WD-YPe\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"performZoom:\" target=\"Ady-hI-5gd\" id=\"DIl-cC-cCs\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                                        <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"arrangeInFront:\" target=\"Ady-hI-5gd\" id=\"DRN-fu-gQh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                                    <items>\n                                        <menuItem title=\"MBAPI2020 Token Helper Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                            <connections>\n                                                <action selector=\"showHelp:\" target=\"Ady-hI-5gd\" id=\"y7X-2Q-9no\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"MBAPI2020_Token_Helper\" customModuleProvider=\"target\"/>\n                <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"0.0\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"R2V-B0-nI4\">\n            <objects>\n                <windowController id=\"B8D-0N-5wS\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"IQv-IB-iLA\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n                        <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"300\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n                        <connections>\n                            <outlet property=\"delegate\" destination=\"B8D-0N-5wS\" id=\"98r-iN-zZc\"/>\n                        </connections>\n                    </window>\n                    <connections>\n                        <segue destination=\"XfG-lQ-9wD\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"cq2-FE-JQM\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Oky-zY-oP4\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"250\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"hIz-AP-VOD\">\n            <objects>\n                <viewController id=\"XfG-lQ-9wD\" customClass=\"ViewController\" customModule=\"MBAPI2020_Token_Helper\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"m2S-Jp-Qdl\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"300\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mQP-bT-8OO\">\n                                <rect key=\"frame\" x=\"162\" y=\"236\" width=\"156\" height=\"32\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"Start Authentication\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"pda-wm-2PH\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"StartButton_click:\" target=\"XfG-lQ-9wD\" id=\"DD6-lh-Q3k\"/>\n                                </connections>\n                            </button>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"TxR-0b-KJx\">\n                                <rect key=\"frame\" x=\"18\" y=\"186\" width=\"91\" height=\"16\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Access Token:\" id=\"zt5-CI-kbs\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4e1-Lc-IhO\">\n                                <rect key=\"frame\" x=\"18\" y=\"121\" width=\"94\" height=\"16\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"Refresh Token:\" id=\"bPw-dk-hVp\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Nad-6E-HmH\">\n                                <rect key=\"frame\" x=\"20\" y=\"157\" width=\"368\" height=\"21\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"qPM-wD-oQe\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField focusRingType=\"none\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"tDt-GX-rbk\">\n                                <rect key=\"frame\" x=\"20\" y=\"92\" width=\"368\" height=\"21\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"uPw-DJ-2aM\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"h8O-sM-rLF\">\n                                <rect key=\"frame\" x=\"398\" y=\"150\" width=\"66\" height=\"32\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"Copy\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"ez6-ND-r3W\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"copyAccessTokenToClipboard:\" target=\"XfG-lQ-9wD\" id=\"6Sh-rs-S1S\"/>\n                                </connections>\n                            </button>\n                            <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4IP-h4-88l\">\n                                <rect key=\"frame\" x=\"398\" y=\"85\" width=\"66\" height=\"32\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"Copy\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"N2g-Tv-98b\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"copyRefreshTokenToClipboard:\" target=\"XfG-lQ-9wD\" id=\"c6K-mb-rLh\"/>\n                                </connections>\n                            </button>\n                            <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bPA-Gk-jjw\">\n                                <rect key=\"frame\" x=\"395\" y=\"16\" width=\"69\" height=\"32\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"Close\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"IfE-HP-shh\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"IBActionfunccloseApp_senderAnyNSApplicationsharedterminatenilcloseApp:\" target=\"XfG-lQ-9wD\" id=\"ppS-Xv-0a1\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                    </view>\n                    <connections>\n                        <outlet property=\"accessToken_textview\" destination=\"Nad-6E-HmH\" id=\"ILl-dn-A0q\"/>\n                        <outlet property=\"copyAccessToken\" destination=\"h8O-sM-rLF\" id=\"cpF-KY-M0Y\"/>\n                        <outlet property=\"copyRefreshToken\" destination=\"4IP-h4-88l\" id=\"3fF-F0-gwY\"/>\n                        <outlet property=\"label_at\" destination=\"TxR-0b-KJx\" id=\"92x-dQ-7mC\"/>\n                        <outlet property=\"label_rt\" destination=\"4e1-Lc-IhO\" id=\"6L1-Xd-KMt\"/>\n                        <outlet property=\"refreshToken_textview\" destination=\"tDt-GX-rbk\" id=\"60J-7r-dof\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"rPt-NT-nkU\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"668.5\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "token-requester/macOS/MBAPI2020 Token Helper/MBAPI2020 Token Helper/MBAPI2020_Token_Helper.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.app-sandbox</key>\n\t<true/>\n\t<key>com.apple.security.files.user-selected.read-only</key>\n\t<true/>\n\t<key>com.apple.security.network.client</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "token-requester/macOS/MBAPI2020 Token Helper/MBAPI2020 Token Helper/ViewController.swift",
    "content": "import Cocoa\nimport AuthenticationServices\nimport CryptoKit\n\nclass ViewController: NSViewController, ASWebAuthenticationPresentationContextProviding {\n    \n    @IBOutlet weak var label_rt: NSTextField!\n    @IBOutlet weak var label_at: NSTextField!\n    @IBOutlet weak var copyRefreshToken: NSButton!\n    @IBOutlet weak var copyAccessToken: NSButton!\n    @IBOutlet weak var refreshToken_textview: NSTextField!\n    @IBOutlet weak var accessToken_textview: NSTextField!\n    \n    var codeVerifier: String = \"\"\n    var authSession: ASWebAuthenticationSession? // Authentifizierungssession als Instanzvariable speichern\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        copyAccessToken.isHidden = true\n        copyRefreshToken.isHidden = true\n        refreshToken_textview.isHidden = true\n        accessToken_textview.isHidden = true\n        label_at.isHidden = true\n        label_rt.isHidden = true\n    }\n    \n    @IBAction func IBActionfunccloseApp_senderAnyNSApplicationsharedterminatenilcloseApp(_ sender: Any) {\n        NSApplication.shared.terminate(nil)\n    }\n\n    @IBAction func StartButton_click(_ sender: Any) {\n        startOAuthLogin()\n    }\n    \n    func showMessageBox(title: String) {\n        let alert = NSAlert()\n        alert.messageText = title\n        alert.alertStyle = .warning\n        alert.addButton(withTitle: \"OK\")\n        alert.runModal()\n    }\n    \n    func startOAuthLogin() {\n        codeVerifier = generateCodeVerifier()\n        guard let codeChallenge = generateCodeChallenge(from: codeVerifier) else {\n            showMessageBox(title: \"Fehler beim Generieren der Code Challenge\")\n            return\n        }\n\n        let authorizationEndpoint = \"https://id.mercedes-benz.com/as/authorization.oauth2\"\n        let clientID = \"62778dc4-1de3-44f4-af95-115f06a3a008\"\n        let redirectURI = \"rismycar://login-callback\"\n        let scope = \"email openid profile offline_access phone ciam-uid\"\n        let responseType = \"code\"\n        let codeChallengeMethod = \"S256\"\n        \n        var components = URLComponents(string: authorizationEndpoint)\n        components?.queryItems = [\n            URLQueryItem(name: \"response_type\", value: responseType),\n            URLQueryItem(name: \"client_id\", value: clientID),\n            URLQueryItem(name: \"redirect_uri\", value: redirectURI),\n            URLQueryItem(name: \"scope\", value: scope),\n            URLQueryItem(name: \"code_challenge\", value: codeChallenge),\n            URLQueryItem(name: \"code_challenge_method\", value: codeChallengeMethod)\n        ]\n\n        guard let authURL = components?.url else {\n            showMessageBox(title: \"Ungültige URL für OAuth-Login\")\n            return\n        }\n        \n        authSession = ASWebAuthenticationSession(url: authURL, callbackURLScheme: \"rismycar\") { [weak self] callbackURL, error in\n            guard let self = self else { return }\n            if let error = error {\n                self.showMessageBox(title: \"Fehler bei der Authentifizierung: \\(error.localizedDescription)\")\n                return\n            }\n            \n            guard let callbackURL = callbackURL,\n                  let components = URLComponents(url: callbackURL, resolvingAgainstBaseURL: false),\n                  let queryItems = components.queryItems,\n                  let code = queryItems.first(where: { $0.name == \"code\" })?.value else {\n                self.showMessageBox(title: \"Fehler beim Abrufen des Authorization Codes.\")\n                return\n            }\n            \n            self.exchangeCodeForToken(code: code, redirectURI: redirectURI)\n        }\n        \n        authSession?.presentationContextProvider = self\n        authSession?.start()\n    }\n    \n    func exchangeCodeForToken(code: String, redirectURI: String) {\n        let tokenEndpoint = \"https://id.mercedes-benz.com/as/token.oauth2\"\n        let clientID = \"62778dc4-1de3-44f4-af95-115f06a3a008\"\n        \n        guard let url = URL(string: tokenEndpoint) else {\n            showMessageBox(title: \"Ungültige Token-URL\")\n            return\n        }\n        \n        var request = URLRequest(url: url)\n        request.httpMethod = \"POST\"\n        request.setValue(\"application/x-www-form-urlencoded\", forHTTPHeaderField: \"Content-Type\")\n        \n        let bodyParameters = [\n            \"grant_type\": \"authorization_code\",\n            \"code\": code,\n            \"redirect_uri\": redirectURI,\n            \"client_id\": clientID,\n            \"code_verifier\": codeVerifier\n        ]\n        request.httpBody = bodyParameters.map { \"\\($0.key)=\\($0.value)\" }.joined(separator: \"&\").data(using: .utf8)\n        \n        URLSession.shared.dataTask(with: request) { [weak self] data, response, error in\n            guard let self = self else { return }\n            if let error = error {\n                self.showMessageBox(title: \"Fehler beim Abrufen des Tokens: \\(error.localizedDescription)\")\n                return\n            }\n            \n            guard let data = data else {\n                self.showMessageBox(title: \"Keine Daten vom Server erhalten.\")\n                return\n            }\n            \n            do {\n                if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any],\n                   let refreshToken = json[\"refresh_token\"] as? String,\n                   let accessToken = json[\"access_token\"] as? String {\n                    \n                    DispatchQueue.main.async { [weak self] in\n                        guard let self = self else { return }\n                        self.accessToken_textview.stringValue = accessToken\n                        self.refreshToken_textview.stringValue = refreshToken\n                        self.refreshToken_textview.isHidden = false\n                        self.accessToken_textview.isHidden = false\n                        self.copyAccessToken.isHidden = false\n                        self.copyRefreshToken.isHidden = false\n                        self.label_at.isHidden = false\n                        self.label_rt.isHidden = false\n                    }\n                } else {\n                    self.showMessageBox(title: \"Fehlende Token-Werte.\")\n                }\n            } catch {\n                self.showMessageBox(title: \"Fehler beim Verarbeiten der JSON-Daten: \\(error.localizedDescription)\")\n            }\n        }.resume()\n    }\n    \n    func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {\n        guard let window = self.view.window else {\n            fatalError(\"Window not available\")\n        }\n        return window\n    }\n    \n    func generateCodeVerifier() -> String {\n        let characters = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~\"\n        return String((0..<128).map { _ in characters.randomElement()! })\n    }\n    \n    func generateCodeChallenge(from verifier: String) -> String? {\n        guard let data = verifier.data(using: .utf8) else { return nil }\n        let hashed = SHA256.hash(data: data)\n        return Data(hashed).base64EncodedString()\n            .replacingOccurrences(of: \"+\", with: \"-\")\n            .replacingOccurrences(of: \"/\", with: \"_\")\n            .replacingOccurrences(of: \"=\", with: \"\")\n    }\n    @IBAction func copyAccessTokenToClipboard(_ sender: Any) {\n         // Hole den Text aus der NSTextView\n         let textToCopy = accessToken_textview.stringValue\n         \n         // Kopiere den Text in die Zwischenablage\n         let pasteboard = NSPasteboard.general\n         pasteboard.clearContents()\n         pasteboard.setString(textToCopy, forType: .string)\n         \n     }\n     \n     @IBAction func copyRefreshTokenToClipboard(_ sender: Any) {\n         // Hole den Text aus der NSTextView\n         let textToCopy = refreshToken_textview.stringValue\n         \n         // Kopiere den Text in die Zwischenablage\n         let pasteboard = NSPasteboard.general\n         pasteboard.clearContents()\n         pasteboard.setString(textToCopy, forType: .string)\n         \n     }\n}\n"
  },
  {
    "path": "token-requester/macOS/MBAPI2020 Token Helper/MBAPI2020 Token Helper.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 77;\n\tobjects = {\n\n/* Begin PBXFileReference section */\n\t\tA77B1D8E2D1F13C50021D982 /* MBAPI2020 Token Helper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"MBAPI2020 Token Helper.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFileSystemSynchronizedRootGroup section */\n\t\tA77B1D902D1F13C50021D982 /* MBAPI2020 Token Helper */ = {\n\t\t\tisa = PBXFileSystemSynchronizedRootGroup;\n\t\t\tpath = \"MBAPI2020 Token Helper\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXFileSystemSynchronizedRootGroup section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tA77B1D8B2D1F13C50021D982 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tA77B1D852D1F13C50021D982 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA77B1D902D1F13C50021D982 /* MBAPI2020 Token Helper */,\n\t\t\t\tA77B1D8F2D1F13C50021D982 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA77B1D8F2D1F13C50021D982 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA77B1D8E2D1F13C50021D982 /* MBAPI2020 Token Helper.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tA77B1D8D2D1F13C50021D982 /* MBAPI2020 Token Helper */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = A77B1D9D2D1F13C50021D982 /* Build configuration list for PBXNativeTarget \"MBAPI2020 Token Helper\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tA77B1D8A2D1F13C50021D982 /* Sources */,\n\t\t\t\tA77B1D8B2D1F13C50021D982 /* Frameworks */,\n\t\t\t\tA77B1D8C2D1F13C50021D982 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tfileSystemSynchronizedGroups = (\n\t\t\t\tA77B1D902D1F13C50021D982 /* MBAPI2020 Token Helper */,\n\t\t\t);\n\t\t\tname = \"MBAPI2020 Token Helper\";\n\t\t\tpackageProductDependencies = (\n\t\t\t);\n\t\t\tproductName = \"MBAPI2020 Token Helper\";\n\t\t\tproductReference = A77B1D8E2D1F13C50021D982 /* MBAPI2020 Token Helper.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tA77B1D862D1F13C50021D982 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1620;\n\t\t\t\tLastUpgradeCheck = 1620;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tA77B1D8D2D1F13C50021D982 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 16.2;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = A77B1D892D1F13C50021D982 /* Build configuration list for PBXProject \"MBAPI2020 Token Helper\" */;\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = A77B1D852D1F13C50021D982;\n\t\t\tminimizedProjectReferenceProxies = 1;\n\t\t\tpreferredProjectObjectVersion = 77;\n\t\t\tproductRefGroup = A77B1D8F2D1F13C50021D982 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tA77B1D8D2D1F13C50021D982 /* MBAPI2020 Token Helper */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tA77B1D8C2D1F13C50021D982 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tA77B1D8A2D1F13C50021D982 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\tA77B1D9B2D1F13C50021D982 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 15.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"DEBUG $(inherited)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tA77B1D9C2D1F13C50021D982 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 15.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tA77B1D9E2D1F13C50021D982 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"MBAPI2020 Token Helper/MBAPI2020_Token_Helper.entitlements\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 4;\n\t\t\t\tDEVELOPMENT_TEAM = 675LSN3VC2;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"MBAPI2020-Token-Helper-Info.plist\";\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"MBAPI2020 Token Helper\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.developer-tools\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainStoryboardFile = Main;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.5;\n\t\t\t\tMARKETING_VERSION = 1.5;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"de.nulsch.MBAPI2020-Token-Helper\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tA77B1D9F2D1F13C50021D982 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = \"MBAPI2020 Token Helper/MBAPI2020_Token_Helper.entitlements\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 4;\n\t\t\t\tDEVELOPMENT_TEAM = 675LSN3VC2;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = \"MBAPI2020-Token-Helper-Info.plist\";\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = \"MBAPI2020 Token Helper\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.developer-tools\";\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"\";\n\t\t\t\tINFOPLIST_KEY_NSMainStoryboardFile = Main;\n\t\t\t\tINFOPLIST_KEY_NSPrincipalClass = NSApplication;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.5;\n\t\t\t\tMARKETING_VERSION = 1.5;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"de.nulsch.MBAPI2020-Token-Helper\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tA77B1D892D1F13C50021D982 /* Build configuration list for PBXProject \"MBAPI2020 Token Helper\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tA77B1D9B2D1F13C50021D982 /* Debug */,\n\t\t\t\tA77B1D9C2D1F13C50021D982 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tA77B1D9D2D1F13C50021D982 /* Build configuration list for PBXNativeTarget \"MBAPI2020 Token Helper\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tA77B1D9E2D1F13C50021D982 /* Debug */,\n\t\t\t\tA77B1D9F2D1F13C50021D982 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = A77B1D862D1F13C50021D982 /* Project object */;\n}\n"
  },
  {
    "path": "token-requester/macOS/MBAPI2020 Token Helper/MBAPI2020 Token Helper.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "token-requester/macOS/MBAPI2020 Token Helper/MBAPI2020-Token-Helper-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleURLTypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Editor</string>\n\t\t\t<key>CFBundleURLName</key>\n\t\t\t<string>rismycar</string>\n\t\t\t<key>CFBundleURLSchemes</key>\n\t\t\t<array>\n\t\t\t\t<string>rismycar</string>\n\t\t\t</array>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "token-requester/net-core/mb-token-requester/CallbackManager.cs",
    "content": "﻿using System.IO.Pipes;\n\nnamespace mbtokenrequester\n{\n    class CallbackManager\n    {\n        private readonly string _name;\n\n        public CallbackManager(string name)\n        {\n            _name = name ?? throw new ArgumentNullException(nameof(name));\n        }\n\n        public int ClientConnectTimeoutSeconds { get; set; } = 1;\n\n        public async Task RunClient(string args)\n        {\n            using (var client = new NamedPipeClientStream(\".\", _name, PipeDirection.Out))\n            {\n                await client.ConnectAsync(ClientConnectTimeoutSeconds * 1000);\n\n                using (var sw = new StreamWriter(client) { AutoFlush = true })\n                {\n                    await sw.WriteAsync(args);\n                }\n            }\n        }\n\n        public async Task<string> RunServer(CancellationToken? token = null)\n        {\n            token = CancellationToken.None;\n\n            using (var server = new NamedPipeServerStream(_name, PipeDirection.In))\n            {\n                await server.WaitForConnectionAsync(token.Value);\n\n                using (var sr = new StreamReader(server))\n                {\n                    var msg = await sr.ReadToEndAsync();\n                    return msg;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "token-requester/net-core/mb-token-requester/DesktopEntryHandler.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Reflection;\nusing System.Runtime;\n\nnamespace mbtokenrequester\n{\n    [System.Runtime.Versioning.SupportedOSPlatform(\"linux\")]\n    class DesktopEntryHandler\n    {\n        public DesktopEntryHandler(string uriScheme)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "token-requester/net-core/mb-token-requester/Program.cs",
    "content": "﻿using IdentityModel.Client;\nusing IdentityModel.OidcClient;\nusing System.Diagnostics;\nusing System.Runtime.InteropServices;\nusing Serilog;\nusing Microsoft.Extensions.Configuration;\n\nnamespace mbtokenrequester\n{\n    class Program\n    {\n        private static IConfiguration Configuration;\n\n        static async Task Main(string[] args)\n        {\n            try\n            {\n\n                Configuration = new ConfigurationBuilder()\n                    .AddJsonFile(\"appsettings.json\")\n                    .Build();\n\n                Log.Logger = new LoggerConfiguration()\n                    .Enrich.FromLogContext()\n                    .ReadFrom.Configuration(Configuration)\n                    .CreateLogger();\n\n\n                if (args.Any())\n                {\n\n                    Log.Information($\"Args {args[0]}\");\n                    await ProcessCallback(args[0]);\n                }\n                else\n                {\n                    await Run();\n                }\n            }\n            catch (Exception ex)\n            {\n                Console.WriteLine(ex.Message);\n                Console.ReadLine();\n\n                //Log.Fatal(ex, \"Host terminated unexpectedly\");\n            }\n            finally\n            {\n                await Log.CloseAndFlushAsync();\n            }\n\n            //Console.ReadLine();\n        }\n\n        private static async Task ProcessCallback(string args)\n        {\n            Log.Information($\"Args: {args}\");\n            var response = new AuthorizeResponse(args);\n            if (!String.IsNullOrWhiteSpace(response.State))\n            {\n                Console.WriteLine($\"Found state: {response.State}\");\n                var callbackManager = new CallbackManager(response.State);\n                await callbackManager.RunClient(args);\n            }\n            else\n            {\n                Console.WriteLine(\"Error: no state on response\");\n            }\n        }\n\n\n\n        static async Task Run()\n        {\n            var CustomUriScheme = Configuration[\"AppSettings:CustomUriScheme\"];\n\n\n            if (OperatingSystem.IsWindows())\n            {\n                new RegistryConfig(CustomUriScheme).Configure();\n            }\n\n            Log.Information(\"+-----------------------+\");\n            Log.Information(\"|  Sign in with OIDC    |\");\n            Log.Information(\"+-----------------------+\");\n            Log.Information(\"\");\n            if (!OperatingSystem.IsMacOS())\n            {\n                Log.Information(\"Press any key to sign in...\");\n                Console.ReadKey();\n            }\n\n            Program p = new Program();\n            await p.SignIn();\n\n            if (OperatingSystem.IsWindows())\n            {\n                new RegistryConfig(CustomUriScheme).DeleteRegKeys();\n            }\n\n        }\n\n        private async Task SignIn()\n        {\n            // create a redirect URI using the custom redirect uri rismycar://login-callback\n            var CustomUriScheme = Configuration[\"AppSettings:CustomUriScheme\"];\n            string redirectUri = string.Format(CustomUriScheme + Configuration[\"AppSettings:uri-callback\"]);\n            Log.Information(\"redirect URI: \" + redirectUri);\n\n            // HttpClientHandler handler = new HttpClientHandler();\n            // handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;\n\n            var options = new OidcClientOptions\n            {\n                Authority = Configuration[\"AppSettings:Authority\"],\n                ClientId = Configuration[\"AppSettings:ClientId\"],\n                Scope = Configuration[\"AppSettings:Scope\"],\n                RedirectUri = redirectUri,\n                DisablePushedAuthorization = true,\n                // BackchannelHandler = handler,\n            };\n\n            Log.Information(options.ToString());\n\n            var client = new OidcClient(options);\n            var state = await client.PrepareLoginAsync();\n\n            Log.Information($\"Start URL: {state.StartUrl}\");\n\n            var callbackManager = new CallbackManager(state.State);\n\n\n            // open system browser to start authentication\n            Process.Start(new ProcessStartInfo\n            {\n                FileName = state.StartUrl,\n                UseShellExecute = true\n            });\n\n            Log.Information(\"Running callback manager\");\n            var response = await callbackManager.RunServer();\n\n            Log.Information($\"Response from authorize endpoint: {response}\");\n\n            // Brings the Console to Focus.\n            if (OperatingSystem.IsWindows())\n            {\n                BringConsoleToFront();\n            }\n\n            var result = await client.ProcessResponseAsync(response, state);\n\n            if (OperatingSystem.IsWindows())\n            {\n                BringConsoleToFront();\n            }\n\n            if (result.IsError)\n            {\n                Log.Error(\"\\n\\nError:\\n{0}\", result.Error);\n            }\n            else\n            {\n                Log.Information(\"\\n\\nClaims:\");\n                foreach (var claim in result.User.Claims)\n                {\n                    Log.Information(\"{0}: {1}\", claim.Type, claim.Value);\n                }\n\n                Console.WriteLine();\n                Log.Information(\"Access token:\\n{0}\", result.AccessToken);\n                Console.WriteLine();\n\n                if (!string.IsNullOrWhiteSpace(result.RefreshToken))\n                {\n                    Log.Information(\"Refresh token:\\n{0}\", result.RefreshToken);\n                }\n\n                Console.WriteLine();\n                Console.WriteLine(\"Press any key to close the app...\");\n                Console.ReadLine();\n            }\n        }\n\n        // Hack to bring the Console window to front.\n        // ref: http://stackoverflow.com/a/12066376\n        [DllImport(\"kernel32.dll\", ExactSpelling = true)]\n        [System.Runtime.Versioning.SupportedOSPlatform(\"windows\")]\n        public static extern IntPtr GetConsoleWindow();\n\n        [DllImport(\"user32.dll\")]\n        [return: MarshalAs(UnmanagedType.Bool)]\n        [System.Runtime.Versioning.SupportedOSPlatform(\"windows\")]\n        public static extern bool SetForegroundWindow(IntPtr hWnd);\n\n        [System.Runtime.Versioning.SupportedOSPlatform(\"windows\")]\n        public void BringConsoleToFront()\n        {\n            SetForegroundWindow(GetConsoleWindow());\n        }\n    }\n}"
  },
  {
    "path": "token-requester/net-core/mb-token-requester/RegistryConfig.cs",
    "content": "﻿using System.Reflection;\nusing Microsoft.Win32;\nusing System.Runtime;\n\nnamespace mbtokenrequester\n{\n    [System.Runtime.Versioning.SupportedOSPlatform(\"windows\")]\n    class RegistryConfig\n    {\n        public RegistryConfig(string uriScheme)\n        {\n            CustomUriScheme = uriScheme;\n        }\n\n        public void Configure()\n        {\n            if (NeedToAddKeys()) AddRegKeys();\n        }\n\n        public void DeleteRegKeys()\n        {\n            using (var classesKey = Registry.CurrentUser.OpenSubKey(RootKeyPath, true))\n            {\n                if (classesKey?.OpenSubKey(CustomUriScheme) != null)\n                {\n                    classesKey.DeleteSubKeyTree(CustomUriScheme, false);\n                }\n            }\n        }\n\n        private string CustomUriScheme { get; }\n\n        string CustomUriSchemeKeyPath => RootKeyPath + @\"\\\" + CustomUriScheme;\n        string CustomUriSchemeKeyValueValue => \"URL:\" + CustomUriScheme;\n        string CommandKeyPath => CustomUriSchemeKeyPath + @\"\\shell\\open\\command\";\n\n        const string RootKeyPath = @\"Software\\Classes\";\n\n        const string CustomUriSchemeKeyValueName = \"\";\n        const string ShellKeyName = \"shell\";\n        const string OpenKeyName = \"open\";\n        const string CommandKeyName = \"command\";\n        const string CommandKeyValueName = \"\";\n        const string CommandKeyValueFormat = \"\\\"{0}\\\\callback.bat\\\" \\\"%1\\\"\";\n        static string CommandKeyValueValue => string.Format(CommandKeyValueFormat, Path.GetDirectoryName(System.AppContext.BaseDirectory));\n\n        const string UrlProtocolValueName = \"URL Protocol\";\n        const string UrlProtocolValueValue = \"\";\n\n        bool NeedToAddKeys()\n        {\n            var addKeys = false;\n\n            using (var commandKey = Registry.CurrentUser.OpenSubKey(CommandKeyPath))\n            {\n                var commandValue = commandKey?.GetValue(CommandKeyValueName);\n                addKeys |= !CommandKeyValueValue.Equals(commandValue);\n            }\n\n            using (var customUriSchemeKey = Registry.CurrentUser.OpenSubKey(CustomUriSchemeKeyPath))\n            {\n                var uriValue = customUriSchemeKey?.GetValue(CustomUriSchemeKeyValueName);\n                var protocolValue = customUriSchemeKey?.GetValue(UrlProtocolValueName);\n                addKeys |= !CustomUriSchemeKeyValueValue.Equals(uriValue);\n                addKeys |= !UrlProtocolValueValue.Equals(protocolValue);\n            }\n\n            return addKeys;\n        }\n\n        void AddRegKeys()\n        {\n            using (var classesKey = Registry.CurrentUser.OpenSubKey(RootKeyPath, true))\n            {\n                using (var root = classesKey!.OpenSubKey(CustomUriScheme, true) ??\n                    classesKey.CreateSubKey(CustomUriScheme, true))\n                {\n                    root.SetValue(CustomUriSchemeKeyValueName, CustomUriSchemeKeyValueValue);\n                    root.SetValue(UrlProtocolValueName, UrlProtocolValueValue);\n\n                    using (var shell = root.OpenSubKey(ShellKeyName, true) ??\n                            root.CreateSubKey(ShellKeyName, true))\n                    {\n                        using (var open = shell.OpenSubKey(OpenKeyName, true) ??\n                                shell.CreateSubKey(OpenKeyName, true))\n                        {\n                            using (var command = open.OpenSubKey(CommandKeyName, true) ??\n                                    open.CreateSubKey(CommandKeyName, true))\n                            {\n                                command.SetValue(CommandKeyValueName, CommandKeyValueValue);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "token-requester/net-core/mb-token-requester/appsettings.json",
    "content": "{\n    \"AppSettings\": {\n        \"Authority\": \"https://id.mercedes-benz.com/\",\n        \"ClientId\": \"62778dc4-1de3-44f4-af95-115f06a3a008\",\n        \"CustomUriScheme\": \"rismycar\",\n        \"Scope\": \"openid email phone profile offline_access ciam-uid\",\n        \"uri-callback\": \"://login-callback\"\n    },\n    \"Logging\": {\n        \"LogLevel\": {\n            \"Default\": \"Debug\"\n        }\n    },\n    \"Serilog\": {\n        \"Using\":  [ \"Serilog.Sinks.Console\", \"Serilog.Sinks.File\" ],\n        \"WriteTo\": [\n            //{\n            //    \"Name\": \"File\",\n            //    \"Args\": {\n            //        \"path\": \"log.txt\",\n            //        \"rollingInterval\": \"Day\",\n            //        \"shared\": true\n            //    }\n            //},\n            {\"Name\": \"Console\"}\n        ]\n    }\n}"
  },
  {
    "path": "token-requester/net-core/mb-token-requester/callback.bat",
    "content": "@echo off\n\"%~dp0mb-token-requester.exe\" %*\n"
  },
  {
    "path": "token-requester/net-core/mb-token-requester/mb-shortcut-handler.desktop",
    "content": "[Desktop Entry]\nVersion=1.0\nType=Application\nName=MBTockenCreator\nExec=~/temp/linux-x64/mb-token-requester %u\nIcon=\nMimeType=x-scheme-handler/rismycar;\nTerminal=True"
  },
  {
    "path": "token-requester/net-core/mb-token-requester/mb-token-requester.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n\t<PropertyGroup>\n\t\t<OutputType>Exe</OutputType>\n\t\t<TargetFramework>net8.0</TargetFramework>\n\t\t<ImplicitUsings>enable</ImplicitUsings>\n\t\t<Nullable>enable</Nullable>\n\t\t<PublishSingleFile>True</PublishSingleFile>\n\t\t<Platforms>AnyCPU;x64</Platforms>\n\t\t<RuntimeIdentifiers>\n\t\t\twin-x64;win-arm64;linux-x64\n\t\t</RuntimeIdentifiers>\n\n\t\t<PackageDir Condition=\"'$(PackageDir)' == ''\">$([System.IO.Path]::Combine($(OutputPath),'package'))/</PackageDir>\n\t\t<PackagePath Condition=\"'$(PackagePath)' == ''\">$([System.IO.Path]::Combine($(PackageDir),'publish.zip'))</PackagePath>\n\t</PropertyGroup>\n\t<Target Name=\"Package\" DependsOnTargets=\"Publish\">\n\t\t<MakeDir Directories=\"$(PackageDir)\" />\n\t\t<ZipDirectory Overwrite=\"true\" SourceDirectory=\"$(MSBuildProjectDirectory)/$(PublishDir)\" DestinationFile=\"$(PackagePath)\" />\n\t</Target>\n\t<Target Name=\"PackageClean\" AfterTargets=\"Clean\">\n\t\t<Delete Files=\"$(PackagePath)\" />\n\t</Target>\n\t<ItemGroup>\n\t\t<PackageReference Include=\"IdentityModel.OidcClient\" Version=\"6.0.0\" />\n\t\t<PackageReference Include=\"Microsoft.Extensions.Configuration\" Version=\"8.0.0\" />\n\t\t<PackageReference Include=\"Microsoft.Extensions.Configuration.json\" Version=\"8.0.1\" />\n\t\t<PackageReference Include=\"Serilog.Extensions.Hosting\" Version=\"8.0.0\" />\n\t\t<PackageReference Include=\"Serilog.Settings.Configuration\" Version=\"8.0.4\" />\n\t\t<PackageReference Include=\"Serilog.Sinks.Console\" Version=\"6.0.0\" />\n\t\t<PackageReference Include=\"Serilog.Sinks.File\" Version=\"6.0.0\" />\n\t\t<None Update=\"appsettings.json\">\n\t\t\t<CopyToOutputDirectory>Always</CopyToOutputDirectory>\n\t\t</None>\n\t\t<None Update=\"callback.bat\">\n\t\t\t<CopyToOutputDirectory>Never</CopyToOutputDirectory>\n\t\t</None>\n\t</ItemGroup>\n\t<ItemGroup Condition=\"'$(RuntimeIdentifier)' == 'linux-x64'\">\n\t\t<None Update=\"mb-shortcut-handler.desktop\">\n\t\t\t<CopyToOutputDirectory>Always</CopyToOutputDirectory>\n\t\t</None>\n\t</ItemGroup>\n\t<ItemGroup Condition=\"'$(RuntimeIdentifier)' == 'win-x64'\">\n\t\t<None Update=\"callback.bat\">\n\t\t\t<CopyToOutputDirectory>Always</CopyToOutputDirectory>\n\t\t</None>\n\t</ItemGroup>\n\t<ItemGroup Condition=\"'$(RuntimeIdentifier)' == 'win-arm64'\">\n\t\t<None Update=\"callback.bat\">\n\t\t\t<CopyToOutputDirectory>Always</CopyToOutputDirectory>\n\t\t</None>\n\t</ItemGroup>\n</Project>\n"
  },
  {
    "path": "token-requester/net-core/mb-token-requester/mb-token-requester.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.12.35527.113\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"mb-token-requester\", \"mb-token-requester.csproj\", \"{2A5E7CF4-5871-4827-AFEA-106A83367680}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{2A5E7CF4-5871-4827-AFEA-106A83367680}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2A5E7CF4-5871-4827-AFEA-106A83367680}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2A5E7CF4-5871-4827-AFEA-106A83367680}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{2A5E7CF4-5871-4827-AFEA-106A83367680}.Debug|x64.Build.0 = Debug|x64\n\t\t{2A5E7CF4-5871-4827-AFEA-106A83367680}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2A5E7CF4-5871-4827-AFEA-106A83367680}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2A5E7CF4-5871-4827-AFEA-106A83367680}.Release|x64.ActiveCfg = Release|x64\n\t\t{2A5E7CF4-5871-4827-AFEA-106A83367680}.Release|x64.Build.0 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  }
]