Full Code of jasonacox/pypowerwall for AI

main 51b5032ce06d cached
280 files
13.1 MB
3.4M tokens
5815 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (14,044K chars total). Download the full file to get everything.
Repository: jasonacox/pypowerwall
Branch: main
Commit: 51b5032ce06d
Files: 280
Total size: 13.1 MB

Directory structure:
gitextract_ladqec0m/

├── .flake8
├── .github/
│   └── workflows/
│       ├── check-protobuf.yml
│       ├── jekyll-gh-pages.yml
│       ├── pwsim-docker.yml
│       ├── pylint.yml
│       ├── simtest.yml
│       └── test.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .pylintrc
├── API.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── RELEASE.md
├── _config.yml
├── api_test.py
├── dashboard/
│   └── README.md
├── docs/
│   ├── README.md
│   ├── api.txt
│   ├── reference/
│   │   ├── alerts.md
│   │   ├── devices.md
│   │   └── firmware-history.md
│   ├── vitals-example-failed-pw.json
│   ├── vitals-example-latest.json
│   └── vitals-example.json
├── example-cloud-mode.py
├── example.py
├── examples/
│   ├── network_route.py
│   ├── vitals/
│   │   ├── README.md
│   │   ├── pull_vitals.py
│   │   ├── tesla.proto
│   │   └── tesla_pb2.py
│   └── vitals.py
├── proxy/
│   ├── .dockerignore
│   ├── API.md
│   ├── Dockerfile
│   ├── Dockerfile.beta
│   ├── HELP.md
│   ├── README.md
│   ├── RELEASE.md
│   ├── __init__.py
│   ├── beta.txt
│   ├── localhost.pem
│   ├── perf_test.py
│   ├── requirements.txt
│   ├── server.py
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── test_api_endpoints.py
│   │   └── test_csv_endpoints.py
│   ├── transform.py
│   ├── upload-beta.sh
│   └── web/
│       ├── LICENSE
│       ├── bogus/
│       │   ├── api.auth.toggle.supported.json
│       │   ├── api.customer.json
│       │   ├── api.customer.registration.json
│       │   ├── api.installer.json
│       │   ├── api.meters.aggregates.json
│       │   ├── api.meters.json
│       │   ├── api.meters.readings.json
│       │   ├── api.meters.site.json
│       │   ├── api.meters.solar.json
│       │   ├── api.networks.json
│       │   ├── api.operation.json
│       │   ├── api.powerwalls.json
│       │   ├── api.site_info.grid_codes.json
│       │   ├── api.site_info.json
│       │   ├── api.site_info.site_name.json
│       │   ├── api.sitemaster.json
│       │   ├── api.solars.brands.json
│       │   ├── api.solars.json
│       │   ├── api.status.json
│       │   ├── api.synchrometer.ct_voltage_references.json
│       │   ├── api.system.networks.json
│       │   ├── api.system.update.status.json
│       │   ├── api.system_status.grid_faults.json
│       │   ├── api.system_status.grid_status.json
│       │   ├── api.system_status.grid_status.json-offline
│       │   ├── api.system_status.grid_status.json-transition
│       │   ├── api.system_status.json
│       │   ├── api.system_status.soe.json
│       │   └── api.troubleshooting.problems.json
│       ├── example.html
│       ├── index.html
│       └── viz-static/
│           ├── 1.17c71172308436a079d1.js
│           ├── 124f233cfa9945f861dcaca7acedd308.otf
│           ├── 2bf15a1686c7a1bf7b577337a07d7049.otf
│           ├── 39.17c71172308436a079d1.js
│           ├── 40.17c71172308436a079d1.js
│           ├── 653969a51632a4df33358a39d7012f79.otf
│           ├── 722c5f898bbca8b2eb3fce0287688326.otf
│           ├── 86a6894da889a3db781418529403290f.otf
│           ├── 89aec2cc0b804667e95b1adc02e1ac4a.otf
│           ├── a3b0d611359e6fa8356cd88aa9035268.otf
│           ├── ac2944015a17576924af7c56d88751cb.otf
│           ├── app.css
│           ├── app.js
│           ├── b8d72cb0ef934ba1fe847c692d9dfed1.otf
│           ├── bceda3fae660177ae570735feec62811.otf
│           ├── befdfda70624c396169873b05de57f8a.otf
│           ├── black.js
│           ├── clear.js
│           ├── d859fee2eba0e67c75c4c92e719d0630.otf
│           ├── dakboard.js
│           ├── e19c20e966bde501f94e41cd0322dbe8.otf
│           ├── ec6b35b07448e1624cb09323b5fb6e32.otf
│           ├── ec89c09b066f57efc7687540c998845b.otf
│           ├── eca1317ee8a99162d0d0e2df77330cec.otf
│           ├── grafana-dark.js
│           ├── grafana.js
│           ├── solar.js
│           ├── vendor.js
│           └── white.js
├── pwsimulator/
│   ├── Dockerfile
│   ├── README.md
│   ├── control.html
│   ├── localhost.pem
│   ├── stub.py
│   ├── tedapi_pb2.py
│   ├── test.py
│   ├── test.sh
│   └── test_tedapi.py
├── pypowerwall/
│   ├── __init__.py
│   ├── __main__.py
│   ├── api_lock.py
│   ├── cloud/
│   │   ├── __init__.py
│   │   ├── decorators.py
│   │   ├── exceptions.py
│   │   ├── mock_data.py
│   │   ├── pypowerwall_cloud.py
│   │   ├── stubs.py
│   │   └── teslapy/
│   │       ├── LICENSE
│   │       ├── README.md
│   │       ├── __init__.py
│   │       ├── endpoints.json
│   │       ├── option_codes.json
│   │       └── requirements.txt
│   ├── exceptions.py
│   ├── fleetapi/
│   │   ├── __init__.py
│   │   ├── __main__.py
│   │   ├── decorators.py
│   │   ├── exceptions.py
│   │   ├── fleetapi.py
│   │   ├── mock_data.py
│   │   ├── pypowerwall_fleetapi.py
│   │   └── stubs.py
│   ├── local/
│   │   ├── __init__.py
│   │   ├── exceptions.py
│   │   ├── pypowerwall_local.py
│   │   └── tesla_pb2.py
│   ├── pypowerwall_base.py
│   ├── regex.py
│   ├── scan.py
│   ├── tedapi/
│   │   ├── __init__.py
│   │   ├── __main__.py
│   │   ├── decorators.py
│   │   ├── exceptions.py
│   │   ├── mock_data.py
│   │   ├── pypowerwall_tedapi.py
│   │   ├── stubs.py
│   │   ├── tedapi.proto
│   │   ├── tedapi_combined.proto
│   │   ├── tedapi_combined_pb2.py
│   │   ├── tedapi_pb2.py
│   │   └── tedapi_v1r.py
│   ├── tesla_auth.py
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── tedapi/
│   │   │   ├── __init__.py
│   │   │   └── test_init.py
│   │   ├── test_live_modes.py
│   │   ├── test_mode_selection.py
│   │   ├── test_powerwall.py
│   │   └── unit/
│   │       ├── __init__.py
│   │       ├── test_cli_tedapi.py
│   │       ├── test_parse_version.py
│   │       └── test_powerwall_core.py
│   └── v1r_register.py
├── pytest.ini
├── requirements.txt
├── setup.py
├── tesla.proto
├── test.py
├── test_requirements.txt
├── tools/
│   ├── README.md
│   ├── cron.sh
│   ├── fleetapi/
│   │   ├── README.md
│   │   ├── create_pem_key.py
│   │   ├── fleetapi.py
│   │   ├── index.html
│   │   ├── live.py
│   │   ├── setup.py
│   │   └── test.py
│   ├── gen_proto.sh
│   ├── nws.py
│   ├── requirements-tools.txt
│   ├── server/
│   │   ├── .gitignore
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   ├── app/
│   │   │   ├── __init__.py
│   │   │   ├── api/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── aggregates.py
│   │   │   │   ├── gateways.py
│   │   │   │   ├── legacy.py
│   │   │   │   └── websockets.py
│   │   │   ├── config.py
│   │   │   ├── core/
│   │   │   │   ├── __init__.py
│   │   │   │   └── gateway_manager.py
│   │   │   ├── main.py
│   │   │   ├── models/
│   │   │   │   ├── __init__.py
│   │   │   │   └── gateway.py
│   │   │   ├── static/
│   │   │   │   ├── example.html
│   │   │   │   ├── index.html
│   │   │   │   └── viz-static/
│   │   │   │       ├── 1.17c71172308436a079d1.js
│   │   │   │       ├── 124f233cfa9945f861dcaca7acedd308.otf
│   │   │   │       ├── 2bf15a1686c7a1bf7b577337a07d7049.otf
│   │   │   │       ├── 39.17c71172308436a079d1.js
│   │   │   │       ├── 40.17c71172308436a079d1.js
│   │   │   │       ├── 653969a51632a4df33358a39d7012f79.otf
│   │   │   │       ├── 722c5f898bbca8b2eb3fce0287688326.otf
│   │   │   │       ├── 86a6894da889a3db781418529403290f.otf
│   │   │   │       ├── 89aec2cc0b804667e95b1adc02e1ac4a.otf
│   │   │   │       ├── a3b0d611359e6fa8356cd88aa9035268.otf
│   │   │   │       ├── ac2944015a17576924af7c56d88751cb.otf
│   │   │   │       ├── app.css
│   │   │   │       ├── app.js
│   │   │   │       ├── b8d72cb0ef934ba1fe847c692d9dfed1.otf
│   │   │   │       ├── bceda3fae660177ae570735feec62811.otf
│   │   │   │       ├── befdfda70624c396169873b05de57f8a.otf
│   │   │   │       ├── black.js
│   │   │   │       ├── clear.js
│   │   │   │       ├── d859fee2eba0e67c75c4c92e719d0630.otf
│   │   │   │       ├── dakboard.js
│   │   │   │       ├── e19c20e966bde501f94e41cd0322dbe8.otf
│   │   │   │       ├── ec6b35b07448e1624cb09323b5fb6e32.otf
│   │   │   │       ├── ec89c09b066f57efc7687540c998845b.otf
│   │   │   │       ├── eca1317ee8a99162d0d0e2df77330cec.otf
│   │   │   │       ├── grafana-dark.js
│   │   │   │       ├── grafana.js
│   │   │   │       ├── solar.js
│   │   │   │       ├── vendor.js
│   │   │   │       └── white.js
│   │   │   └── utils/
│   │   │       ├── __init__.py
│   │   │       └── transform.py
│   │   ├── docker-compose.yml
│   │   ├── pytest.ini
│   │   ├── requirements-dev.txt
│   │   ├── requirements.txt
│   │   ├── run.sh
│   │   └── tests/
│   │       ├── __init__.py
│   │       ├── conftest.py
│   │       ├── test_api_aggregates.py
│   │       ├── test_api_gateways.py
│   │       ├── test_api_legacy.py
│   │       ├── test_basic.py
│   │       ├── test_config.py
│   │       ├── test_edge_cases.py
│   │       └── test_gateway_manager.py
│   ├── set-mode.py
│   ├── set-reserve.py
│   ├── tedapi/
│   │   ├── ComponentsQuery.py
│   │   ├── PW3_Strings.py
│   │   ├── PW3_Vitals.py
│   │   ├── README.md
│   │   ├── create_request.py
│   │   ├── decode.py
│   │   ├── status.py
│   │   ├── tedapi.proto
│   │   ├── tedapi_orig.py
│   │   ├── tedapi_pb2.py
│   │   ├── tedapi_test.py
│   │   └── web.py
│   ├── tedapi-lan/
│   │   ├── README.md
│   │   ├── lan_tedapi.py
│   │   ├── requirements.txt
│   │   ├── tedapi_combined.proto
│   │   └── tedapi_combined_pb2.py
│   └── tessolarcharge.py
├── v1r_register.py
└── web/
    └── index.html

================================================
FILE CONTENTS
================================================

================================================
FILE: .flake8
================================================
[flake8]
ignore = E501, F824, F823, F841, W503, E722


================================================
FILE: .github/workflows/check-protobuf.yml
================================================
name: Check Protobuf

on:
  push:
    paths:
      - '**.proto'
      - '**_pb2.py'
  pull_request:
    paths:
      - '**.proto'
      - '**_pb2.py'
  workflow_dispatch:

permissions:
  contents: read

jobs:
  check-protobuf:
    name: "Verify pb2 files are up to date"
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: "3.12"

      - name: Install pinned protobuf tools
        run: pip install -r tools/requirements-tools.txt

      - name: Regenerate protobuf files
        run: bash tools/gen_proto.sh

      - name: Check for uncommitted changes
        run: |
          git diff --exit-code -- '**/*_pb2.py' || {
            echo ""
            echo "ERROR: pb2 files are out of date with their .proto sources."
            echo "Run the protoc commands above locally and commit the updated pb2 files."
            exit 1
          }


================================================
FILE: .github/workflows/jekyll-gh-pages.yml
================================================
# Sample workflow for building and deploying a Jekyll site to GitHub Pages
name: Deploy Jekyll with GitHub Pages dependencies preinstalled

on:
  # Runs on pushes targeting the default branch
  push:
    branches: ["main"]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
  contents: read
  pages: write
  id-token: write

# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
  group: "pages"
  cancel-in-progress: false

jobs:
  # Build job
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Setup Pages
        uses: actions/configure-pages@v5
      - name: Build with Jekyll
        uses: actions/jekyll-build-pages@v1
        with:
          source: ./
          destination: ./_site
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3

  # Deployment job
  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4


================================================
FILE: .github/workflows/pwsim-docker.yml
================================================
name: pwsim-docker

# Only trigger if a push is made to the pwsimulator folder
on:
  push:
    paths:
      - 'pwsimulator/**'

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: pwsimulator/
          platforms: linux/amd64,linux/arm64
          push: true
          tags: ${{ secrets.DOCKERHUB_USERNAME }}/pwsimulator:latest


================================================
FILE: .github/workflows/pylint.yml
================================================
name: Pylint

on:
  push:
  pull_request:
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
    steps:
    - uses: actions/checkout@v4
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install pylint
        pip install -r requirements.txt
    - name: Analyzing the code with pylint
      run: |
        pylint -E pypowerwall/*.py
        pylint -E proxy/*.py


================================================
FILE: .github/workflows/simtest.yml
================================================
name: simulator

on:
  push:
  pull_request:
  workflow_dispatch:

permissions:
  contents: read

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  determine-image:
    name: "Determine Image"
    runs-on: ubuntu-latest
    outputs:
      image-owner: ${{ steps.set-owner.outputs.owner }}
    steps:
      - name: Determine image owner
        id: set-owner
        uses: actions/github-script@v7
        with:
          script: |
            const { data: repo } = await github.rest.repos.get({
              owner: context.repo.owner,
              repo: context.repo.repo
            });

            let imageOwner = context.repo.owner;
            if (repo.fork && repo.parent) {
              imageOwner = repo.parent.owner.login;
            }

            core.setOutput('owner', imageOwner);
            console.log(`Image owner: ${imageOwner}`);
  tests:
    name: "Python ${{ matrix.python-version }}"
    needs: determine-image
    runs-on: ubuntu-latest
    env:
      USING_COVERAGE: '3.13'

    strategy:
      matrix:
        python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]

    services:
      simulator:
        image: ${{ needs.determine-image.outputs.image-owner }}/pwsimulator
        ports:
           - 443:443

    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
          cache: "pip"
          cache-dependency-path: |
            requirements.txt
            test_requirements.txt

      - name: Show environment
        run: |
          set -xe
          python -VV
          python -m site
          python -m pip --version

      - name: "Install dependencies"
        run: |
          set -xe
          python -m pip install --upgrade pip setuptools wheel
          pip install -U -r requirements.txt -r test_requirements.txt

      - name: Wait for simulator
        run: |
          for i in {1..10}; do
            if RESP=$(curl -sk https://localhost/test); then
              echo "Simulator ready"
              echo "$RESP"
              exit 0
            fi
            sleep 2
          done
          echo "Simulator never became healthy" >&2
          docker ps -a
          exit 1

      - name: "Run example.py on ${{ matrix.python-version }}"
        run: "python example.py"

      - name: Collect logs on failure
        if: failure()
        run: |
          mkdir -p logs
          docker ps -a > logs/docker-ps.txt
          docker logs "$(docker ps -aq --filter 'publish=443')" > logs/simulator.log 2>&1 || true
      - if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: simulator-logs-${{ matrix.python-version }}
          path: logs/


================================================
FILE: .github/workflows/test.yml
================================================
name: CI

on:
  push:
  pull_request:
  workflow_dispatch:

permissions:
  contents: read

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  tests:
    name: "Python ${{ matrix.python-version }}"
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]

    steps:
      - uses: "actions/checkout@v4"
        with:
          fetch-depth: 0  # IMPORTANT: get full history so comparisons work
          submodules: false

      - uses: "actions/setup-python@v5"
        with:
          python-version: "${{ matrix.python-version }}"
          cache: pip

      - name: "Install dependencies"
        run: |
          set -xe
          python -VV
          python -m site
          python -m pip install --upgrade pip setuptools wheel
          pip install --upgrade -r requirements.txt
          pip install --upgrade -r test_requirements.txt

      # Force branch + html+xml reports even if pytest.ini doesn't set them
      - name: Run unit tests (with coverage)
        env:
          PYTEST_ADDOPTS: "--cov=pypowerwall --cov-branch --cov-report=xml --cov-report=html"
        run: pytest

      - name: "Run test.py on ${{ matrix.python-version }}"
        run: "python test.py"

      # Upload both XML (for services/badges) and HTML (for browsing)
      - name: Upload coverage artifacts
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: coverage-${{ matrix.python-version }}
          path: |
            coverage.xml
            htmlcov/**

      - name: Upload to Codecov
        if: always()
        uses: codecov/codecov-action@v4
        with:
          files: coverage.xml
          flags: py${{ matrix.python-version }}
          token: ${{ secrets.CODECOV_TOKEN }}


================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# Local Test
localtest.py
upload.sh
.powerwall
.vscode/settings.json
localtest.sh
sandbox/
.DS_Store
proxy/testproxy.sh
proxy/uploadtest.sh
tools/set-reserve.auth
tools/set-reserve.conf
tools/set-mode.auth
tools/set-mode.conf
tools/tedapi/request.bin
tools/tedapi/app*
.pypowerwall.auth
.pypowerwall.site
proxy/pypowerwall
proxy/teslapy
.fleetapi*
.idea
**/.cachefile
.cachefile
.pypowerwall.fleetapi
.auth
j
config.json
status.json
tools/tedapi/firmware.raw
tools/tedapi/components.json
tools/tedapi/manypw3.json
tools/tedapi/pw3.json
tools/tedapi/test.py
proxy/.beta_version
cleanroom
tools/tesla-history/tesla-history.auth
tools/tesla-history/tesla-history.conf
tools/tedapi-lan/credentials.json
fleet_tokens.json
tedapi_rsa_*
*.bak


================================================
FILE: .pre-commit-config.yaml
================================================
repos:
  - repo: local
    hooks:
      - id: protoc-gen
        name: Regenerate protobuf Python files
        language: script
        entry: tools/gen_proto.sh
        files: \.proto$
        pass_filenames: false
        # Requires: pip install -r tools/requirements-tools.txt

      - id: pylint-pypowerwall
        name: Pylint (pypowerwall errors)
        language: system
        entry: pylint -E pypowerwall/
        files: ^pypowerwall/.*\.py$
        pass_filenames: false

      - id: pylint-proxy
        name: Pylint (proxy errors)
        language: system
        entry: pylint -E proxy/*.py
        files: ^proxy/.*\.py$
        pass_filenames: false


================================================
FILE: .pylintrc
================================================
[MASTER]
# Ignore auto-generated protobuf files
ignore-paths = .*_pb2\.py$

[MESSAGES CONTROL]
disable=consider-iterating-dictionary, consider-swap-variables, consider-using-enumerate, cyclic-import, consider-using-max-builtin, no-else-continue, consider-using-min-builtin, consider-using-in, super-with-arguments, protected-access, import-outside-toplevel, multiple-statements, unidiomatic-typecheck, no-else-break, import-error, invalid-name, missing-docstring, no-else-return, no-member, too-many-lines, line-too-long, too-many-ancestors, too-many-arguments, too-many-branches, too-many-instance-attributes, too-many-locals, too-many-nested-blocks, too-many-return-statements, too-many-statements, too-few-public-methods, ungrouped-imports, use-dict-literal, superfluous-parens, fixme, consider-using-f-string, bare-except, broad-except, unused-variable, unspecified-encoding, redefined-builtin, consider-using-dict-items, redundant-u-string-prefix, useless-object-inheritance, wrong-import-position, logging-not-lazy, logging-fstring-interpolation, wildcard-import, logging-format-interpolation

[SIMILARITIES]
min-similarity-lines=8


================================================
FILE: API.md
================================================
# PyPowerwall Python API Documentation

PyPowerwall is a Python library for interfacing with the Tesla Solar Powerwall Gateway. This document provides an overview of the main classes and functions available for users and developers.

---

## Getting Started

Install the required dependencies:

```sh
pip install requests protobuf
```

Import the library in your Python code:

```python
import pypowerwall
```

Create a Powerwall instance:

```python
pw = pypowerwall.Powerwall(host="<gateway-ip>", password="<gateway-password>", email="<tesla-email>")
```

---

## Main Class: `Powerwall`

### Initialization

```python
pw = pypowerwall.Powerwall(
    host="<gateway-ip>",
    password="<gateway-password>",
    email="<tesla-email>",
    timezone="America/Los_Angeles",
    pwcacheexpire=5,
    timeout=5,
    poolmaxsize=10,
    cloudmode=False,
    siteid=None,
    authpath="",
    authmode="cookie",
    cachefile=".powerwall",
    fleetapi=False,
    auto_select=False,
    retry_modes=False,
    gw_pwd=None,
    rsa_key_path=None
)
```

**Parameters:**
- `host`: Hostname or IP of the Tesla gateway
- `password`: Customer password for gateway
- `email`: Customer email for gateway/cloud
- `timezone`: Timezone string
- `pwcacheexpire`: API cache timeout in seconds
- `timeout`: HTTPS call timeout in seconds
- `poolmaxsize`: HTTP connection pool size
- `cloudmode`: Use Tesla cloud API (default: False)
- `siteid`: Site ID for cloud mode
- `authpath`: Path to cloud auth/site files
- `authmode`: "cookie" or "token" (default: "cookie")
- `cachefile`: Path to cache file
- `fleetapi`: Use Tesla FleetAPI (default: False)
- `auto_select`: Auto-select best connection mode
- `retry_modes`: Retry connection attempts
- `gw_pwd`: Full gateway password from QR sticker (used for TEDAPI and v1r modes; last 5 chars auto-derived for Basic login)
- `rsa_key_path`: Path to RSA-4096 private key for v1r LAN TEDAPI mode (Powerwall 3 wired LAN)

---

## Common Methods

### System and Status

- `is_connected()` → bool  
  Returns True if able to connect and login to Powerwall.

- `status(param=None, jsonformat=False)` → dict/str/None  
  Returns system status. If `param` is provided, returns only that parameter.

- `site_name()` → str/None  
  Returns the site name.

- `version(int_value=False)` → str/int/None  
  Returns firmware version (as string or int).

- `uptime()` → str/None  
  Returns system uptime in seconds.

- `din()` → str/None  
  Returns the system DIN.

### Power and Energy

- `level(scale=False)` → float/None  
  Returns battery power level percentage. Tesla reserves 5% of battery capacity as a buffer, so:
  - `scale=False` (default): Returns actual battery level including the 5% reserve
  - `scale=True`: Returns Tesla app-style percentage using formula `(level / 0.95) - (5 / 0.95)` to show percentage of *usable* capacity (matches Tesla App)

- `power()` → dict  
  Returns power data for site, solar, battery, and load.

- `site(verbose=False)` → dict  
  Returns site sensor data (W or raw JSON if verbose=True).

- `solar(verbose=False)` → dict  
  Returns solar sensor data (W or raw JSON if verbose=True).

- `battery(verbose=False)` → dict  
  Returns battery sensor data (W or raw JSON if verbose=True).

- `load(verbose=False)` → dict  
  Returns load sensor data (W or raw JSON if verbose=True).

- `grid(verbose=False)` → dict  
  Alias for `site()`.

- `home(verbose=False)` → dict  
  Alias for `load()`.

### Device and System Data

- `vitals(jsonformat=False)` → dict/str  
  Returns Powerwall device vitals.

- `strings(jsonformat=False, verbose=False)` → dict/str  
  Returns solar panel string data.

- `temps(jsonformat=False)` → dict/str  
  Returns Powerwall temperatures.

- `alerts(jsonformat=False, alertsonly=True)` → list/str  
  Returns array of alerts from devices.

- `system_status(jsonformat=False)` → dict/str  
  Returns the system status.

- `battery_blocks(jsonformat=False)` → dict/str  
  Returns battery-specific information merged from system status and vitals.

- `grid_status(type="string")` → str/int/None  
  Returns the power grid status. `type` can be "string" (default), "json", or "numeric".
    - "string": "UP", "DOWN", "SYNCING"
    - "numeric": -1 (Syncing), 0 (DOWN), 1 (UP)

### Battery and Operation

- `get_reserve(scale=True, force=False)` → float/None
  Get battery reserve percentage.

- `get_mode(force=False)` → str/None
  Get current battery operation mode.

- `set_reserve(level)` → dict/None
  Set battery reserve percentage (0-100).

- `set_mode(mode)` → dict/None
  Set current battery operation mode (`self_consumption`, `backup`, `autonomous`).

- `set_operation(level=None, mode=None, jsonformat=False)` → dict/str/None
  Set battery reserve percentage and/or operation mode.

- `get_time_remaining()` → float/None
  Get the backup time remaining on the battery (in hours).

### Grid and Export

- `set_grid_charging(mode)` → dict/None
  Enable or disable grid charging (`mode` = True/False).

- `get_grid_charging()` → bool/None
  Get the current grid charging mode.

- `set_grid_export(mode)` → dict/None
  Set grid export mode (`mode` = "battery_ok", "pv_only", "never").

- `get_grid_export()` → str/None
  Get the current grid export mode.

> **v1r LAN Control:** In v1r mode (Powerwall 3 wired LAN with RSA key), all control methods work directly over the local network via config file writes — no cloud API or Tesla account needed. In other modes (WiFi TEDAPI, local), control requires FleetAPI or Cloud API access.

---

## Example Usage

### Local Mode (Powerwall 2/+)

```python
import pypowerwall

pw = pypowerwall.Powerwall(host="10.0.1.99", password="yourpassword", email="your@email.com")

if pw.is_connected():
    print("Connected to Powerwall!")
    print("Site Name:", pw.site_name())
    print("Battery Level:", pw.level())
    print("Grid Status:", pw.grid_status())
    print("Alerts:", pw.alerts())
else:
    print("Failed to connect to Powerwall.")
```

### v1r LAN Mode (Powerwall 3 — full local control)

```python
import pypowerwall

pw = pypowerwall.Powerwall(
    host="10.42.1.40",                              # Powerwall vendor subnet IP
    gw_pwd="ABCDEXXXXX",                            # Full gateway password from QR sticker
    rsa_key_path="/path/to/tedapi_rsa_private.pem"   # RSA key from v1r_register.py
)

# Monitor
print("Battery:", pw.level(), "%")
print("Power:", pw.power())
print("Vitals:", pw.vitals())

# Read control settings
print("Mode:", pw.get_mode())
print("Reserve:", pw.get_reserve())
print("Grid Charging:", pw.get_grid_charging())
print("Grid Export:", pw.get_grid_export())

# Set control values (no cloud needed)
pw.set_mode("self_consumption")
pw.set_reserve(20)
pw.set_grid_charging(False)
pw.set_grid_export("pv_only")
```

---

## Advanced Topics

- **Cloud Mode:** Set `cloudmode=True` and provide your Tesla account email to use the Tesla Cloud API.
- **FleetAPI:** Set `fleetapi=True` to use Tesla FleetAPI (requires setup).
- **TEDAPI:** Use `gw_pwd` for TEDAPI mode (advanced/local diagnostics).
- **v1r LAN:** Use `gw_pwd` + `rsa_key_path` for Powerwall 3 wired LAN access with full local control.
- **Caching:** The library caches API responses for 5 seconds by default (`pwcacheexpire`).
- **Authentication:** Supports both cookie and bearer token authentication (`authmode`).

---

## Requirements

- Python 3.7+
- `requests`, `protobuf`

Install requirements:

```sh
pip install -r requirements.txt
```

## TeslaPy

**Note:** TeslaPy is included as a patched fork within pypowerwall and does not need to be installed separately. The fork was created because the original project is mostly unmaintained and necessary bug fixes were not being accepted by the maintainers. You can access it if needed:

```python
from pypowerwall.cloud import teslapy
```

---

## Architecture

pypowerwall uses a modular architecture with multiple backend implementations and a sophisticated multi-tier caching system to optimize performance and reliability.

### Component Overview

The library consists of several key components:

- **Powerwall (Main Class)**: High-level interface that automatically selects the appropriate backend
- **PyPowerwallBase**: Abstract base class defining the core API interface
- **Backend Implementations**: 
  - **TEDAPI** - Tesla Energy Device API for local communication via gateway
  - **Local** - Legacy local API for older Powerwall firmware
  - **Cloud** - Tesla Cloud API for remote access
  - **FleetAPI** - Tesla Fleet API for third-party integrations
- **Proxy Server**: HTTP server that wraps pypowerwall and adds performance caching

### Class Hierarchy

```mermaid
classDiagram
    class Powerwall {
        +__init__(host, password, email, ...)
        +poll()
        +power()
        +battery_blocks()
        Backend selection logic
    }
    
    class PyPowerwallBase {
        <<abstract>>
        +poll()
        +level()
        +power()
        +vitals()
        +strings()
    }
    
    class TEDAPI {
        +gw_pwd authentication
        +protobuf communication
        +network call cache (30s)
        +vitals streaming
    }
    
    class Local {
        +cookie/bearer auth
        +legacy endpoints
        +older firmware support
    }
    
    class Cloud {
        +Tesla account auth
        +remote access
        +Included TeslaPy fork
    }
    
    class FleetAPI {
        +third-party auth
        +fleet endpoints
        +vehicle integration
    }
    
    Powerwall --|> PyPowerwallBase : extends
    TEDAPI --|> PyPowerwallBase : implements
    Local --|> PyPowerwallBase : implements
    Cloud --|> PyPowerwallBase : implements
    FleetAPI --|> PyPowerwallBase : implements
    Powerwall --> TEDAPI : uses
    Powerwall --> Local : uses
    Powerwall --> Cloud : uses
    Powerwall --> FleetAPI : uses
```

### Data Flow and Caching Architecture

pypowerwall implements a 3-tier caching system for optimal performance:

```mermaid
sequenceDiagram
    participant App as Application
    participant Proxy as Proxy Server
    participant Base as Powerwall/Base
    participant Backend as TEDAPI/Local/Cloud
    participant GW as Gateway/Cloud API
    
    Note over Proxy: Layer 3: Performance Cache<br/>(5s default, configurable)
    Note over Base: Layer 2: No Caching<br/>(Clean API)
    Note over Backend: Layer 1: Network Cache<br/>(5s default, configurable)
    
    App->>Proxy: GET /api/freq
    
    alt Cache Hit (< 5s)
        Proxy-->>App: Cached Response (~1ms)
    else Cache Miss
        Proxy->>Base: frequency()
        Base->>Backend: vitals()
        
        alt Network Cache Hit (< 5s)
            Backend-->>Base: Cached Data
        else Network Cache Miss
            Backend->>GW: API Request
            GW-->>Backend: Fresh Data
            Backend->>Backend: Store in cache
        end
        
        Backend-->>Base: Data
        Base-->>Proxy: Processed Data
        Proxy->>Proxy: Cache for 5s
        Proxy-->>App: Fresh Response (~900ms)
    end
```

### Connection Mode Selection

The Powerwall class automatically selects the appropriate backend based on configuration:

```mermaid
flowchart TD
    Start([Application Initializes]) --> CheckFleet{fleetapi=True?}
    CheckFleet -->|Yes| Fleet[FleetAPI Backend]
    CheckFleet -->|No| CheckCloud{cloudmode=True?}
    CheckCloud -->|Yes| Cloud[Cloud Backend]
    CheckCloud -->|No| CheckPassword{gw_pwd provided?}
    CheckPassword -->|Yes| TestTEDAPI[Test TEDAPI Connection]
    CheckPassword -->|No| Local[Local Backend]
    
    TestTEDAPI --> TEDAPI_OK{Connection OK?}
    TEDAPI_OK -->|Yes| TEDAPI[TEDAPI Backend]
    TEDAPI_OK -->|No| FallbackLocal[Local Backend<br/>Fallback]
    
    Fleet --> Done([Ready])
    Cloud --> Done
    TEDAPI --> Done
    Local --> Done
    FallbackLocal --> Done
    
    style TEDAPI fill:#90EE90
    style Cloud fill:#87CEEB
    style Fleet fill:#DDA0DD
    style Local fill:#FFB6C1
```

### Backend Comparison

| Feature | TEDAPI | Local | Cloud | FleetAPI |
|---------|--------|-------|-------|----------|
| **Connection** | Local Gateway | Local Gateway | Internet | Internet |
| **Authentication** | Gateway Password | Cookie/Token | Tesla Account | OAuth Token |
| **Firmware Support** | Recent (23.44.0+) | Legacy | All | All |
| **Response Speed** | Fast (~300ms) | Fast (~300ms) | Slower (~1-2s) | Slower (~1-2s) |
| **Vitals Streaming** | Yes | Limited | No | Limited |
| **Offline Operation** | Yes | Yes | No | No |
| **Network Cache** | Yes (5s) | No | No | No |
| **Best For** | PW3, Recent PW2+ | Older Systems | Remote Access | Third-party Apps |

### Caching Strategy

pypowerwall implements intelligent caching at multiple levels:

**Layer 1: Backend Network Cache** (TEDAPI only)
- Default TTL: 5 seconds (configurable via `pwcacheexpire`)
- Caches raw API responses from gateway
- Reduces network calls for repeated requests
- Logs cache age/expire for debugging

**Layer 2: Base Library**
- No caching (by design)
- Clean API boundary
- Always returns fresh data from backend
- Simplifies testing and reasoning

**Layer 3: Proxy Server Performance Cache**
- Default TTL: 5 seconds (configurable via `PW_CACHE_EXPIRE`)
- Caches processed responses for high-frequency endpoints
- Dramatically improves response time (900ms → <1ms)
- Used for: `/api/csv`, `/api/freq`, `/api/pod`, `/api/json`
- Separate cache keys per endpoint
- Thread-safe with locks

**Layer 3b: Proxy Graceful Degradation Cache**
- Default TTL: 15 seconds (configurable via `PW_CACHE_TTL_SECONDS`)
- Stores last successful response
- Used when gateway is unreachable
- Prevents service interruption during brief outages

### Example: Request Flow for `/api/freq`

1. **Application** makes HTTP request to proxy server
2. **Proxy** checks performance cache (5s TTL)
   - If hit: Returns cached data immediately (~1ms)
   - If miss: Proceeds to step 3
3. **Proxy** calls multiple pypowerwall methods:
   - `system_status()` - battery blocks
   - `vitals()` - detailed metrics
   - `grid_status()` - grid connection state
4. **Base Library** forwards calls to backend (no caching)
5. **TEDAPI Backend** checks network cache (5s TTL)
   - If hit: Returns cached data
   - If miss: Makes protobuf API call to gateway
6. **Response** flows back through layers
7. **Proxy** caches processed response for 5 seconds
8. **Application** receives consolidated frequency data

This architecture provides:
- **Performance**: Sub-millisecond cached responses
- **Reliability**: Graceful degradation during outages
- **Flexibility**: Multiple backend support
- **Observability**: Cache logging for debugging

---

## More Information

- [GitHub Repository](https://github.com/jasonacox/pypowerwall)
- [CONTRIBUTING.md](CONTRIBUTING.md)
- [RELEASE.md](RELEASE.md)


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Code of Conduct

As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, hosting discussions, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.

We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, disability, personal appearance, ethnicity, age, religion, or nationality.

Examples of unacceptable behavior by participants include:
- Personal attacks
- Trolling or insulting/derogatory comments
- Public or private harassment
- Publishing others' private information, such as physical or electronic addresses, without explicit permission
- Other unethical or unprofessional conduct

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

By adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team.

This code of conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project maintainer at the email address listed in the repository.

This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 1.4.


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to PyPowerwall

Thank you for your interest in contributing to PyPowerwall! We welcome contributions that improve the project and make it more useful for everyone. Please read the following guidelines to help us maintain a high-quality, maintainable, and collaborative codebase.

## General Guidelines

- **Keep it Modular:**  
  Structure your code in small, focused modules and functions. Avoid monolithic files or classes. This makes the code easier to read, test, and maintain.

- **Small Pull Requests:**  
  Submit small, focused pull requests (PRs) that address a single issue or feature. This makes it easier for reviewers to evaluate and approve your changes quickly.

- **Simplicity:**  
  Strive for simplicity in your code and design. Avoid unnecessary complexity. Write code that is easy to understand and modify by others.

- **Readability:**  
  Use clear, descriptive names for variables, functions, and classes. Add comments where necessary, especially for non-obvious logic.

- **Testing:**  
  We recommend that you thoroughly test your changes before submitting a PR. While unit tests are not strictly required, contributions that include appropriate unit tests are highly appreciated and will receive extra consideration. Make sure all existing tests pass before submitting your PR. PRs without tests may still be accepted if they are well-tested and documented.

- **Release Notes:**  
  For any user-facing changes, please add a summary to the `RELEASE.md` file describing what changed and why.

## Setting Up Your Development Environment

- Clone the repository:
  ```
  git clone https://github.com/jasonacox/pypowerwall.git
  cd pypowerwall
  ```
- (Optional) Create and activate a virtual environment:
  ```
  python3 -m venv venv
  source venv/bin/activate
  ```
- Install runtime dependencies (required to run the package):
  ```
  pip install -r requirements.txt
  ```
- (For contributors running tests) Install test dependencies (required to execute unit tests):
  ```
  pip install -r test_requirements.txt
  ```

## Dependency Files: requirements.txt vs. test_requirements.txt

- `requirements.txt` lists the dependencies required to run the PyPowerwall package itself. Install these to use the library or run the main application.
- `test_requirements.txt` lists additional dependencies needed only for running the unit tests (e.g., pytest, mock libraries). Install these if you plan to run or write tests:
  ```
  pip install -r test_requirements.txt
  ```
- You typically need both files for full development and testing, but end users only need `requirements.txt`.

## How to Run Tests

- **Note:** The following applies to the Python library only. The proxy server and other tools have their own testing and validation processes.
- Tests are located in the `pypowerwall/tests/` directory.
- Before running tests, ensure you have installed both `requirements.txt` and `test_requirements.txt` dependencies (see above).
- Run all tests with:
  ```
  pytest
  ```
- If your contribution requires hardware or external services, please use mocks or document how to test your changes.

## How to Contribute

1. **Fork the Repository**  
   Create your own fork of the project and clone it locally.

2. **Create a Branch**  
   Create a new branch for your feature or bugfix:
   ```
   git checkout -b feature/my-new-feature
   ```

3. **Make Your Changes**  
   Keep your changes focused and modular. Update or add tests as needed.

4. **Test Your Changes**  
   Run all tests locally to ensure nothing is broken:
   ```
   pytest
   ```

5. **Update Release Notes**  
   Add a brief summary of your change to `RELEASE.md`.

6. **Submit a Pull Request**  
   Push your branch to your fork and open a pull request against the main repository. Provide a clear description of your changes and reference any related issues.

## Issues vs. Discussions

- **Issues** are for reporting bugs, requesting features, or tracking specific tasks that require action or resolution. Use an issue when you have a concrete problem, bug, or enhancement to propose. Issues should be closed when the problem is resolved, the feature is implemented, or the task is complete.

- **Discussions** are for open-ended conversations, brainstorming, questions, or general feedback that may not require direct action or a code change. Use a discussion when you want to ask for advice, share ideas, or start a broader conversation. Discussions can be closed when the conversation has naturally concluded, a consensus is reached, or the topic is no longer active.

> These are guidelines, not strict rules. If you're unsure, start a discussion—maintainers can help move it to an issue if needed.

## Flexibility and Exceptions

While the guidelines above are generally adhered to, the maintainers are not strict rules lawyers. We value thoughtful contributions and are always open to reasonable exceptions or nuanced cases. If you have a good reason to diverge from a guideline, or if your situation doesn't fit neatly into the rules, please start a conversation—collaboration and flexibility are encouraged.

## Branch Naming and Commit Messages

- Use descriptive branch names, e.g., `fix/issue-123-description` or `feature/add-new-api`.
- Write clear, concise commit messages that explain the "why" behind your changes.

## Code Style

- Follow [PEP 8](https://pep8.org/) for Python code style.
- Use [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html) for docstrings and comments.
- Use type hints where appropriate.

## Reviewing and Approval

- PRs will be reviewed for clarity, modularity, simplicity, and test coverage.
- Please be responsive to feedback and willing to make changes as requested.

## Code of Conduct

Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.

## Licensing

By contributing, you agree that your contributions will be licensed under the same license as the rest of the project (see [`LICENSE`](LICENSE)).

## Versioning Policy

This project follows [Semantic Versioning](https://semver.org/). Version numbers are in the format MAJOR.MINOR.PATCH:

- **MAJOR** version when you make incompatible API changes,
- **MINOR** version when you add functionality in a backwards-compatible manner, and
- **PATCH** version when you make backwards-compatible bug fixes.

Please update the version number appropriately in your pull request if your change warrants it, and describe the change in `RELEASE.md`.

## Relationship to Powerwall-Dashboard

PyPowerwall focuses on providing core Python functionality to access Tesla Powerwall and Tesla Solar systems. This repository contains the Python library and proxy server for programmatic and easy access to Powerwall data and control features.

The [Powerwall-Dashboard](https://github.com/jasonacox/powerwall-dashboard) project provides a Grafana dashboard for visualizing Powerwall data. It uses PyPowerwall to collect data, stores it in InfluxDB, and displays it in Grafana. Powerwall-Dashboard also manages the container stack needed for the dashboard setup.

Since PyPowerwall and [Powerwall-Dashboard](https://github.com/jasonacox/powerwall-dashboard) work closely together, many features, bugs, and enhancements may affect both projects. Please mention this in your issue or discussion if applicable. Maintainers may move or cross-reference issues between repositories as needed.

**Where to contribute:**
- PyPowerwall: Changes related to the Python library, API, or proxy server (e.g., new endpoints, bug fixes, data collection improvements)
- Powerwall-Dashboard: Changes related to dashboard setup, Grafana dashboards, InfluxDB configuration, or container stack management. Additionally, users are encouraged to start or join discussions about the Powerwall system itself or Powerwall Firmware updates (including problems) to that project first.
- Not sure? Start a discussion in either repository - maintainers will help direct it appropriately
- When submitting PRs or issues, check for and reference any related items in the sister project
- Issues may move between projects as needed; cross-project collaboration is encouraged

## Platform and Compatibility Notes

- **Backward Compatibility:**
  We strive to maintain backward compatibility and avoid breaking existing installations whenever possible. If your contribution introduces a breaking change, please clearly document it and discuss with the maintainers before submitting your PR.

- **Multi-Platform Support:**
  PyPowerwall aims to support a wide range of platforms, including Raspberry Pi, Linux, Windows, macOS, and appliance-based compute platforms (such as Synology). Contributors are encouraged to consider cross-platform compatibility and, where possible, test changes on multiple platforms. Please note any platform-specific considerations or limitations in your PR description.

## Questions

If you have any questions or need clarification, feel free to open an issue or start a discussion.

Thank you for helping make PyPowerwall better!


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2021 Jason Cox

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# pyPowerwall

[![License](https://img.shields.io/github/license/jasonacox/pypowerwall)](https://img.shields.io/github/license/jasonacox/pypowerwall)
[![PyPI version](https://badge.fury.io/py/pypowerwall.svg)](https://badge.fury.io/py/pypowerwall)
[![CI](https://github.com/jasonacox/pypowerwall/actions/workflows/test.yml/badge.svg)](https://github.com/jasonacox/pypowerwall/actions/workflows/test.yml)
[![simtest](https://github.com/jasonacox/pypowerwall/actions/workflows/simtest.yml/badge.svg)](https://github.com/jasonacox/pypowerwall/actions/workflows/simtest.yml)
[![Python Version](https://img.shields.io/pypi/pyversions/pypowerwall)](https://img.shields.io/pypi/pyversions/pypowerwall)
[![PyPI Downloads](https://static.pepy.tech/badge/pypowerwall/month)](https://static.pepy.tech/badge/pypowerwall/month)

pyPowerwall is a Python module to interface with Tesla Energy Gateways for Powerwall and solar power data. It supports local access to Powerwall, Powerwall 2, Powerwall+ and Powerwall 3 systems. It also provides Tesla Owner and FleetAPI cloud access for all systems including Solar-only systems. For Powerwall 3 on wired LAN, the v1r TEDAPI mode provides full local access using RSA-signed protobuf messages without needing Wi-Fi access.

> ⚠️ **NOTICE:** As of Powerwall Firmware version 25.10.0, network routing to the TEDAPI endpoint (`192.168.91.1`) is no longer supported by Tesla. You must connect directly to the Powerwall's Wi‑Fi access point to access TEDAPI data.

## Description

This Python module can be used to monitor and control Tesla Energy Powerwalls. It uses a single class (`Powerwall`) and simple functions to fetch energy data and poll API endpoints on the Gateway.  

pyPowerwall will cache the authentication headers and API call responses to help reduce the number of calls made to the Gateway (useful if you are polling the Powerwall frequently for trending data).

* Works with Tesla Energy Gateways - Powerwall, Powerwall+ and Powerwall 3
* Access provided via Local Gateway APIs, Tesla FleetAPI (official), Tesla Owners API (unofficial), and v1r LAN TEDAPI (Powerwall 3).
* Will cache authentication to reduce load on Powerwall Gateway
* Will cache responses to limit the number of calls to the Powerwall Gateway or cloud (optional/user‑definable)
* Will re-use HTTP connections to the Powerwall Gateway for reduced load and faster response times
* Provides solar string data for Powerwall+ and Powerwall 3 systems.

## Setup

You can clone this repo or install the package with pip.  Once installed, pyPowerwall can scan your local network to find the IP address of your Tesla Powerwall Gateway.

```bash
# Install pyPowerwall
python3 -m pip install pypowerwall

# Option 1 - LOCAL MODE - Scan Network for Powerwalls
python3 -m pypowerwall scan

# Option 2 - FLEETAPI CLOUD MODE - Setup to use the official Tesla FleetAPI - See notes below.
python3 -m pypowerwall setup -fleetapi

# Option 3 - CLOUD MODE - Setup to use Tesla Owners cloud API
python3 -m pypowerwall setup

# Option 4 - TEDAPI MODE - Test this mode (requires extended setup - see below)
python3 -m pypowerwall tedapi

# Option 5 - v1r LAN TEDAPI MODE - Register RSA key for Powerwall 3 wired LAN access
python3 -m pypowerwall setup -v1r
```

### Local Setup - Option 1

The Tesla Powerwall, Powerwall 2 and Powerwall+ have a local LAN based Web Portal and API that you can use to monitor your Powerwall. It requires that you (or your installer) have the IP address (see scan above) and set up *Customer Login* credentials on your Powerwall Gateway. That is all that is needed to connect. 

The Powerwall 3 does not have a traditional Web Portal or API but you can access it via the cloud (see options 2 and 3), via the TEDAPI Wi-Fi access point (option 4), or via the wired LAN using v1r TEDAPI (option 5).

Locally accessible extended device vitals metrics are available using the TEDAPI method (see options 4 and 5 below).

### FleetAPI Cloud Setup - Option 2

FleetAPI is the official Tesla API for accessing your Tesla products. This setup has some additional setup requirements that you will be prompted to do:

Step 1 - Tesla Partner Account - Sign in to Tesla Developer Portal and make an App Access Request: See [Tesla App Access Request](https://developer.tesla.com/request) - During this process, you will need to set up and remember the following account settings: 

   * CLIENT_ID - This will be provided to you by Tesla when your request is approved.
   * CLIENT_SECRET - Same as above.
   * DOMAIN - The domain name of a website you own and control.
   * REDIRECT_URI - This is the URL that Tesla will direct you to after you authenticate. This landing URL (on your website) will extract the GET variable `code`, which is a one-time use authorization code needed during the pyPowerwall setup. You can use https://pypowerwall.com/code or copy the code from [index.html](./tools/fleetapi/index.html) to your site and update REDIRECT_URI with that URL. Alternatively, you can just copy the URL from the 404 page during the authorization process (the code is in the URL).

Step 2 - Run the [create_pem_key.py](./tools/fleetapi/create_pem_key.py) script and place the **public** key on your website at the URL: https://{DOMAIN}/.well-known/appspecific/com.tesla.3p.public-key.pem

Step 3 - Run `python3 -m pypowerwall fleetapi` - The credentials and tokens will be stored in the `.pypowerwall.fleetapi` file.

### Cloud Mode - Option 3

The unofficial Tesla Owners API allows FleetAPI access (option 2) without having to set up a website and PEM key. Follow the directions given to you by running `python3 -m pypowerwall setup`. The credentials and site_id will be stored in `.pypowerwall.auth` and `.pypowerwall.site`.

If you need to authenticate on a machine without a display (e.g. a Raspberry Pi or remote server over SSH), use the `authtoken` command on your local machine to obtain a refresh token, then paste it into the remote session:

```bash
# On your local machine (Mac/Windows/Linux with a display):
python3 -m pypowerwall authtoken

# Follow the Tesla login flow in the popup window.
# Copy the token printed to the terminal.

# Then on the remote machine, run setup and paste the token when prompted:
python3 -m pypowerwall setup
```

### TEDAPI Mode - Option 4

With version v0.10.0+, pypowerwall can access the TEDAPI endpoint on the Gateway over **Wi-Fi**. This API offers additional metrics related to string data, voltages, and alerts. You will need the Gateway Wi‑Fi password (found on the QR sticker on the Powerwall Gateway) and network access to `192.168.91.1` (either via the Gateway’s Wi‑Fi AP or a static route from your LAN).

#### Full vs Hybrid TEDAPI

Option 4 operates in two sub-modes depending on which credentials you provide:

* **Full TEDAPI** — Set only `gw_pwd` (leave `password` empty). Uses the full Gateway Wi‑Fi password for HTTP Basic Auth directly to the TEDAPI protobuf endpoint. Works on PW2/+/3.
* **Hybrid TEDAPI** — Set both `password` (last 5 chars) and `gw_pwd`. The customer password authenticates via `/api/login/Basic` for standard JSON API access, while `gw_pwd` enables TEDAPI for supplemental vitals data (string voltages, per‑device alerts, etc.). Useful on PW2/+ where the customer API provides data that TEDAPI does not.

#### Network Requirements (Wi-Fi)

Your machine must be able to reach `192.168.91.1`. Options:
* Connect directly to the Gateway’s Wi‑Fi access point
* Add a static route from your LAN through the Gateway’s home-network IP (see examples below)

> **Note:** Some firmware versions (25.10.0+) may block routed access to 192.168.91.1. In that case, connect directly to the Gateway Wi‑Fi.

> ⚠️ **TEDAPI Limitations:** Some functions are only available via FleetAPI or Cloud mode. Known limitations include `get_grid_charging()` and `get_grid_export()`, which rely on Fleet API endpoints not exposed locally — these return `None` in TEDAPI mode with a log warning. Use FleetAPI (Option 2) or Cloud mode (Option 3) for full functionality.

In the examples below, change **192.168.0.100** to the IP address of the Powerwall Gateway (or Inverter) on your LAN. Also, the **onlink** parameter may be necessary for Linux.

#### Linux Ubuntu and RPi
```bash
# Can add to /etc/rc.local for persistence
sudo ip route add 192.168.91.1 via 192.168.0.100 [onlink]
```

See `examples/network_route.py` for two different approaches to do this programmatically in Python.

#### macOS
```
sudo route add -host 192.168.91.1 192.168.0.100 # Temporary 
networksetup -setadditionalroutes Wi-Fi 192.168.91.1 255.255.255.255 192.168.0.100 # Persistent
```

#### Windows - Using the persistence flag - Administrator Shell
```
route -p add 192.168.91.1 mask 255.255.255.255 192.168.0.100
```

#### Windows Subsystem for Linux (WSL 2–specific)
Follow the instructions for Linux, but you must edit (from the host Windows OS) `%USERPROFILE%\.wslconfig` and add the following settings:
```
[wsl2]
networkingMode=mirrored
```

```bash
# Test WiFi TEDAPI
python3 -m pypowerwall tedapi -gw_pwd ABCDEXXXXX

# Test v1r LAN TEDAPI
python3 -m pypowerwall tedapi -host 10.42.1.40 -v1r -gw_pwd ABCDEXXXXX \
   -rsa_key_path /path/to/tedapi_rsa_private.pem
```

#### TEDAPI Troubleshooting

- Connection refused/timeout: Ensure you’re connected to the Powerwall’s Wi‑Fi or have a working route to 192.168.91.1. Some firmware versions (25.10.0+) block routing; connect directly to the PW Wi‑Fi.
- Auth failures: Use the Gateway Wi‑Fi password from the QR label as `gw_pwd` (case‑sensitive). Customer portal passwords do not work for TEDAPI.
- TLS/certificate warnings: TEDAPI uses a self‑signed cert; most tools need `--insecure` (curl) or `verify=False` (requests). Use only on trusted networks.
- Hybrid mode quirks (PW2/+): If both customer `password`/`email` and `gw_pwd` are provided, TEDAPI data augments local APIs; try removing customer creds if you only need TEDAPI.
- QNAP/Appliance routing: Static routes from shell may be ignored; use the appliance’s network control panel to add a persistent host route.

### v1r LAN TEDapi Setup - Option 5 (Powerwall 3 Wired LAN)

The Powerwall 3 exposes endpoints on the **wired LAN** (the vendor/third-party Ethernet port) that provide local access to Powerwall data without needing Wi-Fi access to `192.168.91.1`. This is especially useful for always-on monitoring setups where a wired Ethernet connection to the Powerwall gateway is available.

Option 5 has two sub-modes:

* **Basic LAN** — Uses `/api/login/Basic` for a Bearer token + standard JSON API endpoints. No FleetAPI setup or RSA keys needed. Provides core power/battery/grid data (3 endpoints).
* **Full v1r** — Uses RSA-4096 signed protobuf messages to the `/tedapi/v1r` endpoint. Requires one-time FleetAPI key registration. Provides full data access (config, firmware, vitals, strings, components) equivalent to Wi-Fi TEDAPI.

#### Network Requirements (Wired LAN)

The Powerwall 3 gateway has a wired Ethernet port on the TEG (Tesla Energy Gateway) unit that operates on an internal vendor subnet — typically `10.42.1.0/24` or `10.45.1.0/24`. This is **not** your home LAN IP.

> **⚠️ DHCP Required:** The Powerwall 3 does **not** have a static IP address on the vendor subnet. It relies on DHCP to obtain an IP. You must run a DHCP server on the vendor subnet (e.g., `dnsmasq` or your Linux NAT router) that hands out addresses in the `10.42.1.x` or `10.45.1.x` range. Without a DHCP server, the Powerwall will not get an IP and the wired LAN endpoints will be unreachable.

To reach this subnet you need a Layer 2 connection to the TEG Ethernet port:
* **SPAN panel** — Provides this natively; the SPAN connects to the TEG Ethernet and bridges it to your home network
* **Network bridge** — A Linux bridge (e.g., `br-tap`) joining the TEG Ethernet interface to your LAN
* **Direct cable** — Ethernet cable from your machine to the TEG port (you will need a static IP on the 10.42.1.x subnet)
* **VLAN** — Managed switch with a VLAN that includes the TEG port

> **Important:** The v1r/Basic LAN endpoints listen only on the vendor subnet (10.42.1.x). Requests to the Powerwall’s home LAN IP will not reach these endpoints. Use `ping 10.42.1.x` to verify connectivity before configuration.

#### Basic LAN Access (No RSA Key Required)

If you only need core power, battery, and grid data over the wired LAN, you can use the standard local mode without RSA key registration. This uses the same `/api/login/Basic` endpoint that the Tesla app uses:

```python
import pypowerwall

pw = pypowerwall.Powerwall(
    host="10.42.1.40",                # Powerwall wired LAN IP (vendor subnet)
    password="XXXXX",                 # Customer password (last 5 of GW password)
    email="user@example.com",
    timezone="America/Los_Angeles"
)

# Basic power data available without RSA:
print(pw.power())       # {site, solar, battery, load} in watts
print(pw.level())       # Battery percentage
print(pw.grid_status()) # Grid connection status
```

This gives you the three core endpoints: `/api/meters/aggregates`, `/api/system_status/soe`, and `/api/system_status/grid_status`. Most other `/api/*` endpoints return 404 on the wired LAN. For full access to vitals, strings, firmware, components, and device-level data, use Full v1r mode below.

##### Getting a Bearer Token (curl / shell)

You can also access these endpoints directly without pypowerwall using a Bearer token:

```bash
# Get a Bearer token using the customer password (last 5 chars of GW password)
TOKEN=$(curl -sk -X POST https://10.0.1.50/api/login/Basic \
  -H ‘Content-Type: application/json’ \
  -d ‘{"username":"customer","password":"XXXXX","email":"user@example.com","force_sm_off":false}’ \
  | python3 -c "import sys,json; print(json.load(sys.stdin)[‘token’])")

# Power data (solar, battery, grid, load)
curl -sk -H "Authorization: Bearer $TOKEN" https://10.0.1.50/api/meters/aggregates

# Battery level (state of energy)
curl -sk -H "Authorization: Bearer $TOKEN" https://10.0.1.50/api/system_status/soe

# Grid connection status
curl -sk -H "Authorization: Bearer $TOKEN" https://10.0.1.50/api/system_status/grid_status
```

**Note:** The token is also returned in the response cookies (`AuthCookie` and `UserRecord`).

#### Full v1r LAN Access (RSA Key Required)

With an RSA key registered via `v1r_register.py`, you get full TEDapi access over the wired LAN — equivalent to what was previously only available over Wi-Fi:

> **Note:** The easiest way to register is using the Tesla Owner API (no developer app required) — just sign in with your Tesla account. Run `python -m pypowerwall register` and select option 1. If you already have FleetAPI set up (Option 2), you can also use those credentials by selecting option 2.

##### Requirements

1. **Wired LAN connection** to the Powerwall 3 gateway vendor subnet (see Network Requirements above)
2. **RSA-4096 key pair** registered with the Powerwall via Tesla Owner API or Fleet API
3. **Gateway password** (`gw_pwd` — from the QR sticker on the gateway; the last 5 characters are auto-derived for login)

##### RSA Key Registration

Use `v1r_register.py` (or `python -m pypowerwall register` after pip install) to generate and register an RSA-4096 key pair with the Powerwall:

```bash
python3 v1r_register.py
```

When prompted, select the registration method:
- **Option 1 — Tesla Owner API** (recommended): Just sign in with your Tesla account. No developer app needed.
- **Option 2 — Tesla Fleet API**: Requires a registered developer application (CLIENT_ID, CLIENT_SECRET, REDIRECT_URI).

The script will then:
1. Generate an RSA-4096 key pair (saves private key to `tedapi_rsa_private.pem`)
2. Walk you through Tesla OAuth to authorize the registration
3. Register the public key with the Powerwall
4. Prompt you to confirm registration by toggling a Powerwall breaker off and back on (if not auto-verified)

After the breaker toggle, wait for the Powerwall status light to turn from red back to white — this can take 30-60 seconds. The script will poll for confirmation and show whether the key was authorized.

**Note (Fleet API only):** Tesla Fleet API requires your application’s public key to be served at `https://{DOMAIN}/.well-known/appspecific/com.tesla.3p.public-key.pem`. A Cloudflare Worker or any static web host can serve this file.

##### Full v1r Python Example

```python
import pypowerwall

pw = pypowerwall.Powerwall(
    host="10.42.1.40",                         # Powerwall wired LAN IP (vendor subnet)
    gw_pwd="ABCDEXXXXX",                       # Full gateway password (last 5 auto-derived)
    email="user@example.com",
    timezone="America/Los_Angeles",
    rsa_key_path="/path/to/tedapi_rsa_private.pem"  # RSA key from v1r_register.py
)

# All standard methods work over v1r:
print(pw.level())       # Battery percentage
print(pw.power())       # {site, solar, battery, load} in watts
print(pw.solar())       # Solar power in watts
print(pw.battery())     # Battery power in watts
print(pw.grid())        # Grid power in watts
print(pw.load())        # Load power in watts
print(pw.version())     # Firmware version
print(pw.vitals())      # Per-device vitals (PVAC, PVS, TEPOD, PINV, etc.)
print(pw.strings())     # Solar string data
print(pw.alerts())      # Active device alerts

# API polling:
pw.poll(‘/api/meters/aggregates’)              # Detailed meter data
pw.poll(‘/api/system_status/soe’)              # Battery state of energy
pw.poll(‘/api/system_status/grid_status’)      # Grid connection status
pw.poll(‘/api/system_status’)                  # Full system status
pw.poll(‘/api/site_info’)                      # Site configuration
pw.poll(‘/api/operation’)                      # Operation mode
```

#### v1r Docker Proxy Setup

For always-on monitoring (e.g., with [Powerwall-Dashboard](https://github.com/jasonacox/Powerwall-Dashboard)), configure the proxy container with these environment variables:

```env
PW_HOST=10.42.1.40                  # Powerwall wired LAN IP (vendor subnet)
PW_GW_PWD=ABCDEXXXXX                # Full gateway password (last 5 auto-derived for login)
PW_TIMEZONE=America/Los_Angeles
PW_RSA_KEY_PATH=/app/.auth/tedapi_rsa_private.pem
```

Mount the RSA private key into the container at the path specified by `PW_RSA_KEY_PATH`.

> **Tip:** You no longer need to set both `PW_PASSWORD` and `PW_GW_PWD`. Just set `PW_GW_PWD` with the full gateway password — the last 5 characters are automatically used for `/api/login/Basic` authentication. Setting `PW_PASSWORD` explicitly still works for backward compatibility.

#### Password Configuration

pyPowerwall accepts the gateway password via `PW_GW_PWD` (the full password from the QR sticker). When v1r mode needs the 5-character customer password for `/api/login/Basic`, it is automatically derived from the last 5 characters of `PW_GW_PWD`. You can still set `PW_PASSWORD` explicitly for backward compatibility.

| Mode | `PW_GW_PWD` | `PW_PASSWORD` | `PW_RSA_KEY_PATH` | `PW_HOST` |
|------|:-----------:|:-------------:|:------------------:|:---------:|
| Option 4 full (WiFi) | required | — | — | 192.168.91.1 |
| Option 4 hybrid (WiFi) | required | required | — | 192.168.91.1 |
| Option 5 basic (LAN) | — | required | — | vendor subnet IP |
| Option 5 v1r (LAN) | required | auto-derived | required | vendor subnet IP |
| Option 1 local API | — | required | — | any |

#### v1r Feature Parity

| Feature | WiFi TEDapi (mode 4) | v1r LAN (mode 5) |
|---------|:--------------------:|:-----------------:|
| Config (site info, batteries) | Yes | Yes |
| Firmware version | Yes | Yes |
| Power (solar/battery/grid/load) | Yes | Yes |
| Battery level (%) | Yes | Yes |
| Grid status | Yes | Yes |
| Site info & operation mode | Yes | Yes |
| Per-device vitals (PVAC/PINV/POD) | Yes | Yes |
| Component queries (PCH/BMS/HVP) | Yes | Yes |
| Solar string data | Yes | Yes |
| Multi-PW follower queries | Yes | Yes |
| LAN control (reserve/mode/grid) | No | Yes |

#### v1r WiFi Fallback

When both the wired LAN (v1r) and WiFi TEDAPI connections are available, pyPowerwall transparently uses WiFi as a fallback transport for follower queries. This is automatically enabled when `PW_GW_PWD` is set alongside the v1r configuration. The proxy `/health` endpoint reports the active transports (e.g., `v1r_lan + wifi_tedapi`), and the mode string dynamically reflects what's active (e.g., `Local (v1r+wifi+control)`).

#### LAN Control (v1r)

In v1r mode, pyPowerwall can control the Powerwall directly over the wired LAN without requiring cloud access. Control commands are sent as config updates via the v1r filestore `updateFileRequest` mechanism (read-modify-write with optimistic locking).

Supported control operations:

| Control | Method | Values |
|---------|--------|--------|
| Backup reserve | `set_reserve(level)` | 0-100 (percentage) |
| Operation mode | `set_mode(mode)` | `self_consumption`, `backup` |
| Grid charging | `set_grid_charging(enable)` | `True` / `False` |
| Grid export | `set_grid_export(mode)` | `battery_ok`, `pv_only`, `never` |

```python
import pypowerwall

pw = pypowerwall.Powerwall(
    host="10.42.1.40",
    gw_pwd="ABCDEXXXXX",
    rsa_key_path="/path/to/tedapi_rsa_private.pem"
)

# Read current settings
print(pw.get_mode())            # "self_consumption"
print(pw.get_reserve())         # 20
print(pw.get_grid_charging())   # False
print(pw.get_grid_export())     # "pv_only"

# Set new values
pw.set_reserve(30)
pw.set_mode("backup")
pw.set_grid_charging(True)
pw.set_grid_export("battery_ok")

# Max backup (v1r only) - sets reserve to 100% for duration
pw.schedule_max_backup(3600)        # 1 hour
pw.cancel_max_backup()
print(pw.get_backup_events())       # {"manual_backup": {...}, "backup_events": [...]}
```

For proxy usage, set `PW_CONTROL_SECRET` and use the `/control/*` endpoints — no cloud setup needed when using v1r mode:

```env
PW_HOST=10.42.1.40
PW_GW_PWD=ABCDEXXXXX
PW_RSA_KEY_PATH=/app/.auth/tedapi_rsa_private.pem
PW_CONTROL_SECRET=YourSecretToken
```

```bash
# Read settings
curl http://localhost:8675/control/mode
curl http://localhost:8675/control/reserve
curl http://localhost:8675/control/grid_charging
curl http://localhost:8675/control/grid_export
curl http://localhost:8675/control/max_backup

# Set values
curl -X POST -d "value=backup&token=$PW_CONTROL_SECRET" http://localhost:8675/control/mode
curl -X POST -d "value=30&token=$PW_CONTROL_SECRET" http://localhost:8675/control/reserve
curl -X POST -d "value=true&token=$PW_CONTROL_SECRET" http://localhost:8675/control/grid_charging
curl -X POST -d "value=pv_only&token=$PW_CONTROL_SECRET" http://localhost:8675/control/grid_export
curl -X POST -d "value=3600&token=$PW_CONTROL_SECRET" http://localhost:8675/control/max_backup
curl -X POST -d "value=cancel&token=$PW_CONTROL_SECRET" http://localhost:8675/control/max_backup
```

> **Note:** LAN control requires v1r mode (RSA key registered). Basic LAN mode (no RSA key) does not support control operations. WiFi TEDAPI (mode 4) does not support LAN control — use FleetAPI cloud control instead.

### FreeBSD Install

FreeBSD users can install from ports or pkg [FreshPorts](https://www.freshports.org/net-mgmt/py-pypowerwall):

Via pkg:
```bash
# pkg install net-mgmt/py-pypowerwall
```

Via ports:
```bash
# cd /usr/ports/net-mgmt/py-pypowerwall/ && make install clean
```

Note: pyPowerwall installation will attempt to install these required Python packages: _requests_, _protobuf_ and _teslapy_.

## Programming with pyPowerwall

After importing pypowerwall, you simply create a handle for your Powerwall device 
and call functions to poll data. A simple example is below or see [example.py](example.py) for an extended version:

```python
import pypowerwall

# Optional: Turn on Debug Mode
# pypowerwall.set_debug(True)

# Select option you wish to use.
OPTION = 5

# Connect to Powerwall based on selected option
if OPTION == 1:
   # Option 1 - LOCAL MODE - Customer Login (Powerwall 2 and Powerwall+ only)
   password="password"
   email="email@example.com"
   host = "10.0.1.123"               # Address of your Powerwall Gateway
   timezone = "America/Los_Angeles"  # Your local timezone
   gw_pwd = None
   rsa_key_path = None

if OPTION == 2:
   # Option 2 - FLEETAPI MODE - Requires Setup (Powerwall & Solar-Only)
   host = password = email = ""
   timezone = "America/Los_Angeles"
   gw_pwd = None
   rsa_key_path = None

if OPTION == 3:
   # Option 3 - CLOUD MODE - Requires Setup (Powerwall & Solar-Only)
   host = password = ""
   email='email@example.com'
   timezone = "America/Los_Angeles"
   gw_pwd = None
   rsa_key_path = None

if OPTION == 4:
   # Option 4 - TEDAPI MODE - Requires access to Gateway (Powerwall 2, Powerwall+, and Powerwall 3)
   host = "192.168.91.1"
   gw_pwd = "ABCDEFGHIJ"
   password = email = ""
   timezone = "America/Los_Angeles"
   rsa_key_path = None
   # Uncomment the following for hybrid mode (Powerwall 2 and +)
   #password="password"
   #email="email@example.com"

if OPTION == 5:
   # Option 5 - v1r LAN TEDAPI MODE - Powerwall 3 wired LAN (requires RSA key registration)
   host = "10.0.1.50"                  # Powerwall wired LAN IP (vendor subnet)
   gw_pwd = "ABCDEXXXXX"              # Full gateway password from QR sticker (last 5 auto-derived)
   password = ""                       # Not needed — auto-derived from gw_pwd
   email = ""
   timezone = "America/Los_Angeles"
rsa_key_path = "/path/to/tedapi_rsa_private.pem"  # From v1r_register.py

# Note on gw_pwd (Gateway Password)
# - `gw_pwd` is the full Gateway Wi‑Fi password printed on the QR label.
# - Used directly for TEDAPI HTTP Basic Auth in mode 4 (WiFi).
# - In v1r mode (mode 5), the last 5 characters are auto-derived for /api/login/Basic.
# - You only need to set `gw_pwd` — setting `password` separately is optional (backward compatible).
# - If you set `gw_pwd` and leave `password` empty, pyPowerwall will:
#     - Auto-enable full TEDAPI mode (mode 4) if no `rsa_key_path` is set.
#     - Auto-enable v1r mode (mode 5) if `rsa_key_path` is set (derives last 5 chars).
# - On Powerwall 2/+ you can set both `password`/`email` and `gw_pwd` for hybrid mode
#   that combines customer APIs with TEDAPI for supplemental vitals data.
#
# Note on rsa_key_path (v1r LAN TEDapi)
# - Only needed for Powerwall 3 wired LAN access (mode 5) with full protobuf data.
# - Requires RSA-4096 key pair registered via Tesla Owner API or Fleet API (see v1r_register.py).
# - Without rsa_key_path, basic LAN mode still works for core power/battery/grid data.

# Connect to Powerwall - auto_select mode (local, fleetapi, cloud, tedapi, v1r)
pw = pypowerwall.Powerwall(host, password, email, timezone, gw_pwd=gw_pwd,
                           rsa_key_path=rsa_key_path, auto_select=True)

# Some System Info
print("Site Name: %s - Firmware: %s - DIN: %s" % (pw.site_name(), pw.version(), pw.din()))
print("System Uptime: %s\n" % pw.uptime())

# Pull Sensor Power Data
grid = pw.grid()
solar = pw.solar()
battery = pw.battery()
home = pw.home()

# Display Data
print("Battery power level: %0.0f%%" % pw.level())  # Actual level including 5% Tesla reserve
print("Tesla app level: %0.0f%%" % pw.level(scale=True))  # Level as shown in Tesla App
print("Combined power metrics: %r" % pw.power())
print("")

# Display Power in kW
print("Grid Power: %0.2fkW" % (float(grid)/1000.0))
print("Solar Power: %0.2fkW" % (float(solar)/1000.0))
print("Battery Power: %0.2fkW" % (float(battery)/1000.0))
print("Home Power: %0.2fkW" % (float(home)/1000.0))
print("")

# Raw JSON Payload Examples
print("Grid raw: %r\n" % pw.grid(verbose=True))
print("Solar raw: %r\n" % pw.solar(verbose=True))

# Display Device Vitals
print("Vitals: %r\n" % pw.vitals())

# Display String Data
print("String Data: %r\n" % pw.strings())

# Display System Status (e.g. Battery Capacity)
print("System Status: %r\n" % pw.system_status())
```

### pyPowerwall Module Class and Functions 

```
 set_debug(True, color=True)

 Classes
    Powerwall(host, password, email, timezone, pwcacheexpire, timeout, poolmaxsize,
        cloudmode, siteid, authpath, authmode, cachefile, fleetapi, auto_select, retry_modes, gw_pwd,
        rsa_key_path)

 Parameters
    host                      # Hostname or IP of the Tesla gateway; may include :port for non-standard HTTPS (e.g. 10.0.1.99:8443); default port is 443 if omitted
    password                  # Customer password for gateway
    email                     # (required) Customer email for gateway / cloud
    timezone                  # Desired timezone
    pwcacheexpire = 5         # Set API cache timeout in seconds
    timeout = 5               # Timeout for HTTPS calls in seconds
    poolmaxsize = 10          # Pool max size for HTTP connection reuse (persistent
                                connections disabled if zero)
    cloudmode = False         # If True, use Tesla cloud for data (default is False)
    siteid = None             # If cloudmode is True, use this siteid (default is None)
    authpath = ""             # Path to cloud auth and site files (default current directory)
    authmode = "cookie"       # "cookie" (default) or "token" - use cookie or bearer token for auth
    cachefile = ".powerwall"  # Path to cache file (default current directory)
    fleetapi = False          # If True, use Tesla FleetAPI for data (default is False)
    auth_path = ""            # Path to configfile (default current directory)
    auto_select = False       # If True, select the best available mode to connect (default is False)
    retry_modes = False       # If True, retry connection to Powerwall
    gw_pwd = None             # Full gateway password from QR sticker; used for TEDAPI (mode 4)
                                and auto-derived (last 5 chars) for v1r login (mode 5)
    rsa_key_path = None       # Path to RSA-4096 private key for v1r LAN TEDapi (Powerwall 3)

 Functions
   poll(api, json, force)    # Return data from Powerwall API (dict if json=True, bypass cache force=True)
   post(api, payload, json)  # Send payload to Powerwall API (dict if json=True)
    level(scale)              # Return battery power level percentage (scale=False: actual level, scale=True: Tesla app level)
    power()                   # Return power data returned as dictionary
    site(verbose)             # Return site sensor data (W or raw JSON if verbose=True)
    solar(verbose):           # Return solar sensor data (W or raw JSON if verbose=True)
    battery(verbose):         # Return battery sensor data (W or raw JSON if verbose=True)
    load(verbose)             # Return load sensor data (W or raw JSON if verbose=True)
    grid()                    # Alias for site()
    home()                    # Alias for load()
    vitals(json)              # Return Powerwall device vitals (dict or json if True)
    strings(json, verbose)    # Return solar panel string data
    din()                     # Return DIN
    uptime()                  # Return uptime - string hms format
    version()                 # Return system version
    status(param)             # Return status (JSON) or individual param
    site_name()               # Return site name
    temps()                   # Return Powerwall Temperatures
    alerts()                  # Return array of Alerts from devices
    system_status(json)       # Returns the system status
    battery_blocks(json)      # Returns battery specific information merged from system_status() and vitals()
    grid_status(type)         # Return the power grid status, type ="string" (default), "json", or "numeric"
                              #     - "string": "UP", "DOWN", "SYNCING"
                              #     - "numeric": -1 (Syncing), 0 (DOWN), 1 (UP)
    is_connected()            # Returns True if able to connect and login to Powerwall
    get_reserve(scale)        # Get Battery Reserve Percentage
    get_mode()                # Get Current Battery Operation Mode
    set_reserve(level)        # Set Battery Reserve Percentage
    set_mode(mode)            # Set Current Battery Operation Mode
    get_time_remaining()      # Get the backup time remaining on the battery
    set_operation(level, mode, json)        # Set Battery Reserve Percentage and/or Operation Mode
    set_grid_charging(mode)   # Enable or disable grid charging (mode = True or False)
    set_grid_export(mode)     # Set grid export mode (mode = battery_ok, pv_only, never)
    get_grid_charging()       # Get the current grid charging mode
    get_grid_export()         # Get the current grid export mode
```

## Tools

The following are some useful tools based on pypowerwall:

* [Powerwall Proxy](proxy) - Use this caching proxy to handle authentication to the Powerwall Gateway and make basic read-only API calls to /api/meters/aggregates (power metrics), /api/system_status/soe (battery level) and many [others](https://github.com/jasonacox/pypowerwall/blob/main/proxy/API.md). This is useful for metrics gathering tools like telegraf to pull metrics without needing to authenticate. Because pyPowerwall is designed to cache the auth and high frequency API calls, this will also reduce the load on the Gateway and prevent crash/restart issues that can happen if too many sessions are created on the Gateway.

* [Powerwall Simulator](simulator) - A Powerwall simulator to mimic the responses from the Tesla Powerwall Gateway. This is useful for testing purposes.

* [Powerwall Dashboard](https://github.com/jasonacox/Powerwall-Dashboard#powerwall-dashboard) - Monitoring Dashboard for the Tesla Powerwall using Grafana, InfluxDB, Telegraf and pyPowerwall.

## pyPowerwall Command Line Interface (CLI)

pyPowerwall includes a CLI for scanning your network, setting up cloud/gateway access, and querying or controlling your Powerwall.

```
Usage: PyPowerwall [-h] [-debug] [-authpath AUTHPATH]
                   {setup,login,authtoken,fleetapi,tedapi,register,scan,set,get,version}
                   ...

PyPowerwall Module v0.15.6

Global options (apply to all commands):
  -debug              Enable debug output
  -authpath PATH      Override auth file directory (default: PW_AUTH_PATH env var)

Commands (run <command> -h for full usage):
  setup               Setup Tesla Cloud, Fleet API, or v1r LAN TEDAPI access
  login               [Deprecated] Use: setup
  authtoken           Get a Tesla Cloud refresh token (prints to stdout)
  fleetapi            [Deprecated] Use: setup -fleetapi
  tedapi              Test TEDAPI connection to Powerwall Gateway
  register            Register RSA key with Powerwall (for v1r LAN mode)
  scan                Scan local network for Powerwall gateway
  set                 Set Powerwall operating mode and reserve level
  get                 Get Powerwall settings and power levels
  version             Print version information
```

### Setup

```bash
# Install pyPowerwall if you haven't already
python -m pip install pypowerwall

# Option 1 — Scan network for Powerwall gateways (local mode)
python -m pypowerwall scan

# Option 2 — Setup Tesla Fleet API (official)
python -m pypowerwall setup -fleetapi

# Option 3 — Setup Tesla Cloud (Owners API)
python -m pypowerwall setup

# Option 4 — Test TEDAPI Wi-Fi connection
python -m pypowerwall tedapi -gw_pwd ABCDEXXXXX

# Option 5 — Register RSA key for v1r LAN TEDAPI (Powerwall 3 wired LAN)
python -m pypowerwall setup -v1r
```

### `get` — Read Powerwall Status

Returns settings and live power levels. Choose a connection mode or omit for auto-select.

**Connection mode flags** (mutually exclusive, all optional):

| Flag | Mode | Required credentials |
|------|------|----------------------|
| _(none)_ | Auto-select from available config | — |
| `-local` | Local Gateway API (PW2/+) | `-host`, `-password` |
| `-cloud` | Tesla Cloud (Owners API) | prior `setup` |
| `-fleetapi` | Tesla Fleet API | prior `setup -fleetapi` |
| `-tedapi` | TEDAPI Wi-Fi | `-gw_pwd` (host defaults to `192.168.91.1`) |
| `-v1r` | v1r LAN TEDAPI (PW3) | `-host`, `-gw_pwd`, RSA key |

```bash
# Auto-select (uses available config/credentials)
python -m pypowerwall get
python -m pypowerwall get -format json
python -m pypowerwall get -format csv

# Local gateway
python -m pypowerwall get -local -host 10.0.1.123 -password XXXXX

# Tesla Cloud
python -m pypowerwall get -cloud

# Tesla Fleet API
python -m pypowerwall get -fleetapi

# TEDAPI (Wi-Fi — needs access to 192.168.91.1)
python -m pypowerwall get -tedapi -gw_pwd ABCDEXXXXX

# v1r LAN TEDAPI (Powerwall 3 wired LAN)
python -m pypowerwall get -v1r -host 10.42.1.40 -gw_pwd ABCDEXXXXX \
    -rsa_key_path ./tedapi_rsa_private.pem
```

Example output (`-format text`, the default):

```
pyPowerwall [0.15.6] - Get Powerwall settings using Local (v1r+wifi+control) mode.

  Site               Cox Power Plant
  Site ID            N/A
  DIN                1707000-11-M--TG1234567890TB
  Firmware           25.10.0
  Mode               self_consumption
  Reserve            20.0
  Battery Level      64.2
  Grid Status        UP
  Grid               12
  Home               5588.5
  Battery            1613
  Solar              3965
  Grid Charging      True
  Grid Export Mode   pv_only
  Time Remaining     N/A
```

### `set` — Control Powerwall

Accepts the same connection mode flags as `get`, plus control options:

```bash
# Set operating mode
python -m pypowerwall set -mode self_consumption
python -m pypowerwall set -mode backup
python -m pypowerwall set -mode autonomous

# Set battery reserve
python -m pypowerwall set -reserve 20

# Set reserve to current charge level
python -m pypowerwall set -current

# Grid charging and export
python -m pypowerwall set -gridcharging on
python -m pypowerwall set -gridcharging off
python -m pypowerwall set -gridexport battery_ok
python -m pypowerwall set -gridexport pv_only
python -m pypowerwall set -gridexport never

# Combine multiple settings in one call
python -m pypowerwall set -mode self_consumption -reserve 20 -gridcharging off

# Use a specific connection mode with set
python -m pypowerwall set -v1r -host 10.42.1.40 -gw_pwd ABCDEXXXXX \
    -rsa_key_path ./tedapi_rsa_private.pem -mode backup -reserve 100
```

### `scan` — Find Powerwall Gateways

```bash
# Scan Network for Powerwalls
python -m pypowerwall scan
```

Example Output
```
pyPowerwall Network Scanner [0.1.2]
Scan local network for Tesla Powerwall Gateways

    Your network appears to be: 10.0.1.0/24

    Enter Network or press enter to use 10.0.1.0/24:

    Running Scan...
      Host: 10.0.1.16 ... OPEN - Not a Powerwall
      Host: 10.0.1.26 ... OPEN - Not a Powerwall
      Host: 10.0.1.36 ... OPEN - Found Powerwall 1232100-00-E--TG123456789ABG
      Done

Discovered 1 Powerwall Gateway
     10.0.1.36 [1232100-00-E--TG123456789ABG]
```

## Example API Calls

The following APIs are a result of help from other projects as well as my own investigation. 

* pw.poll('/api/system_status/soe') - Battery percentage (JSON with float 0-100)

   ```json
   {"percentage":40.96227949234631}
   ```

* pw.poll('/api/meters/aggregates') - Site, Load, Solar and Battery (JSON)

   ```json
   {
      "site": {
         "last_communication_time": "2021-11-22T22:15:06.590577619-07:00",
         "instant_power": -23,
         "instant_reactive_power": -116,
         "instant_apparent_power": 118.25819210524064,
         "frequency": 0,
         "energy_exported": 3826.313294918422,
         "energy_imported": 1302981.2128324094,
         "instant_average_voltage": 209.59546822390985,
         "instant_average_current": 5.4655000000000005,
         "i_a_current": 0,
         "i_b_current": 0,
         "i_c_current": 0,
         "last_phase_voltage_communication_time": "0001-01-01T00:00:00Z",
         "last_phase_power_communication_time": "0001-01-01T00:00:00Z",
         "timeout": 1500000000,
         "num_meters_aggregated": 1,
         "instant_total_current": 5.4655000000000005
      },
      "battery": {
         "last_communication_time": "2021-11-22T22:15:06.590178016-07:00",
         "instant_power": 1200,
         "instant_reactive_power": 0,
         "instant_apparent_power": 1200,
         "frequency": 59.997,
         "energy_exported": 635740,
         "energy_imported": 730610,
         "instant_average_voltage": 242.15000000000003,
         "instant_average_current": -28.6,
         "i_a_current": 0,
         "i_b_current": 0,
         "i_c_current": 0,
         "last_phase_voltage_communication_time": "0001-01-01T00:00:00Z",
         "last_phase_power_communication_time": "0001-01-01T00:00:00Z",
         "timeout": 1500000000,
         "num_meters_aggregated": 2,
         "instant_total_current": -28.6
      },
      "load": {
         "last_communication_time": "2021-11-22T22:15:06.590178016-07:00",
         "instant_power": 1182.5,
         "instant_reactive_power": -130.5,
         "instant_apparent_power": 1189.6791584288599,
         "frequency": 0,
         "energy_exported": 0,
         "energy_imported": 2445454.899537491,
         "instant_average_voltage": 209.59546822390985,
         "instant_average_current": 5.641820455472543,
         "i_a_current": 0,
         "i_b_current": 0,
         "i_c_current": 0,
         "last_phase_voltage_communication_time": "0001-01-01T00:00:00Z",
         "last_phase_power_communication_time": "0001-01-01T00:00:00Z",
         "timeout": 1500000000,
         "instant_total_current": 5.641820455472543
      },
      "solar": {
         "last_communication_time": "2021-11-22T22:15:06.594908129-07:00",
         "instant_power": 10,
         "instant_reactive_power": 0,
         "instant_apparent_power": 10,
         "frequency": 59.988,
         "energy_exported": 1241170,
         "energy_imported": 0,
         "instant_average_voltage": 241.60000000000002,
         "instant_average_current": 0.04132231404958678,
         "i_a_current": 0,
         "i_b_current": 0,
         "i_c_current": 0,
         "last_phase_voltage_communication_time": "0001-01-01T00:00:00Z",
         "last_phase_power_communication_time": "0001-01-01T00:00:00Z",
         "timeout": 1000000000,
         "num_meters_aggregated": 1,
         "instant_total_current": 0.04132231404958678
      }
   }
   ```

* pw.strings(jsonformat=True)

   ```json 
   {
      "A": {
         "Connected": true,
         "Current": 1.81,
         "Power": 422.0,
         "State": "PV_Active",
         "Voltage": 230.0
      },
      "B": {
         "Connected": false,
         "Current": 0.0,
         "Power": 0.0,
         "State": "PV_Active",
         "Voltage": -2.5
      },
      "C": {
         "Connected": true,
         "Current": 4.47,
         "Power": 892.0,
         "State": "PV_Active",
         "Voltage": 202.4
      },
      "D": {
         "Connected": true,
         "Current": 4.44,
         "Power": 889.0,
         "State": "PV_Active_Parallel",
         "Voltage": 202.10000000000002
      }
   }
   ```

* pw.temps(jsonformat=True)

   ```json
   {
      "TETHC--2012170-25-E--TGxxxxxxxxxxxx": 17.5,
      "TETHC--3012170-05-B--TGxxxxxxxxxxxx": 17.700000000000003
   }
   ```

* pw.status(jsonformat=True)

   ```json
   {
      "din": "1232100-00-E--TGxxxxxxxxxxxx",
      "start_time": "2022-01-05 09:20:47 +0800",
      "up_time_seconds": "62h48m24.076725628s",
      "is_new": false,
      "version": "21.44.1 c58c2df3",
      "git_hash": "c58c2df39ec207708c4cde0c747db7cf31750f29",
      "commission_count": 8,
      "device_type": "teg",
      "sync_type": "v2.1",
      "leader": "",
      "followers": null,
      "cellular_disabled": false
   }
   ```
* pw.vitals(jsonformat=True)

   * Example Output: [here](https://github.com/jasonacox/pypowerwall/blob/main/docs/vitals-example.json)
   * Produces device vitals and alerts. For more information see [here](https://github.com/jasonacox/pypowerwall/tree/main/docs#devices-and-alerts).

* pw.grid_status(type="json")

   ```json
   {
    "grid_services_active": false,
    "grid_status": "SystemGridConnected"
   }
   ```
* pw.system_status(jsonformat=True)

   ```json
   {
    "all_enable_lines_high": true,
    "auxiliary_load": 0,
    "available_blocks": 2,
    "battery_blocks": [
        {
            "OpSeqState": "Active",
            "PackagePartNumber": "3012170-10-B",
            "PackageSerialNumber": "TG122xxx", 
            "Type": "",
            "backup_ready": true,
            "charge_power_clamped": false,
            "disabled_reasons": [],
            "energy_charged": 21410,
            "energy_discharged": 950,
            "f_out": 60.016999999999996,
            "i_out": 6.800000000000001,
            "nominal_energy_remaining": 13755,
            "nominal_full_pack_energy": 13803,
            "off_grid": false,
            "p_out": -370,
            "pinv_grid_state": "Grid_Compliant",
            "pinv_state": "PINV_GridFollowing",
            "q_out": -10,
            "v_out": 243.60000000000002,
            "version": "b0ec24329c08e4",
            "vf_mode": false,
            "wobble_detected": false
        },
        {
            "OpSeqState": "Active",
            "PackagePartNumber": "3012170-10-B",
            "PackageSerialNumber": "TG122yyy", 
            "Type": "",
            "backup_ready": true,
            "charge_power_clamped": false,
            "disabled_reasons": [],
            "energy_charged": 20460,
            "energy_discharged": 1640,
            "f_out": 60.016000000000005,
            "i_out": 3.6,
            "nominal_energy_remaining": 13789,
            "nominal_full_pack_energy": 13816,
            "off_grid": false,
            "p_out": -210,
            "pinv_grid_state": "Grid_Compliant",
            "pinv_state": "PINV_GridFollowing",
            "q_out": 20,
            "v_out": 243.20000000000002,
            "version": "b0ec24329c08e4",
            "vf_mode": false,
            "wobble_detected": false
        }
    ],
    "battery_target_power": -706,
    "battery_target_reactive_power": 0,
    "blocks_controlled": 2,
    "can_reboot": "Yes",
    "command_source": "Configuration",
    "expected_energy_remaining": 0,
    "ffr_power_availability_high": 11658,
    "ffr_power_availability_low": 194,
    "grid_faults": [
        {
            "alert_is_fault": false,
            "alert_name": "PINV_a006_vfCheckUnderFrequency",
            "alert_raw": 432374469357469696,
            "decoded_alert": "[{\"name\":\"PINV_alertID\",\"value\":\"PINV_a006_vfCheckUnderFrequency\"},{\"name\":\"PINV_alertType\",\"value\":\"Warning\"},{\"name\":\"PINV_a006_frequency\",\"value\":58.97,\"units\":\"Hz\"}]",
            "ecu_package_part_number": "1081100-22-U",
            "ecu_package_serial_number": "CN321365D2U06J",
            "ecu_type": "TEPINV",
            "git_hash": "b0ec24329c08e4",
            "site_uid": "1232100-00-E--TG120325001C3D",
            "timestamp": 1645733844019
        }
    ],
    "grid_services_power": 0,
    "instantaneous_max_apparent_power": 30690,
    "instantaneous_max_charge_power": 14000,
    "instantaneous_max_discharge_power": 20000,
    "inverter_nominal_usable_power": 11700,
    "last_toggle_timestamp": "2022-02-22T08:18:22.51778899-07:00",
    "load_charge_constraint": 0,
    "max_apparent_power": 10000,
    "max_charge_power": 10000,
    "max_discharge_power": 10000,
    "max_power_energy_remaining": 0,
    "max_power_energy_to_be_charged": 0,
    "max_sustained_ramp_rate": 2512500,
    "nominal_energy_remaining": 27624,
    "nominal_full_pack_energy": 27668,
    "primary": true,
    "score": 10000,
    "smart_inv_delta_p": 0,
    "smart_inv_delta_q": 0,
    "solar_real_power_limit": -1,
    "system_island_state": "SystemGridConnected"
   }
   ```

* pw.battery_blocks(jsonformat=True)

   ```json
   {  
      "TG122xxx": {
         "OpSeqState": "Active",
         "PackagePartNumber": "3012170-10-B",
         "THC_State": "THC_STATE_AUTONOMOUSCONTROL",
         "Type": "",
         "backup_ready": true,
         "charge_power_clamped": false,
         "disabled_reasons": [],
         "energy_charged": 21020,
         "energy_discharged": 880,
         "f_out": 60.016000000000005,
         "i_out": 2.7,
         "nominal_energy_remaining": 13812,
         "nominal_full_pack_energy": 13834,
         "off_grid": false,
         "p_out": -160,
         "pinv_grid_state": "Grid_Compliant",
         "pinv_state": "PINV_GridFollowing",
         "q_out": 20,
         "temperature": 21.799999999999997,
         "v_out": 243.9,
         "version": "b0ec24329c08e4",
         "vf_mode": false,
         "wobble_detected": false
      },
      "TG122yyy": {
         "OpSeqState": "Active",
         "PackagePartNumber": "3012170-10-B",
         "THC_State": "THC_STATE_AUTONOMOUSCONTROL",
         "Type": "",
         "backup_ready": true,
         "charge_power_clamped": false,
         "disabled_reasons": [],
         "energy_charged": 21020,
         "energy_discharged": 880,
         "f_out": 60.016000000000005,
         "i_out": 2.7,
         "nominal_energy_remaining": 13812,
         "nominal_full_pack_energy": 13834,
         "off_grid": false,
         "p_out": -160,
         "pinv_grid_state": "Grid_Compliant",
         "pinv_state": "PINV_GridFollowing",
         "q_out": 20,
         "temperature": 18.5,
         "v_out": 243.9,
         "version": "b0ec24329c08e4",
         "vf_mode": false,
         "wobble_detected": false
      }
   }
   ```


## Documentation

For detailed documentation, see the [Documentation Hub](docs/README.md).

### Quick Reference

* [Firmware Version History](docs/reference/firmware-history.md) - Complete history of Powerwall firmware versions and release notes
* [Device Information](docs/reference/devices.md) - Detailed information about Powerwall devices and alerts  
* [Alert Codes](docs/reference/alerts.md) - Comprehensive list of alert codes
* [Python API Reference](API.md) - Full API documentation

## Glossary

This is an unofficial list of terms that are seen in Powerwall responses and messages. 

* Site = Utility Grid
* Load = Home (think of it as the "load" that the battery or grid powers)
* instant_power = Current power (instant) - also called "true power" in wattage (W)
* instant_reactive_power = The dissipated power resulting from inductive and capacitive loads measured in volt-amperes reactive (VAR)
* instant_apparent_power = The combination of reactive and true power measure in volt-amperes (VA)
* energy_imported = kWh pulled from grid over a duration of time (since Powerwall commissioning it seems)
* energy_exported = kWh pushed to grid

### Support

There are several ways you can support this project.

* Submit ideas, issues, discussions and code! Thanks to our active community, the project continues to grow and improve. Your engagement and help is needed and appreciated.
* Tell others. If you find this useful, please share with others to help build our community.
* Help test the code. We need help testing the project on different platforms and systems. Report your finding and any suggestions to make it easier to better.
* Some of you have asked how you can contribute to help fund the project. This is work of love and a hobby. I'm not looking for financial help. However, if you are considering purchasing a Tesla Solar and/or Powerwall system, please take advantage of this code for a discount and I'll get a referral credit as well: https://www.tesla.com/referral/jason50054

## References

* Tesla Powerwall 2 – Local Gateway API documentation – https://github.com/vloschiavo/powerwall2
* TESLA PowerWall 2 Security Shenanigans – https://github.com/hackerschoice/thc-tesla-powerwall2-hack
* Powerwall Monitoring – https://github.com/mihailescu2m/powerwall_monitor
* Protocol Buffers (protobuf) Basics - https://developers.google.com/protocol-buffers/docs/pythontutorial
* Powerwall Dashboard - The project that started pypowerwall - https://github.com/jasonacox/Powerwall-Dashboard

# Acknowledgements

* [Tesla Energy](https://www.tesla.com/energy/design?referral=jason50054&redirect=no) - Tesla is not affiliated with this project but we want to thank the brilliant minds at Tesla for creating such a great system for solar home energy generation. Tesla and Powerwall are trademarks of Tesla, Inc.
* Tesla ([tesla.proto](tesla.proto)) Research and Credit to @brianhealey
* Status Functions - Thanks to @wcwong for contribution: system_status(), battery_blocks(), grid_status()
* Special thanks to the entire pypowerwall community for the great engagement, contributions and encouragement! See [RELEASE notes](https://github.com/jasonacox/pypowerwall/releases) for the ever growing list of improvements and contributors making this project possible.

## Other Tools and Similar Projects

* NetZero app - iOS and Android App for monitoring your System - https://www.netzeroapp.io/
* Python Tesla Powerwall API – https://github.com/jrester/tesla_powerwall
* GoTesla - go based Tesla API - https://github.com/bmah888/gotesla

## Contributors

<a href="https://github.com/jasonacox/pypowerwall/graphs/contributors">
  <img src="https://contrib.rocks/image?repo=jasonacox/pypowerwall" />
</a>

## Citation

If you wish to cite this project, please use:

```bibtex
@software{pyPowerwall,
  author = {Cox, Jason A.},
  title = {pyPowerwall: Python API for Tesla Powerwall and Solar Energy Data.},
  year = {2023},
  publisher = {GitHub},
  journal = {GitHub repository},
  howpublished = {\url{https://github.com/jasonacox/pypowerwall}},
}
```


================================================
FILE: RELEASE.md
================================================
# RELEASE NOTES

## v0.15.6 - Reserve Percent Scaling Fix + CLI Redesign

* Fix: `set_operation()` reserve percent scaling — reverse Tesla App scaling (0–100%) to raw API scale (5–100%) only in TEDAPI v1r mode, avoiding incorrect round-trip values in cloud and FleetAPI modes
* Fix: Correctly handle `level=0` in `set_reserve()` via `level is not None` check
* Fix: Revert universal scaling from `set_operation()`; move raw conversion into `PyPowerwallTEDAPI.post_api_operation()` where it belongs
* Fix: FleetAPI `get_api_system_status_soe()` was returning `battery_level()` (Tesla App-scaled, 0–100% usable) directly as the raw SOE percentage — missing the reverse-scaling applied by the cloud backend. This caused `level()` (default `scale=False`) to return the already-scaled app value instead of the physical percentage, making FleetAPI SOC appear ~2% lower than v1r/TEDAPI for the same battery. Fix: apply `soe = (percentage_charged + 5/0.95) * 0.95` to convert app scale → raw, matching the cloud backend.
* Fix: `get` command now reports SOC using `level(scale=True)` — matching the Tesla app display (usable capacity, 0–100% of non-reserved energy) rather than the raw physical percentage including Tesla's 5% buffer reserve.
* Fix: FleetAPI config validation in `Powerwall.__init__()` — changed `os.access(file, W_OK)` check (fails when file doesn't exist) to check directory writability when config file is absent, preventing spurious `PyPowerwallInvalidConfigurationParameter` on first-time setup
* Feat: CLI (`python -m pypowerwall`) redesigned for consistency across all connection modes
    * Replace string `-mode` flag on `get` (which clashed with `set -mode`) with explicit boolean connection flags: `-local`, `-cloud`, `-fleetapi`, `-tedapi`, `-v1r` — available on both `get` and `set`
    * **Backward compat:** `get -mode <value>` still accepted with a deprecation warning; e.g. `get -mode v1r` behaves identically to `get -v1r`
    * Add `-host`, `-password`, `-gw_pwd`, `-rsa_key_path` credential flags to `get` and `set` subcommands
    * Add global `-debug` and `-authpath` flags (via shared parent parser) available to every subcommand
    * `setup` subcommand now handles all auth flows: default/`-cloud` (Tesla Owners API), `-fleetapi` (Fleet API wizard), `-v1r` (RSA key registration) — replacing the now-deprecated `fleetapi` top-level command
    * `get` output expanded: adds `firmware`, `grid_status`, and `time_remaining` fields; `None` values display as `N/A` in text/CSV output
    * Pre-flight checks in `get` and `set`: if `-cloud` or `-fleetapi` is specified but the required config file is missing, a clear error message with setup instructions is printed before any connection attempt
    * Connection check (`is_connected()`) now runs before the output banner — no partial output on failure
    * `fleetapi` top-level command shows deprecation warning and points to `setup -fleetapi`; `login` command shows deprecation warning and exits
* Docs: Update `README.md` CLI section — new command list with global flags, connection mode flag reference table, examples for all 5 connection modes, updated setup commands (`fleetapi` → `setup -fleetapi`, `setup -v1r`)
* Release prep:
     * Bump library version to `0.15.6`
     * Update proxy pinned dependency to `pypowerwall==0.15.6`

## v0.15.5 - Native Python Tesla Authentication + v1r Key Verification Fixes

* Feat: Replace external `tesla-auth` binary dependency with native Python Tesla authentication — no more platform-specific binary downloads
* Feat: New `setup` command handles authentication and site selection in a single flow using a native WebView popup window (macOS, Windows, Linux)
* Feat: New `authtoken` command for obtaining a refresh token on a local machine, then using it on a remote/headless server
* Fix: Cross-platform WebView interception of `tesla://auth/callback` using WKWebView (macOS), WebView2 (Windows), and WebKit2GTK (Linux)
* Fix: `v1r_register.py` now verifies the specific newly-registered RSA key rather than any key in the authorized clients list — prevents false VERIFIED result when only the Tesla app key is verified (fixes #274)
* Fix: `tedapi_v1r.py` now detects and clearly logs `client authorization not verified` inner-payload errors, with actionable instructions to complete physical key verification — previously silently returned `None` with no diagnostic output
* Release prep:
     * Bump library version to `0.15.5`

## v0.15.4 - CLI Enhancements and Safety Guards

* Feat: `pypowerwall tedapi` CLI now accepts `-host HOST`, `-gw_pwd GW_PWD`, `-v1r`, `-password PASSWORD`, `-rsa_key_path RSA_KEY_PATH`, and `-wifi_host WIFI_HOST` flags, enabling full PW3 wired LAN (v1r) access directly from the command line
* Feat: `go_off_grid()` now requires `confirm=True` to prevent accidental islanding — calling without the flag logs an error and returns `None`
* Fix: Unsupported-method error logs in `go_off_grid()` and `reconnect_grid()` now include the backend class name for easier diagnosis
* Add: Unit tests for `go_off_grid()` confirm guard and CLI v1r argument forwarding/password derivation
* Release prep:
     * Bump library version to `0.15.4`
     * Update proxy pinned dependency to `pypowerwall==0.15.4`

## v0.15.3 - PW3 No-Solar None Handling

* Update scanner to use cidr by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/266
* Add go_off_grid() and reconnect_grid() for Powerwall island mode control by @bolagnaise in https://github.com/jasonacox/pypowerwall/pull/277
* Fix: Prevent `TypeError` in Powerwall 3 TEDAPI vitals parsing when `PCH_PvVoltage*` or `PCH_PvCurrent*` signals are `None` on systems without solar panels - by @anopheles in https://github.com/jasonacox/pypowerwall/pull/278
     * `get_pw3_vitals()` now guards `None` values before performing `> 0` comparisons
     * PV measured voltage, current, and power now safely report `0` when the gateway returns missing PV values
     * Prevents downstream failures in endpoints derived from PW3 vitals, including `/api/meters/aggregates`
     * Adds regression coverage for PW3 systems without solar panels so the no-solar path no longer raises and remains locked in by tests

* Release prep:
     * Bump library version to `0.15.3`
     * Update proxy pinned dependency to `pypowerwall==0.15.3`
     * Fix PyPI upload cleanup script to remove `pypowerwall.egg-info` instead of stale `tinytuya.egg-info`

## v0.15.2 - Minor Fixes

* v0.15.2 - Protobuf Support by @jasonacox in https://github.com/jasonacox/pypowerwall/pull/276
* Fix: Remove `<5` upper cap on `protobuf` runtime dependency — constraint is now `protobuf>=4.25.1`; pb2 files generated with 4.25.x are compatible with 5.x, 6.x, and 7.x runtimes (confirmed and tested up to 7.34.1) and the cap was causing pip conflicts for users with newer protobuf versions installed (e.g. via TensorFlow)

## v0.15.1 - Code Quality and Build Pipeline Improvements

* Fix: Remove duplicate stub methods `get_grid_charging()` and `get_grid_export()` in `pypowerwall_tedapi.py` that were left over from a merge — the real implementations (reading/writing config via v1r transport) were already present and being shadowed
* Fix: Update `pwsimulator` `stub.py` to use `ssl.SSLContext` API replacing the removed `ssl.wrap_socket()` call, which caused the simulator container to silently exit on Python 3.12+
* Fix: Remove `linux/arm/v7` platform from `pwsimulator` Docker build (`upload.sh`) — platform is no longer supported
* Fix: Correct protobuf runtime dependency — `protobuf>=3.20.0` was misleading; set floor to `protobuf>=4.25.1` (the `<5` upper cap added here was subsequently lifted in v0.15.2)
* Add: `.pylintrc` with `[MESSAGES CONTROL]` disable list (restored), `[SIMILARITIES]` config, and `ignore-paths` to skip auto-generated `*_pb2.py` files
* Add: `tools/gen_proto.sh` — script to regenerate all `*_pb2.py` files from `.proto` sources using pinned `grpcio-tools`
* Add: `tools/requirements-tools.txt` — pinned dev tools (`grpcio-tools<1.64`, `protobuf<5`) to ensure pb2 files are generated consistently with a compatible protobuf version
* Add: `.pre-commit-config.yaml` — pre-commit hooks for protobuf regeneration and `pylint -E` checks on `pypowerwall/` and `proxy/` before every commit
* Add: `.github/workflows/check-protobuf.yml` — CI workflow to verify committed `*_pb2.py` files are in sync with their `.proto` sources

## v0.15.0 - Powerwall 3 Wired LAN TEDAPI Support (v1r)

* Docs: Note FleetAPI/Cloud mode requirement for `get_grid_charging()` and `get_grid_export()` - by @jasonacox-sam in https://github.com/jasonacox/pypowerwall/pull/268
* Insert empty `battery_blocks` array if missing to prevent downstream KeyError - by @zi0r in https://github.com/jasonacox/pypowerwall/pull/269
* Fix: Prevent shared-state race condition in stubs via factory functions - by @woofiwoof in https://github.com/jasonacox/pypowerwall/pull/270
    * `API_METERS_AGGREGATES_STUB` and `API_SYSTEM_STATUS_STUB` in cloud/fleetapi/tedapi stubs were module-level mutable dicts; concurrent polling of multiple gateways caused threads to overwrite each other's data
    * Replaced module-level dicts with `_..._TEMPLATE` constants and factory functions that return `copy.deepcopy()` copies, ensuring each gateway gets an independent data structure
* Add `/tedapi/v1r` transport for Powerwall 3 wired LAN access without requiring WiFi connection to `192.168.91.1` - by @nalditopr in https://github.com/jasonacox/pypowerwall/pull/265
    * New `tedapi_v1r.py` RSA-signed transport class — handles TLV payload construction, PKCS1v15+SHA512 signing, RoutableMessage protobuf wrapping, and Bearer token authentication
    * New `tedapi_combined_pb2.py` — compiled protobuf definitions for v1r message format (`RoutableMessage`, `MessageEnvelope`, etc.)
    * New `pypowerwall register` CLI command (and `v1r_register.py` script) for generating an RSA-4096 key pair and registering it with the Powerwall via Tesla Owner API (default) or Fleet API OAuth
    * `Powerwall()` constructor accepts new `rsa_key_path` parameter — when provided alongside `password`/`gw_pwd`, the library automatically selects v1r mode
    * `gw_pwd` (full 10-character QR code password from the Powerwall sticker) auto-derives the last-5-character Basic API password, simplifying configuration
    * Proxy server supports new `PW_RSA_KEY_PATH` environment variable to pass the RSA key path through to `Powerwall()`
    * `cryptography` package added to `install_requires` for RSA key loading and signing
    * Full feature parity with WiFi TEDAPI (mode 4): config, status, vitals, firmware version, power, battery level, grid status, per-device vitals, and component queries
    * LAN control support — set backup reserve, operation mode, grid charging, and grid export directly over the wired LAN via v1r filestore config writes (no cloud API needed)
    * WiFi fallback transport — when both wired LAN and WiFi TEDAPI are available, v1r mode transparently uses WiFi for follower queries; mode string dynamically reflects active transports (e.g., `Local (v1r+wifi+control)`)
    * Requires the Powerwall 3 leader's ethernet port to be on a routable subnet (`10.42.1.x/24` is the TEG's dedicated wired interface); see PR notes for bridge setup examples
* Drop `linux/arm/v7` (32-bit ARMv7) platform support from the pypowerwall proxy Docker container builds

## v0.14.10 - Host Port Support

* Add support for `host:port` format in the `host` parameter for local mode connections - Fix for https://github.com/jasonacox/pypowerwall/issues/254
     * Allows specifying a non-standard HTTPS port (e.g. `192.168.1.50:8443` or `powerwall.local:8443`)
     * Defaults to port 443 when no port is specified in `host`
     * Enables travel router / NAT proxy setups where multiple Powerwall gateways are each mapped to distinct `ip:port` endpoints on the local network
     * Updated `_validate_init_configuration()` to validate bare host first, then strip the optional port suffix — prevents false port detection inside IPv6 addresses (e.g. `2001:db8::1` is never mistaken for a host with port `1`)
     * Fixed TEDAPI hybrid mode detection in `PyPowerwallLocal` to match `192.168.91.1:443` (explicit default port) in addition to bare `192.168.91.1`, ensuring TEDAPI activates for direct gateway connections regardless of whether the port is stated
     * URL construction in local and TEDAPI modes naturally handles `host:port` format via `https://{host}/...` string formatting
     * Note: IPv6 addresses are accepted by validation but full URL construction support (bracket notation per RFC 2732) is not yet implemented

## v0.14.9 - TEDAPI Voltage Calculation Fix

* Fix `compute_LL_voltage()` function to handle `None` voltage values in grid down scenarios - Fix for https://github.com/jasonacox/Powerwall-Dashboard/issues/683
     * Added `None` value handling in three-phase voltage calculations to prevent `TypeError` exceptions
     * Converts `None` voltage parameters to `0` before performing arithmetic operations
     * Prevents crashes when grid is down and voltage readings are unavailable
     * Added comprehensive unit tests to verify None handling behavior for all scenarios: grid down (all None), mixed None/valid values, and numeric-only values

## v0.14.8 - CLI Tool and PW3 Power Vitals Fix

* Add standalone `pypowerwall` command-line tool - installed automatically with pip
     * Added `entry_points` to `setup.py` to create console script
     * Refactored `__main__.py` to use a `main()` function as entry point
     * Users can now run `pypowerwall` command directly instead of `python -m pypowerwall`
     * Maintains backward compatibility - both methods work identically
     * Available commands: `pypowerwall scan`, `pypowerwall setup`, `pypowerwall fleetapi`, `pypowerwall get`, `pypowerwall set`, `pypowerwall version`
* Fix Powerwall 3 power output (PINV_Pout) in vitals for TEDAPI mode
     * Corrected signal source from `PCH_AcRealPowerAB` to `PCH_BatteryPower` for accurate per battery power reporting

## v0.14.7 - Reserve Level 0 Fix

* Fix bug where `pypowerwall set` command could not set battery reserve level to 0 - Fix by @ParaAdBellum in https://github.com/jasonacox/pypowerwall/pull/252
     * Changed default value for `-reserve` argument from `None` to `-1` (sentinel value)
     * Updated conditional checks to compare against `-1` instead of using truthiness evaluation
     * Previously, `not args.reserve` evaluated to `True` when reserve was set to 0, preventing the reserve from being set

## v0.14.6 - Firmware 25.42.2+ Support

* Add gzip decompression support for firmware 25.42.2+ TEDAPI responses - Fix by @bolagnaise in https://github.com/jasonacox/pypowerwall/pull/251
     * Gateway firmware 25.42.2 and later returns gzip-compressed responses for DIN and other TEDAPI endpoints
     * Added `decompress_response()` helper function to handle both compressed and uncompressed responses transparently
     * Updated all TEDAPI methods (`get_din()`, `get_config()`, `get_status()`, `get_device_controller()`, `get_firmware_version()`, `get_components()`, `get_battery_block()`) to decompress responses
     * Added error handling for UnicodeDecodeError in DIN decode operation to gracefully handle corrupted or invalid responses
     * Maintains backward compatibility with older firmware versions that return uncompressed responses

## v0.14.5 - Performance Improvements

* Performance Fixes and Improvements
     * Fix variable shadowing in `grid_status()` method: renamed `type` parameter to `output_type` to avoid shadowing Python's built-in `type()` function
     * Add backward compatibility for deprecated `type` parameter - still supported but `output_type` is now preferred
     * Fix return type annotation for `extract_grid_status()` method: changed from `str` to `Optional[str]` to accurately reflect function can return `None`
     * Add age and expiration logging to TEDAPI Components cache for debugging consistency
     * Proxy server build t86
* Rename incorrect unit test file (test_ prefix indicates unit tests) by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/226
* Simple reliability improvements by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/240
* Add aggregation unit tests by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/241
* Update all Python versions to be consistent by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/243
* Add CSV endpoint tests to the proxy by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/244
* Add csv/v2 endpoint unit tests by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/245

## v0.14.4 - Expansion Pack Energy Fix

* **Fix expansion pack energy data** by processing all BMS components in TEDAPI responses - Fix by @rlerdorf in https://github.com/jasonacox/pypowerwall/pull/239
* Refactored `get_pw3_vitals()` to process ALL BMS components and match them to batteries (main units and expansions) via HVP serial numbers
* Creates individual TEPOD entries in `/vitals` for each battery including expansion packs with accurate energy data
* Simplified `/pod` endpoint by removing complex subtraction-based energy calculation logic - expansion packs now appear automatically as TEPOD entries
* Refactored `get_blocks()` to retrieve expansion pack energy from vitals TEPOD entries instead of making separate API calls
* Improves data accuracy and reduces API calls by directly extracting expansion pack energy from parallel BMS/HVP component arrays
* Validated on system with 2 Powerwall 3 units (Leader + Follower) and 1 Expansion Pack showing correct energy values for all three batteries
* Proxy server build t85

## v0.14.3 - Battery Expansion and Grid Meter Support

* Add support for Powerwall 3 Battery Expansion Packs in TEDAPI mode - Fix for issue https://github.com/jasonacox/pypowerwall/issues/227 by @rlerdorf in https://github.com/jasonacox/pypowerwall/pull/236
* Battery expansions (battery-only units without inverters) now appear in `/pw/battery_blocks`, `/pod`, and `/tedapi/battery` endpoints
* The `get_blocks()` function now reads battery expansion data from the configuration's `battery_expansions` array and fetches BMS component data for each expansion unit
* Expansion units are identified with `"Type": "BatteryExpansion"` and include battery capacity metrics (`nominal_energy_remaining`, `nominal_full_pack_energy`)
* Inverter-related fields (`pinv_state`, `p_out`, `v_out`, etc.) are set to `None` for expansions since they don't have inverters
* The `/pod` endpoint calculates expansion pack energy by subtracting known battery values from system totals (individual expansion BMS data not exposed by Tesla)
* For multiple expansion packs, the first entry shows combined totals with "(combined)" suffix, while additional entries show `null` values
* Add support for TEMSA/MSA grid meter data in `/vitals` endpoint for Powerwall 3 systems
* PW3 MSA data fallback: reads from `components.msa` with signals array format conversion when `esCan.bus.MSA` is unavailable
* Voltage reference mapping: converts PW3 ground-referenced voltages (VL1G/VL2G/VL3G) to neutral-referenced (VL1N/VL2N/VL3N) for consistency
* TEMSA block in vitals now includes grid voltage, current, and instantaneous power readings for PW3 backup switches

## v0.14.2 - Misc

* Move API lock timeout messages in exponential backoff mechanism to DEBUG logging to prevent noise for regular users.

## v0.14.1 - Test Coverage & battery_blocks Fix

* Add unit tests expanding coverage: version parsing, core Powerwall methods (poll json output, power aggregation, grid_status numeric/json, alerts fallback path, set_operation validation, reserve/mode helpers, temps, site_name)
* Introduce stub client in tests for deterministic, offline execution
* Fix `battery_blocks()` KeyError when vitals include a battery serial not present in `/api/system_status` `battery_blocks` (create entry lazily)
* Harden battery temperature/state merge logic for mixed firmware/mode scenarios
* No public API changes


## v0.14.0 - Fix for TeslaPy and FleetAPI

* Pin and embed TeslaPy code patch directly into pyPowerwall to help address issue setting Powerwall Mode - see https://github.com/jasonacox/pypowerwall/issues/197
* FleetAPI CLI: improved error handling, skips incomplete sites, clearer output to help address issue where token can't be refreshed due to missing energy_site_id key - see https://github.com/jasonacox/pypowerwall/issues/198

## v0.13.2 - TEDAPI Lock Optimization

* Fix TEDAPI lock contention issues causing "Timeout for locked object" errors under concurrent load by optimizing cache-before-lock pattern in core functions
* Optimize `get_config()`, `get_status()`, `get_device_controller()`, `get_firmware_version()`, `get_components()`, and `get_battery_block()` to check cache before acquiring expensive locks
* Remove redundant API call in `pypowerwall_tedapi.py` `get_api_system_status()` method
* Fix proxy server KeyError when status response missing version or git_hash keys by using defensive key access
* Fix proxy server KeyError when auth dictionary missing AuthCookie or UserRecord keys in cookie mode
* Improve performance and reduce lock timeout errors in multi-threaded environments like the pypowerwall proxy server
* Enhance `compute_LL_voltage()` function with voltage threshold detection (100V) to better handle single-phase systems with residual voltages on inactive legs, as well as split- and three-phase systems.
* These optimizations benefit all methods that depend on the core TEDAPI functions, including `vitals()`, `get_blocks()`, and `get_battery_blocks()`

## v0.13.1 - TEDAPI Battery Blocks

* Fix missing battery_blocks data on PW3 with Multiple Powerwalls in Local Mode in https://github.com/jasonacox/pypowerwall/issues/131
* Fix errant API base URL check. by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/185
* Update TEDAPI to pull battery blocks from vitals for PW3 Systems by @jasonacox in https://github.com/jasonacox/pypowerwall/pull/184

## v0.13.0 - TEDAPI Updates

* Additional values /json endpoint by @erikgieseler in https://github.com/jasonacox/pypowerwall/pull/176
* Use Neurio for TEDAPI data when Tesla Remote Meter is not present by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/157
* Initial simple unit test by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/181
* Add connection pool to TEDAPI by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/177
* Add METER_Z (Backup Switch) data to vitals and aggregates data - See https://github.com/jasonacox/Powerwall-Dashboard/discussions/629#discussioncomment-13284217
* Update and add documentation helps: contributor, conduct and API (python and proxy)
* Fix logic for aggregates API for consolidated voltage and current data by @jasonacox in https://github.com/jasonacox/pypowerwall/pull/183

## v0.12.12 - Multiple PW3 Fix

* Bug Fix - Logic added in https://github.com/jasonacox/pypowerwall/pull/169 does not iterate through all PW3 strings. This adds logic to handle multiple PW3 string sets. Reported in https://github.com/jasonacox/pypowerwall/issues/172. 

## v0.12.11 - Error Handling

* Fix error handling in component data handling in TEDAPI.

## v0.12.10 - Power Flow and Other Fixes

* Add PROXY_BASE_URL option for reverse proxying by @mccahan in https://github.com/jasonacox/pypowerwall/pull/155
* Fix issue with power flow animation showing blank when opened more than once by @mccahan in https://github.com/jasonacox/pypowerwall/pull/156
* Add fan speed routes and update proxy version to t71 by @jasonacox in https://github.com/jasonacox/pypowerwall/pull/161
* Fix for
TypeError: PyPowerwallTEDAPI.vitals() got an unexpected keyword argument 'force' by @F1p in https://github.com/jasonacox/pypowerwall/pull/164
* Catch error condition when components payload is empty or malformed. Bug in extract_fan_speeds() reported by by @jgleigh in jasonacox/Powerwall-Dashboard#392 and https://github.com/jasonacox/pypowerwall/issues/167
* Issue #162: add /pw/XXX endpoints to expose Powerwall() API methods by @JohnJ9ml in https://github.com/jasonacox/pypowerwall/pull/166
* PW3 Vitals Fix - Switch from using device specific URI https://{GW_IP}/tedapi/device/{pw_din}/v1 to https://{GW_IP}/tedapi/v1 - Corrects 502 error condition on some Powerwall 3 systems by @johncuthbertuk in https://github.com/jasonacox/pypowerwall/pull/169

## v0.12.9 - Fan Speeds

* Add PVAC fan speeds to TEDAPI vitals monitoring (PVAC_Fan_Speed_Actual_RPM and PVAC_Fan_Speed_Target_RPM).

## v0.12.8 - TEDAPI Improvements

* Avoid divide by zero when nominalFullPackEnergyWh is zero by @rlpm in https://github.com/jasonacox/pypowerwall/pull/150
* Add thread locking to TEDAPI by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/148

## v0.12.7 - SystemConnectedToGrid Fix

* Alerts in extract_grid_status can be None. Block this edge case. #145

## v0.12.6 - Aggregates Data

* Updated aggregates call to include site current (METER_X) and external PV inverter data in solar (METER_Y). Reported in Issue #140.

## v0.12.5 - Normalize Alerts

* Fix an issue in TEDAPI where the grid status is not accurately reported in certain edge cases. Now, only the "SystemConnectedToGrid" alert will appear if it is present in alerts API. This update also eliminates the risk of duplicate and redundant ("SystemGridConnected") alerts and normalizes this specific alert. PR https://github.com/jasonacox/pypowerwall/pull/139 by @Nexarian

## v0.12.4 - Neurio Vitals

* Update proxy for /csv/v2 API support by @jasonacox in https://github.com/jasonacox/pypowerwall/pull/134
* Fix CTS data retrieval in TEDAPI vitals processor #136 by @jasonacox in https://github.com/jasonacox/pypowerwall/pull/137
* Fix bug in TEDAPI vitals processor that was not pulling in all Neurio CTS data. Issue reported in https://github.com/jasonacox/Powerwall-Dashboard/discussions/578#discussioncomment-12034018 and tracked in https://github.com/jasonacox/pypowerwall/issues/136.

## v0.12.3 - Custom GW IP

* Fix TEDAPI URL from constant GW_IP to constructor selectable host gw_ip by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/129 - The hard-coded 192.168.91.1 for the TEDAPI internal endpoint doesn't always work if you're using NAT. This change enables support for this use-case.
* See https://gist.github.com/jasonacox/91479957d0605248d7eadb919585616c?permalink_comment_id=5373785#gistcomment-5373785 for NAP implementation example.

## v0.12.2 - Cache Expiration Fix

* Fix bug in cache expiration timeout code that was not honoring pwcacheexpire setting. Raised by @erikgiesele in https://github.com/jasonacox/pypowerwall/issues/122 - PW_CACHE_EXPIRE=0 not possible? (Proxy)
* Add WARNING log in proxy for settings below 5s.
* Change TEDAPI config default timeout from 300s to 5s and link to pwcacheexpire setting.

## v0.12.1 - Scanner Update

* Large-scale refactor of scan function by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/117
     - Function `scan()` returns a list of the discovered devices for use as a utility function.
     - Ability to silence output for use as a utility.
     - Improve performance of multi-threaded scan by using a Queue.
     - General code flow improvements and encapsulation.
     - Add ability to work with standalone inverters.

```python
from pypowerwall.scan import scan
found_devices = scan(interactive = False)
```


## v0.12.0 - Add Controller Data

* TEDAPI: Add `get_device_controller()` to get device data which includes Powerwall THC_AmbientTemp data. Credit to @ygelfand for discovery and reported in https://github.com/jasonacox/Powerwall-Dashboard/discussions/392#discussioncomment-11360474
* Updated `vitals()` to include Powerwall temperature data. 
* Proxy Updated to t66 to include API response for /tedapi/controller.
* Remove Negative Solar Values [Option] by @jasonacox in https://github.com/jasonacox/pypowerwall/pull/113
* Solar-Only Cloud Access - Fix errors with site references by @Nexarian in https://github.com/jasonacox/pypowerwall/pull/115

## v0.11.1 - PW3 and FleetAPI Bugfix

* TEDAPI: Fix bug with activeAlerts logic causing errors on systems with multiple Powerwall 3's. Identified by @rmotapar in https://github.com/jasonacox/Powerwall-Dashboard/issues/387#issuecomment-2336431741 
* FleetAPI: Fix connect() to handle non-energy products in the getsites response. Identified by @gregrahn in https://github.com/jasonacox/pypowerwall/issues/111

## v0.11.0 - Add PW3 Vitals

* Add polling of Powerwall 3 Devices to pull in PW3 specific string data, capacity, voltages, frequencies, and alerts. 
* This creates mock TEPOD, PVAC and PVS compatible payloads available in vitals().

Proxy URLs updated for PW3:
* http://localhost:8675/vitals 
* http://localhost:8675/help (verify pw3 shows True) 
* http://localhost:8675/tedapi/components
* http://localhost:8675/tedapi/battery  

## v0.10.10 - Add Grid Control

* Add a function and command line options to allow user to get and set grid charging and exporting modes (see https://github.com/jasonacox/pypowerwall/issues/108).
* Supports FleetAPI and Cloud modes only (not Local mode)

#### Command Line Examples

```bash
# Connect to Cloud
python3 -m pypowerwall setup # or fleetapi

# Get Current Settings
python3 -m pypowerwall get

# Turn on Grid charging
python3 -m pypowerwall set -gridcharging on

# Turn off Grid charging
python3 -m pypowerwall  set -gridcharging off

# Set Grid Export to Solar (PV) energy only
python3 -m pypowerwall set -gridexport pv_only

# Set Grid Export to Battery and Solar energy
python3 -m pypowerwall set -gridexport battery_ok

# Disable export of all energy to grid
python3 -m pypowerwall set -gridexport never
```

#### Programming Examples

```python
import pypowerwall

# FleetAPI Mode
PW_HOST=""
PW_EMAIL="my@example.com"
pw = pypowerwall.Powerwall(host=PW_HOST, email=PW_EMAIL, fleetapi=True)

# Get modes
pw.get_grid_charging()
pw.get_grid_export()

# Set modes
pw.set_grid_charging("on") # set grid charging mode (on or off)
pw.set_grid_export("pv_only")   # set grid export mode (battery_ok, pv_only, or never)
```

## v0.10.9 - TEDAPI Voltage & Current

* Add computed voltage and current to `/api/meters/aggregates` from TEDAPI status data.
* Fix error in `num_meters_aggregated` calculation in aggregates.

## v0.10.8 - TEDAPI Firmware Version

* Add TEDAPI `get_firmware_version()` to poll Powerwall for firmware version. Discovered by @geptto in https://github.com/jasonacox/pypowerwall/issues/97. This function has been integrated into pypowerwall existing APIs (e.g. `pw.version()`)
* Add TEDAPI `get_components()` and `get_battery_block()` functions which providing additional Powerwall 3 related device vital information for Powerwall 3 owners. Discovered by @lignumaqua in https://github.com/jasonacox/Powerwall-Dashboard/discussions/392#discussioncomment-9864364. The plan it to integrate this data into the other device vitals payloads (TODO).

## v0.10.7 - Energy History

* FleetAPI - Add `get_history()` and `get_calendar_history()` to return energy, power, soe, and other history data.

```python
import pypowerwall

pw = pypowerwall.Powerwall(host=PW_HOST, email=PW_EMAIL, fleetapi=True)
pw.client.fleet.get_calendar_history(kind="soe")
pw.client.fleet.get_history(kind="power")
```

## v0.10.6 - pyLint Cleanup

* Minor Bug Fixes - TEDAPI get_reserve() fix to address unscaled results.
* pyLint Cleanup of Code

## v0.10.5 - Minor Fixes

* Fix for TEDAPI "full" (e.g. Powerwall 3) mode, including `grid_status` bug resulting in false reports of grid status, `level()` bug where data gap resulted in 0% state of charge and `alerts()` where data gap from tedapi resulted in a `null` alert.
* Add TEDAPI API call locking to limit load caused by concurrent polling.
* Proxy - Add battery full_pack and remaining energy data to `/pod` API call for all cases.

## v0.10.4 - Powerwall 3 Local API Support

* Add local support for Powerwall 3 using TEDAPI. 
* TEDAPI will activate in `hybrid` (using TEDAPI for vitals and existing local APIs for other metrics) or `full` (all data from TEDAPI) mode to provide better Powerwall 3 support.
* The `full` mode will automatically activate when the customer `password` is blank and `gw_pwd` is set.
* Note: The `full` mode will provide less metrics than `hybrid` mode since Powerwall 2/+ systems have additional APIs that are used in `hybrid` mode to fetch additional data

```python
import pypowerwall

# Activate HYBRID mode (for Powerwall / 2 / + systems)
pw = pypowerwall.Powerwall("192.168.91.1", password=PASSWORD, email=EMAIL, gw_pwd=PW_GW_PWD)

# Activate FULL mode (for all systems including Powerwall 3)
pw = pypowerwall.Powerwall("192.168.91.1", gw_pwd=PW_GW_PWD)
```

Related:
* #97 
* https://github.com/jasonacox/Powerwall-Dashboard/issues/387


## v0.10.3 - TEDAPI Connect Update

* Update `setup.py` to include dependencies on `protobuf>=3.20.0`.
* Add TEDAPI `connect()` logic to better validate Gateway endpoint access.
* Add documentation for TEDAPI setup.
* Update CLI to support TEDAPI calls.
* Proxy t60 - Fix edge case where `/csv` API will error due to NoneType inputs.
* Add TEDAPI argument to set custom GW IP address.

```bash
# Connect to TEDAPI and pull data
python3 -m pypowerwall tedapi

# Direct call to TEDAPI class test function (optional password)
python3 -m pypowerwall.tedapi GWPASSWORD
python3 -m pypowerwall.tedapi --debug
python3 -m pypowerwall.tedapi --gw_ip 192.168.91.1 --debug
```

## v0.10.2 - FleetAPI Hotfix

* Fix FleetAPI setup script as raised in https://github.com/jasonacox/pypowerwall/issues/98.
* Update FleetAPI documentation and CLI usage.

## v0.10.1 - TEDAPI Vitals Hotfix

* Fix PVAC lookup error logic in TEDAPI class vitals() function.
* Add alerts and other elements to PVAC TETHC TESYNC vitals.
* Update vitals Neurio block to include correct location and adjust RealPower based on power scale factor.

## v0.10.0 - New Device Vitals

* Add support for `/tedapi` API access on Gateway (requires connectivity to 192.168.91.1 GW and Gateway Password) with access to "config" and "status" data.
* Adds drop-in replacement for depreciated `/vitals` API and payload using the new TEDAPI class. This allows easy access to Powerwall device vitals.
* Proxy update to t58 to support TEDAPI with environmental variable `PW_GW_PWD` for Gateway Password. Also added FleetAPI, Cloud and TEDAPI specific GET calls, `/fleetapi`, `/cloud`, and `/tedapi` respectively.

```python
# How to Activate the TEDAPI Mode
import pypowerwall

gw_pwd = "GW_PASSWORD" # Gateway Passowrd usually on QR code on Gateway

host = "192.168.91.1" # Direct Connect to GW
pw = pypowerwall.Powerwall(host,password,email,timezone,gw_pwd=gw_pwd)
print(pw.vitals())
```

```python
# New TEDAPI Class
import pypowerwall.tedapi

tedapi = pypowerwall.tedapi.TEDAPI("GW_PASSWORD")

config = tedapi.get_config()
status = tedapi.get_status()

meterAggregates = status.get('control', {}).get('meterAggregates', [])
for meter in meterAggregates:
    location = meter.get('location', 'Unknown').title()
    realPowerW = int(meter.get('realPowerW', 0))
    print(f"   - {location}: {realPowerW}W")

```

## v0.9.1 - Bug Fixes and Updates

* Fix bug in time_remaining_hours() and convert print statements in FleetAPI to log messages.
* Fix CLI bug related to `site_id` as raised by @darroni in https://github.com/jasonacox/pypowerwall/issues/93
* Add CLI option for local mode to get status:

```bash
python -m pypowerwall get -host 10.1.2.3 -password 'myPassword'
```

## v0.9.0 - FleetAPI Support

* v0.9.0 - Tesla (official) FleetAPI cloud mode support by @jasonacox in https://github.com/jasonacox/pypowerwall/pull/91 - This adds the FleetAPI class and mapping for pypowerwall.
* FleetAPI setup provided by module CLI: `python -m pypowerwall fleetapi`
* Adds `auto_select` mode for instatiating a Powerwall connection: `local` mode, `fleetapi` mode and `cloud` mode. Provides `pw.mode` class variable as the mode selected.

```python
    import pypowerwall

    # Option 1 - LOCAL MODE - Credentials for your Powerwall - Customer Login
    password="password"
    email="email@example.com"
    host = "10.0.1.123"               # Address of your Powerwall Gateway
    timezone = "America/Los_Angeles"  # Your local timezone

    # Option 2 - FLEETAPI MODE - Requires Setup
    host = password = email = ""
    timezone = "America/Los_Angeles" 

    # Option 3 - CLOUD MODE - Requires Setup
    host = password = ""
    email='email@example.com'
    timezone = "America/Los_Angeles"
 
    # Connect to Powerwall - auto_select mode (local, fleetapi, cloud)
    pw = pypowerwall.Powerwall(host,password,email,timezone,auto_select=True)

    print(f"Connected to Powerwall with mode: {pw.mode}")
```

## v0.8.5 - Solar Only

* Fix bug with setup for certain Solar Only systems where setup process fails. Identified by @hulkster in https://github.com/jasonacox/Powerwall-Dashboard/discussions/475

## v0.8.4 - Set Reserve

* Updated `set_reserve(level)` logic to handle levels from 0 to 100. Identified by @spoonwzd in #85

## v0.8.3 - Error Handling

* Added additional error handling logic to clean up exceptions.
* Proxy: Added command APIs for setting backup reserve and operating mode.

## v0.8.2 - 503 Error Handling

* Added 5 minute cooldown for HTTP 503 Service Unavailable errors from API calls.
* Proxy: Added DISABLED API handling logic.

## v0.8.1 - Set battery reserve, operation mode

* Added `get_mode()`, `set_mode()`,`set_reserve()`,and `set_operation()` function to set battery operation mode and/or reserve level by @emptywee in https://github.com/jasonacox/pypowerwall/pull/78. Likely won't work in the local mode.
* Added basic validation for main class `__init__()` parameters (a.k.a. user input).
* Better handling of 401/403 errors from Powerwall in local mode.
* Handle 50x errors from Powerwall in local mode.
* Added Alerts for Grid Status `alerts()`.
* New command line functions (`set` and `get`):

```
usage: PyPowerwall [-h] {setup,scan,set,get,version} ...

PyPowerwall Module v0.8.1

options:
  -h, --help            show this help message and exit

commands (run <command> -h to see usage information):
  {setup,scan,set,get,version}
    setup               Setup Tesla Login for Cloud Mode access
    scan                Scan local network for Powerwall gateway
    set                 Set Powerwall Mode and Reserve Level
    get                 Get Powerwall Settings and Power Levels
    version             Print version information
```

## v0.8.0 - Refactoring

* Refactored pyPowerwall by @emptywee in https://github.com/jasonacox/pypowerwall/pull/77 including:
  * Moved Local and Cloud based operation code into respective modules, providing better abstraction and making it easier to maintain and extend going forward.
  * Made meaning of the `jsonformat` parameter consistent across all method calls (breaking API change).
  * Removed Python 2.7 support.
  * Cleaned up code and adopted a more pythoinc style.
* Fixed battery_blocks() for non-vitals systems.

## v0.7.12 - Cachefile, Alerts & Strings

* Added logic to pull string data from `/api/solar_powerwall` API if vitals data is not available by @jasonacox in #76.
* Added alerts from `/api/solar_powerwall` when vitals not present by @DerickJohnson in #75. The vitals API is not present in firmware versions > 23.44, this provides a workaround to get alerts.
* Allow customization of the cachefile location and name by @emptywee in #74 via `cachefile` parameter.

```python
# Example
import pypowerwall
pw = pypowerwall.Powerwall(
     host="10.1.2.30",
     password="secret",
     email="me@example.com",
     timezone="America/Los_Angeles",
     pwcacheexpire=5, 
     timeout=5, 
     poolmaxsize=10,
     cloudmode=False, 
     siteid=None, 
     authpath="", 
     authmode="cookie",
     cachefile=".powerwall",
     )
```

## v0.7.11 - Cooldown Mode

* Updated logic to disable vitals API calls for Firmware 23.44.0+
* Added rate limit detection and cooldown mode to allow Powerwall gateway time to recover.

## v0.7.10 - Cache 404 Responses

* Add cache and extended TTL for 404 responses from Powerwall as identified in issue https://github.com/jasonacox/Powerwall-Dashboard/issues/449. This will help reduce load on Powerwall gateway that may be causing rate limiting for some users (Firmware 23.44.0+).

## v0.7.9 - Cloud Grid Status

* Bug fix for correct grid status for Solar-Only systems on `cloud mode` (see https://github.com/jasonacox/Powerwall-Dashboard/issues/437)

## v0.7.8 - Cloud Fixes

* Fix enumeration of energy sites during `cloud mode` setup to handle incomplete sites with Unknown names or types by @dcgibbons in https://github.com/jasonacox/pypowerwall/pull/72 
* Proxy t41 Updates - Bug fixes for Solar-Only systems using `cloud mode` (see https://github.com/jasonacox/Powerwall-Dashboard/issues/437).

## v0.7.7 - Battery Data and Network Scanner

* Proxy t40: Use /api/system_status battery blocks data to augment /pod and /freq macro data APIs by @jasonacox in https://github.com/jasonacox/pypowerwall/pull/67 thanks to @ceeeekay in https://github.com/jasonacox/Powerwall-Dashboard/discussions/402#discussioncomment-8193776
* Network Scanner: Improve network scan speed by scanning multiple hosts simultaneously by @mcbirse in https://github.com/jasonacox/pypowerwall/pull/67. The number of hosts to scan simultaneously can be adjusted using the optional `-hosts=` argument (default = 30, maximum = 100), e.g. `python -m pypowerwall scan -hosts=50`

## v0.7.6 - 404 Bug Fix

* Fix Critical Bug - 404 HTTP Status Code Handling (Issue https://github.com/jasonacox/pypowerwall/issues/65).

## v0.7.5 - Cloud Mode Setup

* Added optional email address argument to Cloud Mode setup (`python -m pypowerwall setup -email=<email>`) by @mcbirse in https://github.com/jasonacox/pypowerwall/pull/64 to streamline Powerwall-Dashboard setup script.
* Updated network scanner output to advise Powerwall 3 is supported in Cloud Mode by @mcbirse in https://github.com/jasonacox/pypowerwall/pull/64

## v0.7.4 - Bearer Token Auth

pyPowerwall Updates
* This release adds the ability to use a Bearer Token for Authentication for the local Powerwall gateway API calls. This is selectable by defining `authmode='token'` in the initialization. The default mode uses the existing `AuthCookie` and `UserRecord` method.

```python
import pypowerwall

pw = pypowerwall.Powerwall(HOST, PASSWORD, EMAIL, TIMEZONE, authmode="token")
```

Proxy
* The above option is extended to the pyPowerwall Proxy via the environmental variable `PW_AUTH_MODE` set to cookie (default) or token.

Powerwall Network Scanner
* Added optional IP address argument to network scanner by @mcbirse in https://github.com/jasonacox/pypowerwall/pull/63. The Scan Function can now accept an additional argument `-ip=` to override the host IP address detection (`python -m pypowerwall scan -ip=192.168.1.100`). This may be useful where the host IP address/network cannot be detected correctly, for instance if pypowerwall is running inside a container.

## v0.7.3 - Cloud Mode Setup

* Setup will now check for `PW_AUTH_PATH` environmental variable to set the path for `.pypowerwall.auth` and `.pypowerwall.site` by @mcbirse in https://github.com/jasonacox/pypowerwall/pull/62
* Proxy t37 - Move signal handler to capture SIGTERM when proxy halts due to config error by @mcbirse in https://github.com/jasonacox/pypowerwall/pull/62. This ensures a containerized proxy will exit without delay when stopping or restarting the container.

## v0.7.2 - Cloud Auth Path

* Add pypowerwall setting to define path to cloud auth cache and site files in the initialization. It will default to current directory.
* Add pypowerwall setting to define energy site id in the initialization. It will default to None.

```python
import pypowerwall

pw = pypowerwall.Powerwall(email="email@example.com",cloudmode=True,siteid=1234567,authpath=".auth")
```

* Proxy will now use `PW_AUTH_PATH` as an environmental variable to set the path for `.pypowerwall.auth` and `.pypowerwall.site`.
* Proxy also has `PW_SITEID` as an environmental variable to set `siteid`.

## v0.7.1 - Tesla Cloud Mode

* Simulate Powerwall Energy Gateway via Tesla Cloud API calls. In `cloudmode` API calls to pypowerwall APIs will result in calls made to the Tesla API to fetch the data.

Cloud Mode Setup - Use pypowerwall to fetch your Tesla Owners API Token

```bash
python3 -m pypowerwall setup

# Token and site information stored in .pypowerwall.auth and .pypowerwall.site
```

Cloud Mode Code Example

```python
import pypowerwall
pw = pypowerwall.Powerwall(email="email@example.com",cloudmode=True)
pw.power()
# Output: {'site': 2977, 'solar': 1820, 'battery': -3860, 'load': 937}
pw.poll('/api/system_status/soe')
# Output: '{"percentage": 26.403205103271222}'
```

* Added new API function to compute estimated backup time remaining on the battery: `get_time_remaining()`

## v0.6.4 - Power Flow Animation

Proxy t29 Updates
* Default page rendered by proxy (http://pypowerwall:8675/) will render Powerflow Animation
* Animation assets (html, css, js, images, fonts, svg) will render from local filesystem instead of pulling from Powerwall TEG portal.
* Start prep for possible API removals from Powerwall TEG portal (see NOAPI settings)

Powerwall Network Scanner
* Adjust scan timeout default to 1,000ms (1s) to help with more consistent scans.

## v0.6.3 - Powerwall 3 Scan

* Added scan detection for new Powerwall 3 systems. API discovery is still underway so pypowerwall currently does not support Powerwall 3s. See https://github.com/jasonacox/Powerwall-Dashboard/issues/387

```
$ python3 -m pypowerwall scan

pyPowerwall Network Scanner [0.6.3]
Scan local network for Tesla Powerwall Gateways

    Your network appears to be: 10.0.1.0/24

    Enter Network or press enter to use 10.0.1.0/24: 

    Running Scan...
      Host: 10.0.1.2 ... OPEN - Not a Powerwall
      Host: 10.0.1.5 ... OPEN - Found Powerwall 3 [Currently Unsupported]
      Host: 10.0.1.8 ... OPEN - Not a Powerwall
      Host: 10.0.1.9 ... OPEN - Found Powerwall 3 [Currently Unsupported]
      Done                           

Discovered 2 Powerwall Gateway
     10.0.1.5 [Powerwall-3] Firmware Currently Unsupported - See https://tinyurl.com/pw3support
     10.0.1.9 [Powerwall-3] Firmware Currently Unsupported - See https://tinyurl.com/pw3support
```

## v0.6.2b - Proxy Grafana Support

* Proxy t28: Add a `grafana-dark` style for `PW_STYLE` settings to accommodate placing as iframe in newer Grafana versions (e.g. v9.4.14). See https://github.com/jasonacox/Powerwall-Dashboard/discussions/371.

## v0.6.2a - Proxy Graceful Exit

* Add alert PVS_a036_PvArcLockout by @JordanBelford in https://github.com/jasonacox/pypowerwall/pull/33
* Create `tessolarcharge.py` by @venturanc in https://github.com/jasonacox/pypowerwall/pull/36 &  https://github.com/jasonacox/pypowerwall/pull/37 & https://github.com/jasonacox/pypowerwall/pull/38
* Fix typos and spelling errors by @mcbirse in https://github.com/jasonacox/pypowerwall/pull/40
* Add alert definitions per #42 by @jasonacox in https://github.com/jasonacox/pypowerwall/pull/43
* Added two PVAC Alerts by @niabassey in https://github.com/jasonacox/pypowerwall/pull/46
* Added Firmware 23.28.1 to README.md by @niabassey in https://github.com/jasonacox/pypowerwall/pull/48
* Add proxy gracefully exit with SIGTERM by @rcasta74 in https://github.com/jasonacox/pypowerwall/pull/49

## v0.6.2 - Proxy Cache-Control

* PyPI 0.6.2
* Update docs for alerts by @DerickJohnson in https://github.com/jasonacox/pypowerwall/pull/29 and  https://github.com/jasonacox/pypowerwall/pull/30
* Fix Cache-Control no-cache header and allow for setting max-age, fixes #31 by @dkerr64 in https://github.com/jasonacox/pypowerwall/pull/32

## v0.6.1 - Add Grid Conditions

* PyPI 0.6.1
* Added new `SystemMicroGridFaulted` and `SystemWaitForUser` grid conditions to `grid_status()` function. Both are mapped to "DOWN" conditions. Discovery by @mcbrise in https://github.com/jasonacox/Powerwall-Dashboard/issues/158#issuecomment-1441648085.
* Revised error handling of SITE_DATA request due to issues noted in #12 when multiple sites are linked to the Tesla account by @mcbirse in https://github.com/jasonacox/pypowerwall/pull/25
* Proxy t24: Added new `/alerts/pw` endpoint with dictionary/object response format by @DerickJohnson in https://github.com/jasonacox/pypowerwall/pull/26

## v0.6.0 - Add Persistent HTTP Connections

* PyPI 0.6.0
* Added HTTP persistent connections for API requests to Powerwall Gateway by @mcbirse in https://github.com/jasonacox/pypowerwall/pull/21
* Requests to Gateway will now re-use persistent http connections which reduces load and increases response time.
* Uses default connection `poolmaxsize=10` to align with Session object defaults. Note: pool use applies to multi-threaded use of pyPowerwall only, e.g. as with the pyPowerwall Proxy Server.
* Added env `PW_POOL_MAXSIZE` to proxy server to allow this to be controlled (persistent connections disabled if set to zero).
* Added env `PW_TIMEOUT` to proxy server to allow timeout on requests to be adjusted.

## v0.5.1 - Fix grid_status() Off-Grid Map

* PyPI 0.5.1
* Add FreeBSD-specific installation instructions by @zi0r in https://github.com/jasonacox/pypowerwall/pull/18
* Add `grid_status()` responses for syncing to off-grid by @mcbirse in https://github.com/jasonacox/pypowerwall/pull/19

## v0.5.0 - Exception Handling for Powerwall Connection

* PyPI 0.5.0
* Added additional exception handling to help identify connection and login errors.
* Added `is_connected()` function to test for a successful connection to the Powerwall.
* Added firmware version to command line network scan (`python -m pypowerwall scan`)

[Proxy Server](https://github.com/jasonacox/pypowerwall/tree/main/proxy#pypowerwall-proxy-server) Updates (Build t16) - See [here](https://github.com/jasonacox/pypowerwall/blob/main/proxy/HELP.md#release-notes) for more Proxy Release notes.

* Add support for backup switch by @nhasan in https://github.com/jasonacox/pypowerwall/pull/12
* Add passthrough to Powerwall web interface and customize for iFrame displays by @danisla in https://github.com/jasonacox/pypowerwall/pull/14
* Remove scrollbars from web view by @danisla in https://github.com/jasonacox/pypowerwall/pull/15
* Add support for specifying a bind address by @zi0r in https://github.com/jasonacox/pypowerwall/pull/16
* Add shebang for direct execution by @zi0r in https://github.com/jasonacox/pypowerwall/pull/17

## v0.4.0 - Cache Bypass Option and New Functions

* PyPI 0.4.0
* Added parameter to `poll()` to force call (ignore cache)
* Added `alerts()` function to return an array of device alerts.
* Added `get_reserve()` function to return battery reserve setting.
* Added `grid_status()` function to return state of grid.
* Added `system_status()` function to return system status.
* Added `battery_blocks()` function to return battery specific information.
* Expanded class to include settings for cache expiration (`pwcacheexpire`) and connection `timeout`.

```python
# Force Poll
pw.poll('/api/system_status/soe',force=True)
'{"percentage":100}'

# Powerwall Alerts
pw.alerts()
['PodCommissionTime', 'GridCodesWrite', 'GridCodesWrite', 'FWUpdateSucceeded', 'THC_w155_Backup_Genealogy_Updated', 'PINV_a067_overvoltageNeutralChassis', 'THC_w155_Backup_Genealogy_Updated', 'PINV_a067_overvoltageNeutralChassis', 'PVS_a018_MciStringB', 'SYNC_a001_SW_App_Boot']

# Battery Reserve Setting
pw.get_reserve()
20.0

# State of Grid
pw.grid_status()
'UP'
```

## v0.3.0 - Device Vitals Alerts and Attributes

* PyPI 0.3.0
* Added alerts and additional attributes from `vitals()` output.
* Note: API change to `vitals()` output for dependant systems.

## v0.2.0 - Tesla Protocol Buffer Scheme Update

* PyPI 0.2.0
* Breaking change to Protobuf schema (PR #2) including:
* Files `tesla.proto` and `tesla_pb2.py`
* Impacted output from function `vitals()` and [examples/vitals.py](examples/vitals.py).

## v0.1.4 - Battery Level Percentage Scaling

* PyPI 0.1.4
* Changed "Network Scan" default timeout to 400ms for better detection.
* Added Tesla App style "Battery Level Percentage" Conversion option to `level()` to convert the level reading to the 95% scale used by the App. This converts the battery level percentage to be consistent with the Tesla App:

```python
>>> pw.level(scale=True)
39.971429212508326
>>> pw.level()
42.972857751882906
```

## v0.1.3 - Powerwall Temps

* PyPI 0.1.3
* Added `temp()` function to pull Powerwall temperatures.

```python
pw.temps(jsonformat=True)
```

```json
{
    "TETHC--2012170-25-E--TGxxxxxxxxxxxx": 17.5,
    "TETHC--3012170-05-B--TGxxxxxxxxxxxx": 17.700000000000003
}
```

## v0.1.2 - Error Handling and Proxy Stats

* PyPI 0.1.2
* Added better Error handling for calls to Powerwall with debug info for timeout and connection errors.
* Added timestamp stats to pypowerwall proxy server.py (via URI /stats and /stats/clear)

pyPowerwall Debug
```
DEBUG:pypowerwall [0.1.2]

DEBUG:loaded auth from cache file .powerwall
DEBUG:Starting new HTTPS connection (1): 10.0.1.2:443
DEBUG:ERROR Timeout waiting for Powerwall API https://10.0.1.2/api/devices/vitals
```

Proxy Stats
```json
{"pypowerwall": "0.1.2", "gets": 2, "errors": 3, "uri": {"/stats": 1, "/soe": 1}, "ts": 1641148636, "start": 1641148618, "clear": 1641148618}
```

## v0.1.1 - New System Info Functions

* PyPI 0.1.1
* Added stats to pypowerwall proxy server.py (via URI /stats and /stats/clear)
* Added Information Functions: `site_name()`, `version()`, `din()`, `uptime()`, and `status()`.

```python
     # Display System Info
     print("Site Name: %s - Firmware: %s - DIN: %s" % (pw.site_name(), pw.version(), pw.din()))
     print("System Uptime: %s\n" % pw.uptime())
```

## v0.1.0 - Vitals Data

* PyPI 0.1.0
* Added *protobuf* handling to support decoding the Powerwall Device Vitals data (requires protobuf package)
* Added function `vitals()` to pull Powerwall Device Vitals
* Added function `strings()` to pull data on solar panel strings (Voltage, Current, Power and State)

```python
     vitals = pw.vitals(jsonformat=False)
     strings = pw.strings(jsonformat=False, verbose=False)
```

## v0.0.3 - Binary Poll Function, Proxy Server and Simulator

* PyPI 0.0.3
* Added Proxy Server - Useful for metrics gathering tools like telegraf (see [proxy](proxy/)]).
* Added Powerwall Simulator - Mimics Powerwall Gateway responses for testing (see [pwsimulator](pwsimulator/)])
* Added raw binary poll capability to be able to pull *protobuf* formatted payloads like '/api/devices/vitals'.

```python
     payload = pw.poll('/api/devices/vitals')
```

## v0.0.2 - Scan Function

* PyPI 0.0.2
* pyPowerwall now has a network scan function to find the IP address of Powerwalls
```bash
# Scan Network for Powerwalls
python -m pypowerwall scan
```
Output Example:
```
pyPowerwall Network Scanner [0.0.2]
Scan local network for Tesla Powerwall Gateways

    Your network appears to be: 10.0.3.0/24

    Enter Network or press enter to use 10.0.3.0/24: 

    Running Scan...
      Host: 10.0.3.22 ... OPEN - Not a Powerwall
      Host: 10.0.3.45 ... OPEN - Found Powerwall 1234567-00-E--TG123456789ABC
      Done                           

Discovered 1 Powerwall Gateway
     10.0.1.45 [1234567-00-E--TG123456789ABC]
```

## v0.0.1 - Initial Release

* PyPI 0.0.1
* Initial Beta Release 0.0.1

================================================
FILE: _config.yml
================================================
theme: jekyll-theme-cayman

================================================
FILE: api_test.py
================================================
# Test Functions of the Powerwall API
import os

import pypowerwall

# Optional: Turn on Debug Mode
pypowerwall.set_debug(True)

# Credentials for your Powerwall - Customer Login Data
password = os.environ.get('PW_PASSWORD', 'password')
email = os.environ.get('PW_EMAIL', 'email@example.com')
host = os.environ.get('PW_HOST', 'localhost')  # Change to the IP of your Powerwall
timezone = os.environ.get('PW_TIMEZONE',
                          'America/Los_Angeles')  # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
auth_path = os.environ.get('PW_AUTH_PATH', "")
cachefile_path = os.environ.get('PW_CACHEFILE_PATH', ".cachefile")


def test_battery_mode_change(pw):
    original_mode = pw.get_mode(force=True)
    if original_mode != 'backup':
        new_mode = 'backup'
    else:
        new_mode = 'self_consumption'

    resp = pw.set_mode(mode=new_mode)
    if resp and resp.get('set_operation', {}).get('result') == 'Updated':
        # if we got a valid response from API, let's assume it worked :)
        installed_mode = resp.get('set_operation', {}).get('real_mode')
    else:
        # TODO: may need to poll API until change is detected (in cloud mode)
        installed_mode = pw.get_mode(force=True)
    if installed_mode != new_mode:
        print(f"Set battery operation mode to {new_mode} failed.")
    # revert to original value just in case
    pw.set_mode(mode=original_mode)


def test_battery_reserve_change(pw):
    original_reserve_level = pw.get_reserve(force=True)
    if original_reserve_level != 100:
        new_reserve_level = 100
    else:
        new_reserve_level = 50

    resp = pw.set_reserve(level=new_reserve_level)
    if resp and resp.get('set_backup_reserve_percent', {}).get('result') == 'Updated':
        # if we got a valid response from API, let's assume it worked :)
        installed_level = resp.get('set_backup_reserve_percent', {}).get('backup_reserve_percent')
    else:
        # TODO: may need to poll API until change is detected (in cloud mode)
        installed_level = pw.get_reserve(force=True)
    if installed_level != new_reserve_level:
        print(f"Set battery reserve level to {new_reserve_level}% failed.")
    # revert to original value just in case
    pw.set_reserve(level=original_reserve_level)


def test_post_functions(pw):
    # test battery reserve and mode change
    print("Testing set_operation()...")
    test_battery_mode_change(pw)
    test_battery_reserve_change(pw)
    print("Post functions test complete.")


def run(include_post_funcs=False):
    for h in [host, ""]:
        if h:
            print(f"LOCAL MODE: Connecting to Powerwall at {h}")
        else:
            print(f"CLOUD MODE: Connecting to Powerwall via Tesla API")
        print("---------------------------------------------------------")

        # Connect to Powerwall
        pw = pypowerwall.Powerwall(h, password, email, timezone, authpath=auth_path, cachefile=cachefile_path)

        # noinspection PyUnusedLocal
        aggregates = pw.poll('/api/meters/aggregates')
        # noinspection PyUnusedLocal
        coe = pw.poll('/api/system_status/soe')

        # Pull Sensor Power Data
        grid = pw.grid()
        solar = pw.solar()
        battery = pw.battery()
        home = pw.home()

        # Display Data
        battery_level = pw.level()
        combined_power_metrics = pw.power()
        print(f"Battery power level: \033[92m{battery_level:.0f}%\033[0m")
        print(f"Combined power metrics: \033[92m{combined_power_metrics}\033[0m")
        print("")

        # Display Power in kW
        print(f"Grid Power: \033[92m{float(grid) / 1000.0:.2f}kW\033[0m")
        print(f"Solar Power: \033[92m{float(solar) / 1000.0:.2f}kW\033[0m")
        print(f"Battery Power: \033[92m{float(battery) / 1000.0:.2f}kW\033[0m")
        print(f"Home Power: \033[92m{float(home) / 1000.0:.2f}kW\033[0m")
        print()

        # Raw JSON Payload Examples
        print(f"Grid raw: \033[92m{pw.grid(verbose=True)!r}\033[0m\n")
        print(f"Solar raw: \033[92m{pw.solar(verbose=True)!r}\033[0m\n")

        # Test each function
        print("Testing each function:")
        functions = [
            pw.poll,
            pw.level,
            pw.power,
            pw.site,
            pw.solar,
            pw.battery,
            pw.load,
            pw.grid,
            pw.home,
            pw.vitals,
            pw.strings,
            pw.din,
            pw.uptime,
            pw.version,
            pw.status,
            pw.site_name,
            pw.temps,
            pw.alerts,
            pw.system_status,
            pw.battery_blocks,
            pw.grid_status,
            pw.is_connected,
            pw.get_reserve,
            pw.get_mode,
            pw.get_time_remaining
        ]
        for func in functions:
            print(f"{func.__name__}()")
            print(f"{func()}")

        if include_post_funcs:
            test_post_functions(pw)

        print("All functions tested.")
        print("")
        print("Testing all functions and printing result:")
        input("Press Enter to continue...")
        print("")

        for func in functions:
            print(f"{func.__name__}()")
            print("\033[92m", end="")
            print(func())
            print("\033[0m")

        print("All functions tested.")
        print("")
        input("Press Enter to continue...")
        print("")

    print("All tests completed.")
    print("")


if __name__ == "__main__":
    run(include_post_funcs=True)


================================================
FILE: dashboard/README.md
================================================
# Powerwall Dashboard

Monitoring Dashboard for the Tesla Powerwall using Grafana, InfluxDB and Telegraf.  See [jasonacox/Powerwall-Dashboard](https://github.com/jasonacox/Powerwall-Dashboard).

![Dashboard](https://user-images.githubusercontent.com/836718/144769680-78b8abf4-4336-4672-9483-896b0476ec44.png)
![Strings](https://user-images.githubusercontent.com/836718/146310511-7863e4bb-7e43-40b9-9790-65c1d6ce24ba.png)

## Installation and Setup

See [jasonacox/Powerwall-Dashboard](https://github.com/jasonacox/Powerwall-Dashboard#requirements).  

## Credits

This is based on the great work by [mihailescu2m](https://github.com/mihailescu2m/powerwall_monitor) but has been modified to use pypowerwall as a proxy to the Powerwall and includes solar String graphs for Powerwall+ systems.


================================================
FILE: docs/README.md
================================================
# pyPowerwall Documentation

Welcome to the pyPowerwall documentation hub. This page provides organized access to all documentation resources for users, developers, and contributors.

## Getting Started

New to pyPowerwall? Start with the main [README](../README.md) for installation instructions and basic setup.

## How-To Guides

### View Local Tesla Powerwall Portal

The Powerwall 2 gateway has a web based portal that you can access to the power flow animation. This requires that you find the local IP address of you Powerwall.  You can do that using `pypowerwall`:


```bash
# Install pyPowerwall if you haven't already
python -m pip install pypowerwall

# Scan Network for Powerwall
python -m pypowerwall scan
```

After confirming your local network address space, it will scan your network looking for a Tesla Powerwall and respond with something like this:

```
Discovered 1 Powerwall Gateway
     10.0.1.23 [1234567-00-E--TG123456789ABC]
```

For Powerwall 2 and + systems, point your browser to that address http://10.0.1.23 and you will be able to log in and see the power details and flow animation:

[![portal.png](portal.png)](portal.png)

Note: This is not available for Powerwall 3 systems. See the [pypowerwall-server](https://github.com/jasonacox/pypowerwall-server) project for an alternative local portal.

### Solar Panel Strings

You can use pyPowerwall to grab individual string data.  It uses the protobuf payload from the 'vitals' API.

```python
import pypowerwall

# Credentials for your Powerwall
password='password'
email='email@example.com'
host = "10.0.1.123"               # Address of your Powerwall Gateway
timezone = "America/Los_Angeles"  # Your local timezone

# Connect to Powerwall
pw = pypowerwall.Powerwall(host,password,email,timezone)

# Print String Data in JSON
print(pw.strings(True))   # True = JSON format output
```

Output example:

```json
{
    "A": {
        "Connected": true,
        "Current": 1.81,
        "Power": 422.0,
        "State": "PV_Active",
        "Voltage": 230.0
    },
    "B": {
        "Connected": false,
        "Current": 0.0,
        "Power": 0.0,
        "State": "PV_Active",
        "Voltage": -2.5
    },
    "C": {
        "Connected": true,
        "Current": 4.47,
        "Power": 892.0,
        "State": "PV_Active",
        "Voltage": 202.4
    },
    "D": {
        "Connected": true,
        "Current": 4.44,
        "Power": 889.0,
        "State": "PV_Active_Parallel",
        "Voltage": 202.10000000000002
    }
}
```

### Device Vitals

Access detailed device vitals data from your Powerwall system:

```python
import pypowerwall

# Connect to Powerwall
pw = pypowerwall.Powerwall(host,password,email,timezone)

# Display Device Vitals
print("Device Vitals:\n %s\n" % pw.vitals(True))
```

Example Output: [vitals-example.json](vitals-example.json)

## Reference Documentation

### Firmware History
Complete list of Powerwall firmware versions, release dates, and known features/issues.
- [Firmware History](reference/firmware-history.md)

### Devices
Comprehensive information about Powerwall devices (STSTSM, TETHC, TEPOD, TEPINV, TESYNC, TEMSA, PVAC, PVS, NEURIO, TESLA) including ECU types, part numbers, and component relationships.
- [Device Reference](reference/devices.md)

### Alerts
Detailed alert codes and descriptions that may appear in device vitals.
- [Alert Codes](reference/alerts.md)

## API Documentation

Full API reference for pyPowerwall methods and endpoints.
- [API Documentation](../API.md)

## Contributing

Interested in contributing? See our contribution guidelines.
- [Contributing Guide](../CONTRIBUTING.md)
- [Code of Conduct](../CODE_OF_CONDUCT.md)


================================================
FILE: docs/api.txt
================================================
/api/auth/toggle/login
/api/auth/toggle/start
/api/auth/toggle/supported
/api/autoconfig/cancel
/api/autoconfig/retry
/api/autoconfig/run
/api/autoconfig/status
/api/config
/api/customer
/api/customer/registration
/api/customer/registration/legal
/api/devices/vitals
/api/logging
/api/logout
/api/meters
/api/meters/${e}/ct_config
/api/meters/${e}/cts
/api/meters/${e}/invert_cts
/api/meters/${o.serial}/cts
/api/meters/detect_wired_meters
/api/meters/inverter_meter_readings
/api/meters/readings
/api/meters/status
/api/networks
/api/networks/${e}/disconnect
/api/networks/client_protocols
/api/networks/enable_${e}
/api/networks/request_scan_wifi
/api/operation
/api/password/generate
/api/powerwalls
/api/powerwalls/enable_inverter_solar_meter_readings
/api/powerwalls/phase_detection
/api/powerwalls/phase_usages
/api/powerwalls/pvi_power_status
/api/powerwalls/scan
/api/powerwalls/status
/api/powerwalls/update
/api/site_info
/api/site_info/extra_programs
/api/site_info/grid_code
/api/site_info/grid_regions
/api/site_info/offgrid
/api/site_info/site_name
/api/site_info/timezone
/api/sitemaster/run
/api/sitemaster/run_for_commissioning
/api/sitemaster/stop
/api/solar_powerwall/reset
/api/status
/api/synchrometer/ct_voltage_references
/api/synchrometer/ct_voltage_references/options
/api/system/networks/conn_tests
/api/system/networks/ping_test
/api/system/testing
/api/system/testing/PINV_TEST
/api/system/update
/api/system/update/urgency
/api/system/update?force=true
/api/system_status/grid_faults
/api/system_status/grid_status
/api/troubleshooting/problems
/api/v2/islanding/mode


================================================
FILE: docs/reference/alerts.md
================================================
# Alerts

The following list details alerts potentially returned by the device vitals API (e.g., /api/device/vitals). This data is aggregated from two primary sources:

- [Tesla Residential Powerhub User Manual](https://energylibrary.tesla.com/docs/Public/More/Powerhub/Residential/UserManual/en-us/GUID-C91CB9E0-8909-4440-8796-551470CE9539.html) (Official)
- Community Contributions (Unofficial)

This list is non-exhaustive and may not cover every possible alert code.

> [!WARNING]
> Alert descriptions labeled as `Community Contributed` are generated through user observation and best-effort reverse engineering. These descriptions are not official Tesla documentation. They may contain inaccuracies or incomplete information.

## Alert List

 - [AC Blade Connector Damaged](#ac-blade-connector-damaged)
 - [Backfeed Limited (BackfeedLimited)](#backfeed-limited-(backfeedlimited))
 - [Battery Breaker Open](#battery-breaker-open)
 - [Battery Comms](#battery-comms)
 - [Battery Fault (BatteryFault)](#battery-fault-(batteryfault))
 - [Battery Meter Comms](#battery-meter-comms)
 - [Battery Unexpected Power](#battery-unexpected-power)
 - [Battery Unexpected Reactive Power](#battery-unexpected-reactive-power)
 - [Black Start Failure](#black-start-failure)
 - [Busway Meter Comms](#busway-meter-comms)
 - [Contactor Unresponsive Close](#contactor-unresponsive-close)
 - [DC Bus Bar Shorted](#dc-bus-bar-shorted)
 - [External IO Comms](#external-io-comms)
 - [Frequency Meter Comms](#frequency-meter-comms)
 - [FWUpdateSucceeded](#fwupdatesucceeded)
 - [Generator Breaker Timeout](#generator-breaker-timeout)
 - [Generator Faulted](#generator-faulted)
 - [Generator Meter Comms](#generator-meter-comms)
 - [GridCodesWrite](#gridcodeswrite)
 - [Grid Resynchronization Failed](#grid-resynchronization-failed)
 - [Inverter Not Going To Vf](#inverter-not-going-to-vf)
 - [Islanding Controller MIA](#islanding-controller-mia)
 - [Load Meter Comms](#load-meter-comms)
 - [Lost Connectivity to Tesla Site Controller](#lost-connectivity-to-tesla-site-controller)
 - [No Solar Production](#no-solar-production)
 - [Opticaster Exe](#opticaster-exe)
 - [Permanent Battery Module Fault](#permanent-battery-module-fault)
 - [PINV_a010_can_gtwMIA](#pinv_a010_can_gtwmia)
 - [PINV_a039_can_thcMIA](#pinv_a039_can_thcmia)
 - [PINV_a067_overvoltageNeutralChassis](#pinv_a067_overvoltageneutralchassis)
 - [POD_f029_HW_CMA_OV](#pod_f029_hw_cma_ov)
 - [POD_w024_HW_Fault_Asserted](#pod_w024_hw_fault_asserted)
 - [POD_w029_HW_CMA_OV](#pod_w029_hw_cma_ov)
 - [POD_w031_SW_Brick_OV](#pod_w031_sw_brick_ov)
 - [POD_w044_SW_Brick_UV_Warning](#pod_w044_sw_brick_uv_warning)
 - [POD_w045_SW_Brick_OV_Warning](#pod_w045_sw_brick_ov_warning)
 - [POD_w048_SW_Cell_Voltage_Sens](#pod_w048_sw_cell_voltage_sens)
 - [POD_w058_SW_App_Boot](#pod_w058_sw_app_boot)
 - [POD_w063_SW_SOC_Imbalance](#pod_w063_sw_soc_imbalance)
 - [POD_w067_SW_Not_Enough_Energy_Precharge](#pod_w067_sw_not_enough_energy_precharge)
 - [POD_w090_SW_SOC_Imbalance_Limit_Charge](#pod_w090_sw_soc_imbalance_limit_charge)
 - [POD_w093_SW_Charge_Request](#pod_w093_sw_charge_request)
 - [POD_w105_SW_EOD](#pod_w105_sw_eod)
 - [POD_w109_SW_Self_Test_Request_Not_Serviced](#pod_w109_sw_self_test_request_not_serviced)
 - [POD_w110_SW_EOC](#pod_w110_sw_eoc)
 - [PodCommissionTime](#podcommissiontime)
 - [Powerwall Inverter Failure](#powerwall-inverter-failure)
 - [Powerwall Performance Limited](#powerwall-performance-limited)
 - [PV Inverter Comms](#pv-inverter-comms)
 - [PVS_a018_MciString[A-D]](#pvs_a018_mcistring[a-d])
 - [PVS_a026_Mci1PvVoltage](#pvs_a026_mci1pvvoltage)
 - [PVS_a027_Mci2PvVoltage](#pvs_a027_mci2pvvoltage)
 - [PVS_a031_Mci3PvVoltage](#pvs_a031_mci3pvvoltage)
 - [PVS_a032_Mci4PvVoltage](#pvs_a032_mci4pvvoltage)
 - [PV String Out](#pv-string-out)
 - [Pyranometer Comms](#pyranometer-comms)
 - [Ramp Rate Limited](#ramp-rate-limited)
 - [Reactive Power Limited](#reactive-power-limited)
 - [Real Power Available Limited (RealPowerAvailableLimited)](#real-power-available-limited-(realpoweravailablelimited))
 - [Real Power Config Limited](#real-power-config-limited)
 - [ScheduledIslandContactorOpen](#scheduledislandcontactoropen)
 - [SelfConsumptionReservedLimit](#selfconsumptionreservedlimit)
 - [Site Max Power Limited](#site-max-power-limited)
 - [Site Meter Comms](#site-meter-comms)
 - [Site Min Power Limited (SiteMinPowerLimited)](#site-min-power-limited-(siteminpowerlimited))
 - [Smart Inverter Active](#smart-inverter-active)
 - [Solar Charge Only Limited (SolarChargeOnlyLimited)](#solar-charge-only-limited-(solarchargeonlylimited))
 - [Solar Meter Comms](#solar-meter-comms)
 - [SYNC_a001_SW_App_Boot](#sync_a001_sw_app_boot)
 - [SYNC_a038_DoOpenArguments](#sync_a038_doopenarguments)
 - [System shutdown](#system-shutdown)
 - [THC_w061_CAN_TX_FIFO_Overflow](#thc_w061_can_tx_fifo_overflow)
 - [THC_w155_Backup_Genealogy_Updated](#thc_w155_backup_genealogy_updated)
 - [Wait for Solar](#wait-for-solar)
 - [Waiting for Jumpstart - Low SOE](#waiting-for-jumpstart---low-soe)

---

### AC Blade Connector Damaged

- **UI Name**: `AC Blade Connector Damaged`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `RMA`
- **Device**: 

Detected AC blade connector damage. Solar Inverter/assembly damaged, impacting solar production.

---

### Backfeed Limited (BackfeedLimited)

- **UI Name**: `Backfeed Limited`
- **API Name**: `BackfeedLimited`
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.6`
- **Severity**: 
- **Device**: `STSTSM`

The system is configured for inadvertent export and therefore will not further discharge to respect this limit

---

### Battery Breaker Open

- **UI Name**: `Battery Breaker Open`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

There is an open breaker between the site meter and the powerwall itself. The meter will automatically detect when the breaker is closed again.

---

### Battery Comms

- **UI Name**: `Battery Comms`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Critical`
- **Device**: 

Loss of communication to one or more inverter blocks.

---

### Battery Fault (BatteryFault)

- **UI Name**: `Battery Fault`
- **API Name**: `BatteryFault`
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Critical`
- **Device**: `STSTSM`

One or more inverter blocks is in a faulted state.

---

### Battery Meter Comms

- **UI Name**: `Battery Meter Comms`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

Loss of communications with Battery Meter.

---

### Battery Unexpected Power

- **UI Name**: `Battery Unexpected Power`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.6`
- **Severity**: 
- **Device**: 

Commanded real power does not match measured power from battery meter

---

### Battery Unexpected Reactive Power

- **UI Name**: `Battery Unexpected Reactive Power`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.6`
- **Severity**: 
- **Device**: 

Commanded reactive power does not match measured power from battery meter

---

### Black Start Failure

- **UI Name**: `Black Start Failure`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Critical`
- **Device**: 

The battery system was unable to black start.

---

### Busway Meter Comms

- **UI Name**: `Busway Meter Comms`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

Loss of communications with Busway Meter.

---

### Contactor Unresponsive Close

- **UI Name**: `Contactor Unresponsive Close`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Critical`
- **Device**: 

The islanding controller was unable to open the islanding contactor/circuit breaker.

---

### DC Bus Bar Shorted

- **UI Name**: `DC Bus Bar Shorted`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `RMA`
- **Device**: 

Detected DC bus bar short. Solar Inverter/assembly is damaged, impacting solar production.

---

### External IO Comms

- **UI Name**: `External IO Comms`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

Loss of communications with External IO device.

---

### Frequency Meter Comms

- **UI Name**: `Frequency Meter Comms`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

Loss of communications with Frequency Meter.

---

### FWUpdateSucceeded

- **UI Name**: 
- **API Name**: `FWUpdateSucceeded`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `STSTSM`

Firmware Upgrade Succeeded

---

### Generator Breaker Timeout

- **UI Name**: `Generator Breaker Timeout`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

The generator was unable to close its breaker within the timeout window.

---

### Generator Faulted

- **UI Name**: `Generator Faulted`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Critical`
- **Device**: 

The generator is in a faulted state.

---

### Generator Meter Comms

- **UI Name**: `Generator Meter Comms`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

Loss of communications with Generator Meter.

---

### GridCodesWrite

- **UI Name**: 
- **API Name**: `GridCodesWrite`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `STSTSM`



---

### Grid Resynchronization Failed

- **UI Name**: `Grid Resynchronization Failed`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

The islanding controller was unable to synchronize and close the islanding contactor/circuit breaker within 5 minutes.

---

### Inverter Not Going To Vf

- **UI Name**: `Inverter Not Going To Vf`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Critical`
- **Device**: 

The battery system is not transitioning to grid-forming mode.

---

### Islanding Controller MIA

- **UI Name**: `Islanding Controller MIA`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Critical`
- **Device**: 

Loss of communications with the islanding controller.

---

### Load Meter Comms

- **UI Name**: `Load Meter Comms`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

Loss of communications with Load Meter.

---

### Lost Connectivity to Tesla Site Controller

- **UI Name**: `Lost Connectivity to Tesla Site Controller`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

The Tesla Site Controller (or Gateway) has lost connectivity to Tesla Servers. Monitoring and management capabilities are currently limited.

---

### No Solar Production

- **UI Name**: `No Solar Production`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

One or more of the solar inverters have not produced any energy in the past 24 hours. There might be an issue impacting solar production.

---

### Opticaster Exe

- **UI Name**: `Opticaster Exe`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Critical`
- **Device**: 

Opticaster failed to run on the Tesla Site Controller and the battery system is not being dispatched.

---

### Permanent Battery Module Fault

- **UI Name**: `Permanent Battery Module Fault`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `RMA`
- **Device**: 

The Powerwall battery mode has permanently faulted and product needs replacement.

---

### PINV_a010_can_gtwMIA

- **UI Name**: 
- **API Name**: `PINV_a010_can_gtwMIA`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPINV`

Indicate that gateway/sync is MIA (seen during firmware upgrade reboot)

---

### PINV_a039_can_thcMIA

- **UI Name**: 
- **API Name**: `PINV_a039_can_thcMIA`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPINV`

Seems to indicate that Home Controller is MIA (seen during firmware upgrade reboot)

---

### PINV_a067_overvoltageNeutralChassis

- **UI Name**: 
- **API Name**: `PINV_a067_overvoltageNeutralChassis`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPINV`



---

### POD_f029_HW_CMA_OV

- **UI Name**: 
- **API Name**: `POD_f029_HW_CMA_OV`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### POD_w024_HW_Fault_Asserted

- **UI Name**: 
- **API Name**: `POD_w024_HW_Fault_Asserted`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### POD_w029_HW_CMA_OV

- **UI Name**: 
- **API Name**: `POD_w029_HW_CMA_OV`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### POD_w031_SW_Brick_OV

- **UI Name**: 
- **API Name**: `POD_w031_SW_Brick_OV`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### POD_w044_SW_Brick_UV_Warning

- **UI Name**: 
- **API Name**: `POD_w044_SW_Brick_UV_Warning`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### POD_w045_SW_Brick_OV_Warning

- **UI Name**: 
- **API Name**: `POD_w045_SW_Brick_OV_Warning`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### POD_w048_SW_Cell_Voltage_Sens

- **UI Name**: 
- **API Name**: `POD_w048_SW_Cell_Voltage_Sens`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### POD_w058_SW_App_Boot

- **UI Name**: 
- **API Name**: `POD_w058_SW_App_Boot`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### POD_w063_SW_SOC_Imbalance

- **UI Name**: 
- **API Name**: `POD_w063_SW_SOC_Imbalance`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### POD_w067_SW_Not_Enough_Energy_Precharge

- **UI Name**: 
- **API Name**: `POD_w067_SW_Not_Enough_Energy_Precharge`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### POD_w090_SW_SOC_Imbalance_Limit_Charge

- **UI Name**: 
- **API Name**: `POD_w090_SW_SOC_Imbalance_Limit_Charge`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### POD_w093_SW_Charge_Request

- **UI Name**: 
- **API Name**: `POD_w093_SW_Charge_Request`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### POD_w105_SW_EOD

- **UI Name**: 
- **API Name**: `POD_w105_SW_EOD`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### POD_w109_SW_Self_Test_Request_Not_Serviced

- **UI Name**: 
- **API Name**: `POD_w109_SW_Self_Test_Request_Not_Serviced`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### POD_w110_SW_EOC

- **UI Name**: 
- **API Name**: `POD_w110_SW_EOC`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TEPOD`



---

### PodCommissionTime

- **UI Name**: 
- **API Name**: `PodCommissionTime`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `STSTSM`



---

### Powerwall Inverter Failure

- **UI Name**: `Powerwall Inverter Failure`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `RMA`
- **Device**: 

Powerwall inverter has failed permanently. Unit needs replacement.

---

### Powerwall Performance Limited

- **UI Name**: `Powerwall Performance Limited`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `RMA`
- **Device**: 

Powerwall has been locked out due to low energy. Unit needs replacement.

---

### PV Inverter Comms

- **UI Name**: `PV Inverter Comms`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

Loss of communications with PV Inverter.

---

### PVS_a018_MciString[A-D]

- **UI Name**: 
- **API Name**: `PVS_a018_MciString[A-D]`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `PVS`

This indicates a solar string (A, B, C or D) that is not connected.

---

### PVS_a026_Mci1PvVoltage

- **UI Name**: 
- **API Name**: `PVS_a026_Mci1PvVoltage`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `PVS`



---

### PVS_a027_Mci2PvVoltage

- **UI Name**: 
- **API Name**: `PVS_a027_Mci2PvVoltage`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `PVS`



---

### PVS_a031_Mci3PvVoltage

- **UI Name**: 
- **API Name**: `PVS_a031_Mci3PvVoltage`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `PVS`



---

### PVS_a032_Mci4PvVoltage

- **UI Name**: 
- **API Name**: `PVS_a032_Mci4PvVoltage`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `PVS`



---

### PV String Out

- **UI Name**: `PV String Out`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

One or more solar inverter strings are not producing power, expect lower than usual solar performance.

---

### Pyranometer Comms

- **UI Name**: `Pyranometer Comms`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

Loss of communications with Pyranometer.

---

### Ramp Rate Limited

- **UI Name**: `Ramp Rate Limited`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.6`
- **Severity**: 
- **Device**: 

The output does not currently match the commanded power because the system is ramping to its setpoint

---

### Reactive Power Limited

- **UI Name**: `Reactive Power Limited`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.6`
- **Severity**: 
- **Device**: 

The command is greater than the Available Reactive Power

---

### Real Power Available Limited (RealPowerAvailableLimited)

- **UI Name**: `Real Power Available Limited`
- **API Name**: `RealPowerAvailableLimited`
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.6`
- **Severity**: 
- **Device**: `STSTSM`

The command is greater than the Available Battery Real Charge or Discharge Power

---

### Real Power Config Limited

- **UI Name**: `Real Power Config Limited`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.6`
- **Severity**: 
- **Device**: 

The system is unable to meet the commanded power because of a limit that was configured during commissioning

---

### ScheduledIslandContactorOpen

- **UI Name**: 
- **API Name**: `ScheduledIslandContactorOpen`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `STSTSM`

Manually Disconnected from Grid

---

### SelfConsumptionReservedLimit

- **UI Name**: 
- **API Name**: `SelfConsumptionReservedLimit`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `STSTSM`

Battery reached reserve limit during self-consumption mode and switches to grid

---

### Site Max Power Limited

- **UI Name**: `Site Max Power Limited`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.6`
- **Severity**: 
- **Device**: 

Cannot meet command because the Site Maximum Power Limit has been set

---

### Site Meter Comms

- **UI Name**: `Site Meter Comms`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

Loss of communications with Site Meter.

---

### Site Min Power Limited (SiteMinPowerLimited)

- **UI Name**: `Site Min Power Limited`
- **API Name**: `SiteMinPowerLimited`
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.6`
- **Severity**: 
- **Device**: `STSTSM`

Cannot meet command because the Site Minimum Power Limit has been set

---

### Smart Inverter Active

- **UI Name**: `Smart Inverter Active`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.6`
- **Severity**: 
- **Device**: 

Due to grid conditions, a Smart Inverter Feature is now in operation on Battery Block X

---

### Solar Charge Only Limited (SolarChargeOnlyLimited)

- **UI Name**: `Solar Charge Only Limited`
- **API Name**: `SolarChargeOnlyLimited`
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.6`
- **Severity**: 
- **Device**: `STSTSM`

The system has been configured to only charge from solar. Solar is not available; the charge request cannot be met

---

### Solar Meter Comms

- **UI Name**: `Solar Meter Comms`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

Loss of communications with Solar Meter.

---

### SYNC_a001_SW_App_Boot

- **UI Name**: 
- **API Name**: `SYNC_a001_SW_App_Boot`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TESYNC`



---

### SYNC_a038_DoOpenArguments

- **UI Name**: 
- **API Name**: `SYNC_a038_DoOpenArguments`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TESYNC`



---

### System shutdown

- **UI Name**: `System shutdown`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

The system has been shutdown by an external kill switch, or a system shutdown has been triggered by a low GPIO pin.

---

### THC_w061_CAN_TX_FIFO_Overflow

- **UI Name**: 
- **API Name**: `THC_w061_CAN_TX_FIFO_Overflow`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TETHC`



---

### THC_w155_Backup_Genealogy_Updated

- **UI Name**: 
- **API Name**: `THC_w155_Backup_Genealogy_Updated`
- **Source**: `Community Contributed`
- **Severity**: 
- **Device**: `TETHC`

Unknown but seen during firmware upgrade.

---

### Wait for Solar

- **UI Name**: `Wait for Solar`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Performance`
- **Device**: 

The site currently doesn't have enough SOE to form a grid. Waiting for more solar energy. Fix: User command or wait for daytime.

---

### Waiting for Jumpstart - Low SOE

- **UI Name**: `Waiting for Jumpstart - Low SOE`
- **API Name**: 
- **Source**: `Tesla - Residential Powerhub User Manual - Rev. 1.16`
- **Severity**: `Informational`
- **Device**: 

The system has been put to sleep due to a low SOE and being off-grid.

---



================================================
FILE: docs/reference/devices.md
================================================
# Powerwall Devices

Devices and alerts will show up in the device vitals API (e.g., `/api/device/vitals`). Below is a list of the devices and alerts that I have seen. I'm looking for information on what these mean. Please submit an issue or PR if you have more information or definitions we can add. The device details below are mostly educated guesses.

```python
import pypowerwall

# Connect to Powerwall
pw = pypowerwall.Powerwall(host, password, email, timezone, gw_pwd=gw_pwd, auto_select=True)

# Display Device Vitals
print("Device Vitals:\n %s\n" % pw.vitals(True))
```

Example Output: [vitals-example.json](../vitals-example.json)

## Devices

| Device | ECU Type | Description |
| --- | --- | --- |
| STSTSM | 207 | Tesla Energy System |
| TETHC | 224 | Tesla Energy Total Home Controller - Energy Storage System (ESS) |
| TEPOD | 226 | Tesla Energy Powerwall |
| TEPINV | 253 | Tesla Energy Powerwall Inverter |
| TESYNC | 259 | Tesla Energy Synchronizer |
| TEMSA | 300 | Tesla Backup Switch |
| PVAC | 296 | Photovoltaic AC - Solar Inverter |
| PVS | 297 | Photovoltaic Strings |
| TESLA | x | Internal Device Attributes |
| NEURIO | x | Wireless Revenue Grade Solar Meter |

#### STSTSM - Tesla Energy System

* This appears to be the primary control unit for the Tesla Energy Systems. 
* ECU Type is 207
* Part Numbers: 1232100-XX-Y, 1152100-XX-Y, 1118431-xx-y
* Tesla Gateway 1 (1118431-xx-y) or Tesla Gateway 2 (1232100-xx-y)
* Tesla Backup Switch (1624171-xx-y)

#### TETHC - Tesla Energy Total Home Controller

* Appears to be controller for Powerwall/2/+ Systems
* ECU Type is 224
* Part 1092170-XX-Y (Powerwall 2)
* Part 2012170-XX-Y (Powerwall 2.1)
* Part 3012170-XX-Y (Powerwall +)

#### TEPOD - Tesla Energy Powerwall

* Appears to be the Powerwall battery system (not sure of what POD stands for)
* ECU Type is 226
* Part 1081100-XX-Y
* Component of TETHC

#### TEPINV - Tesla Energy Powerwall Inverter

* Appears to be the Powerwall Inverter for battery energy storage/release
* ECU Type is 253
* Part 1081100-XX-Y
* Component of TETHC

#### TESYNC - Tesla Energy Synchronizer

* Tesla Backup Gateway includes a synchronizer constantly monitoring grid voltage and frequency to relay grid parameters to Tesla Powerwall during Backup to Grid-tied transition.
* ECU Type is 259
* Part 1493315-XX-Y
* Component of TETHC

#### TEMSA - Tesla Backup Switch

* Tesla Backup Switch is designed to simplify installation of your Powerwall system. It plugs into your meter socket panel, with the meter plugging directly into the Backup Switch. Within the Backup Switch housing, the contactor controls your system's connection to the grid. The controller provides energy usage monitoring, providing you with precise, real-time data of your home's energy consumption.
* ECU Type is 300
* Part 1624171-XX-E - Tesla Backup Switch (1624171-xx-y)

#### PVAC - Photovoltaic AC - Solar Inverter

* ECU Type is 296
* Part 1534000-xx-y - 3.8kW
* Part 1538000-xx-y - 7.6kW
* Component of TETHC

#### PVS - Photovoltaic Strings

* ECU Type is 297
* This terminates the Photovoltaic DC power strings
* Component of PVAC

#### NEURIO - Wireless Revenue Grade Solar Meter

* This is a third party (Generac) meter with Tesla proprietary firmware. It is generally installed as a wireless meter to report on solar production. [Link](https://neur.io/)
* Component of STSTSM

#### TESLA - Internal Device Attributes

* This is used to describe attributes of the inverter, meters and others
* Component of STSTSM

### Alerts

See [alerts.md](alerts.md).


================================================
FILE: docs/reference/firmware-history.md
================================================
# Firmware Version History

Firmware version of the Powerwall can be seen with `pw.version()`. An estimate of Firmware versions in the wild can be seen here: https://www.netzeroapp.io/firmware_versions 

| Powerwall Firmware | Date Seen | Features | pyPowerwall | Tesla App |
| --- | --- | --- | --- | --- |
| 20.49.0 | Unknown | Unknown | N/A | |
| 21.13.2 | May-2021 | Improved Powerwall behavior during power outage. Push notification when charge level is low during outage. | N/A | |
| 21.31.2 | Sep-2021 | Unknown | N/A | |
| 21.39.1 7759c368 | Nov-2021 | Unknown | v0.1.0 | |
| 21.44 223a5cd | Unknown | Issue with this firmware is that when the Neurio meter (1.6.1-Tesla) loses connection with gateway (happens frequently) it stops solar generation. | v0.1.0 | |
| 21.44.1 c58c2df3 | 1-Jan-2022 | Neurio converted to RGM only so that when it disconnects it no longer stop solar power generation | v0.2.0 | |
| 22.1 92118b67 | 21-Jan-2022 | Upgrades Neurio Revenue Grade Meter (RGM) to 1.7.1-Tesla addressing Neurio instability and missing RGM data | v0.3.0 | |
| 22.1.1 | 22-Feb-2022 | Unknown | v0.3.0 | |
| 22.1.2 34013a3f | N/A | Unknown | N/A | |
| [22.9](https://www.tesla.com/support/energy/powerwall/mobile-app/software-updates) | 1-Apr-2022 | * More options for 'Advanced Settings' in the Tesla app to control grid charging and export behavior * Improved Powerwall performance when charge level is below backup reserve and Powerwall is importing from the grid * Capability to configure the charge rate of Powerwall below backup reserve * Improved metering accuracy when loads are not balanced across phases | v0.4.0 | 4.8.0 |
| 22.9.1 | 12-Apr-2022 | Unknown | v0.4.0 | 4.8.0 |
| 22.9.1.1 75c90bda | 2-May-2022 | Unknown | v0.4.0 | 4.8.0-1025 |
| 22.9.2 a54352e6 | 2-May-2022 | Unknown | v0.4.0 Proxy t11 | 4.8.0-1025 |
| 22.18.3 21c0ad81 | 28-Jun-2022 | Two new alerts did show up in device vitals: HighCPU and SystemConnectedToGrid * The HighCPU was particularly interesting. If you updated your customer password on the gateway, it seems to have reverted during the firmware upgrade. Any monitoring tools using the new password were getting errors. The gateway was presenting "API rate limit" errors (even for installer mode). Reverting the password to the older one fixes the issue but revealed the HighCPU alert. | v0.4.0 Proxy t15 | 4.9.2-1087 |
| 22.18.6 7884188e | 27-Sep-2022 | STSTSM HighCPU Alert appeared after upgrade. The firmwareVersion now shows "2022-08-01-g8b6399632f". Alerts during upgrade: "PINV_a010_can_gtwMIA", "PINV_a039_can_thcMIA". | v0.4.0 Proxy t15 | 4.13.1-1312 |
| 22.26.1-foxtrot 4d562eaf | 13-Oct-2022 | This release seems to have introduced a Powerwall charging slowdown mode. After 95% full, the charging will slow dramatically with excess solar production getting pushed to the grid even if the battery is less than 100% (see [discussion](https://github.com/jasonacox/Powerwall-Dashboard/discussions/109)).  This upgrade also upgrades the Neurio Revenue Grade Meter (RGM) to 1.7.2-Tesla with STSTSM firmware showing 2022-09-28-g7cb0d69c2b.  [Tesla Release Notes](https://www.tesla.com/support/energy/powerwall/mobile-app/software-updates): Time-Based Control mode updates, Improved off-grid retry, improved commissioning, improved metering accuracy on Neurio Smart CTs | v0.6.0 Proxy t19 | 4.13.1-1334 |
| 22.26.2 8cd8cac4 | 26-Oct-2022 | STSTSM firmware showing 2022-10-24-g64e8c689f9 - This version seems to have fixed a slow charging issue with the Powerwall. With version 22.26.1, it started trickle charging at around 85-90% and would never get above 95%. With this new version it charges up to 98% and then starts trickle charging to the final 100%.| v0.6.0 Proxy t19 | 4.14.1-1395 |
| 22.26.4 fc00d5dd | 22-Nov-2022 | STSTSM firmware showing 2022-10-26-g9b8e445626 - No noticeable changes so far. | v0.6.0 Proxy t22 | 4.14.4-1455 |
| 22.36.4 71cc31f1 | 23-Feb-2023 | Added Tesla Pro app graphic/link to Gateway login screen | v0.6.0 Proxy t24 | 4.18.0-1607 |
| 22.36.6 cf1839cb | 11-Mar-2023 | STSTSM firmware showing 2023-03-04-gd9f19c06f2 - Improved detection of open circuit breakers on Powerwall systems ([see Tesla release notes](https://www.tesla.com/support/energy/powerwall/mobile-app/software-updates)). Change was reverted and rolled back to 22.26.4 | v0.6.0 Proxy t24 | 4.18.0-1607 |
| 22.36.7 08d06dad | 21-Mar-2023 | STSTSM firmware showing 2023-03-04-gd9f19c06f2 - No noticeable changes so far. | v0.6.1 Proxy t24 | 4.18.0-1607 |
| 22.36.8 | 27-Mar-2023 | "Battery Unexpected Power" alert reported during firmware upgrade | v0.6.2 Proxy t25 | 4.19.5-1665|
| 22.36.9 c55384d2 | 11-Apr-2023 | STSTSM firmware showing 2023-03-29-g66549e6ca7 - Power flow animation panel had "Aw, snap!" error | v0.6.2 Proxy t25 | 4.19.5-1665|
| 23.4.2-1 fe55682a | 3-May-2023 | STSTSM firmware showing `localbuild` | v0.6.2 Proxy t25 | 4.20.69-1691|
| 23.12.10 30f95d0b | 1-Jul-2023 | STSTSM firmware showing 2023-07-11-geb56bf57ab | v0.6.2 Proxy t26 | 4.23.6-1844 |
| 23.12.11 452c76cb | 4-Aug-2023 | STSTSM firmware showing 2023-07-20-ga38210a892 | v0.6.2 Proxy t26 | 4.23.6-1844 |
| 23.28.1 fa0c1ad0 | 11-Sep-2023 | STSTSM firmware showing 2023-08-22-g807640ca4a | v0.6.2 Proxy t26 | 4.24.5-1931 |
| 23.28.2 27626f98 | 13-Oct-2023 | STSTSM firmware showing 2023-09-12-gafa2393b50 | v0.6.2 Proxy t26 | 4.25.6-1976 |
| 23.36.3 aa269d353 | 22-Dec-2023 | STSTSM firmware showing 2023-11-30-g6e07d12eea | .. | .. |
| 23.36.4 4064fc6a | 17-Jan-2024 | STSTSM firmware showing 2023-11-30-g6e07d12eea |  .. | .. |
| 24.4.0 0fe780c9 | 15-Mar-2024 | No vitals available |  .. | .. |
| 24.12.3 1feaff3a | May-2024 | No vitals available |  .. | .. |
| 23.44.0 eb113390 | 25-Jan-2024 | STSTSM firmware showing Unknown - No vitals available |  .. | .. |
| 23.44.3-msa | 7-Feb-2024 | No vitals available |  .. | .. |
| 25.2.2 | 2024 | Unknown | .. | .. |
| 25.2.6 | 2024 | Unknown | .. | .. |
| 25.2.7 bca3fdc8 | 2024 | Updated from 25.2.6, kept working | .. | .. |
| 25.10.1 | 2024 | Local (LAN) access to TEDAPI on Powerwall blocked | .. | .. |
| 25.10.2 9325e147 | 2024 | Unknown | .. | .. |
| 25.10.3 | 2024 | Updated from 25.10.1 | .. | .. |
| 25.10.4 4a4191ff | 2024 | TEDAPI via wifi still working | .. | .. |
| 25.18.1 9eca33eb | 2024 | Good with PD v4.7.1 and TEDAPI (via wi-fi) | .. | .. |
| 25.18.2 e1f565d8 | 2024 | Unknown | .. | .. |
| 25.18.4 b6b41ca8 | 2024 | "Battery Unexpected Power" alert | .. | .. |
| 25.18.5 a411ff15 | 2024 | Multiple reports of "Powerwall Disabled - Service Required - Low Energy Lockout" | .. | .. |
| 25.26.0 0d5436e | 5-Aug-2025 | Possibly bug in this version (see [issue #680](https://github.com/jasonacox/Powerwall-Dashboard/issues/680)) - WiFi stability improvements reported | .. | .. |
| 25.26.1 2c4bb00e | 18-Aug-2025 | Unknown | .. | .. |
| 25.34.1 930a7700 | 29-Sep-2025 | Updated for PW2 and PW+ units | .. | .. |
| 25.34.3 82272c3b | 21-Oct-2025 | PW3 - Grid charging rates dropped from 3.3 kW to 1.9 kW | .. | .. |
| 25.42.0 2cd3dcfd | Nov-2025 | Charging on Solar and PW2 stops/start due to high temperature - Firmware branch split: PW3 on separate line from PW2/inverters/Powerwall+ | .. | .. |
| 25.42.1 1d1ff4c6 | Dec-2025 | Unknown | .. | .. |
| 25.42.1 ab1ab81d | 3-Dec-2025 | PW3 variant - Grid charging rates continue to be lower (~1.5 kW) | .. | .. |
| 25.42.1 b5289d33 | 25-Nov-2025 | Operational variant - Resolved "fan_speed_mismatch_detected" alert | .. | .. |

**For more details on firmware versions, see [Tesla Powerwall Firmware Upgrades - Observations](https://github.com/jasonacox/Powerwall-Dashboard/discussions/109).**

## Important Notes

* Beginning with firmware version 23.44.0, Tesla has removed the `/api/devices/vitals` API endpoint. For discussion about this and future updates, see [Tesla Powerwall Firmware Upgrades - Observations](https://github.com/jasonacox/Powerwall-Dashboard/discussions/109).

* As of firmware version 25.10.0, network routing to the TEDAPI endpoint (`192.168.91.1`) is no longer supported by Tesla. You must connect directly to the Powerwall's Wi‑Fi access point to access TEDAPI data.


================================================
FILE: docs/vitals-example-failed-pw.json
================================================
{
    "STSTSM--1152100-14-E--CNxxx": {
        "STSTSM-Location": "Gateway",
        "alerts": [
            "GridCodesWrite",
            "FWUpdateSucceeded",
            "BatteryFault"
        ],
        "firmwareVersion": "2022-01-31-g9853d3db5",
        "lastCommunicationTime": 1645918731,
        "manufacturer": "TESLA",
        "partNumber": "1152100-14-E",
        "serialNumber": "CNxxx",
        "teslaEnergyEcuAttributes": {
            "ecuType": 207
        }
    },
    "TEPINV--1081100-01-U--T21C0007854": {
        "componentParentDin": "TETHC--3012170-05-B--TG121094002C9V",
        "firmwareVersion": "b0ec24329c08e4",
        "lastCommunicationTime": 1645911911,
        "manufacturer": "TESLA",
        "partNumber": "1081100-01-U",
        "serialNumber": "Txxx",
        "teslaEnergyEcuAttributes": {
            "ecuType": 253
        }
    },
    "TEPOD--1081100-01-U--T21C0007854": {
        "alerts": [
            "POD_f029_HW_CMA_OV",
            "POD_w024_HW_Fault_Asserted",
            "POD_w029_HW_CMA_OV",
            "POD_w031_SW_Brick_OV",
            "POD_w044_SW_Brick_UV_Warning",
            "POD_w045_SW_Brick_OV_Warning",
            "POD_w048_SW_Cell_Volt
Download .txt
gitextract_ladqec0m/

├── .flake8
├── .github/
│   └── workflows/
│       ├── check-protobuf.yml
│       ├── jekyll-gh-pages.yml
│       ├── pwsim-docker.yml
│       ├── pylint.yml
│       ├── simtest.yml
│       └── test.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .pylintrc
├── API.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── RELEASE.md
├── _config.yml
├── api_test.py
├── dashboard/
│   └── README.md
├── docs/
│   ├── README.md
│   ├── api.txt
│   ├── reference/
│   │   ├── alerts.md
│   │   ├── devices.md
│   │   └── firmware-history.md
│   ├── vitals-example-failed-pw.json
│   ├── vitals-example-latest.json
│   └── vitals-example.json
├── example-cloud-mode.py
├── example.py
├── examples/
│   ├── network_route.py
│   ├── vitals/
│   │   ├── README.md
│   │   ├── pull_vitals.py
│   │   ├── tesla.proto
│   │   └── tesla_pb2.py
│   └── vitals.py
├── proxy/
│   ├── .dockerignore
│   ├── API.md
│   ├── Dockerfile
│   ├── Dockerfile.beta
│   ├── HELP.md
│   ├── README.md
│   ├── RELEASE.md
│   ├── __init__.py
│   ├── beta.txt
│   ├── localhost.pem
│   ├── perf_test.py
│   ├── requirements.txt
│   ├── server.py
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── test_api_endpoints.py
│   │   └── test_csv_endpoints.py
│   ├── transform.py
│   ├── upload-beta.sh
│   └── web/
│       ├── LICENSE
│       ├── bogus/
│       │   ├── api.auth.toggle.supported.json
│       │   ├── api.customer.json
│       │   ├── api.customer.registration.json
│       │   ├── api.installer.json
│       │   ├── api.meters.aggregates.json
│       │   ├── api.meters.json
│       │   ├── api.meters.readings.json
│       │   ├── api.meters.site.json
│       │   ├── api.meters.solar.json
│       │   ├── api.networks.json
│       │   ├── api.operation.json
│       │   ├── api.powerwalls.json
│       │   ├── api.site_info.grid_codes.json
│       │   ├── api.site_info.json
│       │   ├── api.site_info.site_name.json
│       │   ├── api.sitemaster.json
│       │   ├── api.solars.brands.json
│       │   ├── api.solars.json
│       │   ├── api.status.json
│       │   ├── api.synchrometer.ct_voltage_references.json
│       │   ├── api.system.networks.json
│       │   ├── api.system.update.status.json
│       │   ├── api.system_status.grid_faults.json
│       │   ├── api.system_status.grid_status.json
│       │   ├── api.system_status.grid_status.json-offline
│       │   ├── api.system_status.grid_status.json-transition
│       │   ├── api.system_status.json
│       │   ├── api.system_status.soe.json
│       │   └── api.troubleshooting.problems.json
│       ├── example.html
│       ├── index.html
│       └── viz-static/
│           ├── 1.17c71172308436a079d1.js
│           ├── 124f233cfa9945f861dcaca7acedd308.otf
│           ├── 2bf15a1686c7a1bf7b577337a07d7049.otf
│           ├── 39.17c71172308436a079d1.js
│           ├── 40.17c71172308436a079d1.js
│           ├── 653969a51632a4df33358a39d7012f79.otf
│           ├── 722c5f898bbca8b2eb3fce0287688326.otf
│           ├── 86a6894da889a3db781418529403290f.otf
│           ├── 89aec2cc0b804667e95b1adc02e1ac4a.otf
│           ├── a3b0d611359e6fa8356cd88aa9035268.otf
│           ├── ac2944015a17576924af7c56d88751cb.otf
│           ├── app.css
│           ├── app.js
│           ├── b8d72cb0ef934ba1fe847c692d9dfed1.otf
│           ├── bceda3fae660177ae570735feec62811.otf
│           ├── befdfda70624c396169873b05de57f8a.otf
│           ├── black.js
│           ├── clear.js
│           ├── d859fee2eba0e67c75c4c92e719d0630.otf
│           ├── dakboard.js
│           ├── e19c20e966bde501f94e41cd0322dbe8.otf
│           ├── ec6b35b07448e1624cb09323b5fb6e32.otf
│           ├── ec89c09b066f57efc7687540c998845b.otf
│           ├── eca1317ee8a99162d0d0e2df77330cec.otf
│           ├── grafana-dark.js
│           ├── grafana.js
│           ├── solar.js
│           ├── vendor.js
│           └── white.js
├── pwsimulator/
│   ├── Dockerfile
│   ├── README.md
│   ├── control.html
│   ├── localhost.pem
│   ├── stub.py
│   ├── tedapi_pb2.py
│   ├── test.py
│   ├── test.sh
│   └── test_tedapi.py
├── pypowerwall/
│   ├── __init__.py
│   ├── __main__.py
│   ├── api_lock.py
│   ├── cloud/
│   │   ├── __init__.py
│   │   ├── decorators.py
│   │   ├── exceptions.py
│   │   ├── mock_data.py
│   │   ├── pypowerwall_cloud.py
│   │   ├── stubs.py
│   │   └── teslapy/
│   │       ├── LICENSE
│   │       ├── README.md
│   │       ├── __init__.py
│   │       ├── endpoints.json
│   │       ├── option_codes.json
│   │       └── requirements.txt
│   ├── exceptions.py
│   ├── fleetapi/
│   │   ├── __init__.py
│   │   ├── __main__.py
│   │   ├── decorators.py
│   │   ├── exceptions.py
│   │   ├── fleetapi.py
│   │   ├── mock_data.py
│   │   ├── pypowerwall_fleetapi.py
│   │   └── stubs.py
│   ├── local/
│   │   ├── __init__.py
│   │   ├── exceptions.py
│   │   ├── pypowerwall_local.py
│   │   └── tesla_pb2.py
│   ├── pypowerwall_base.py
│   ├── regex.py
│   ├── scan.py
│   ├── tedapi/
│   │   ├── __init__.py
│   │   ├── __main__.py
│   │   ├── decorators.py
│   │   ├── exceptions.py
│   │   ├── mock_data.py
│   │   ├── pypowerwall_tedapi.py
│   │   ├── stubs.py
│   │   ├── tedapi.proto
│   │   ├── tedapi_combined.proto
│   │   ├── tedapi_combined_pb2.py
│   │   ├── tedapi_pb2.py
│   │   └── tedapi_v1r.py
│   ├── tesla_auth.py
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── tedapi/
│   │   │   ├── __init__.py
│   │   │   └── test_init.py
│   │   ├── test_live_modes.py
│   │   ├── test_mode_selection.py
│   │   ├── test_powerwall.py
│   │   └── unit/
│   │       ├── __init__.py
│   │       ├── test_cli_tedapi.py
│   │       ├── test_parse_version.py
│   │       └── test_powerwall_core.py
│   └── v1r_register.py
├── pytest.ini
├── requirements.txt
├── setup.py
├── tesla.proto
├── test.py
├── test_requirements.txt
├── tools/
│   ├── README.md
│   ├── cron.sh
│   ├── fleetapi/
│   │   ├── README.md
│   │   ├── create_pem_key.py
│   │   ├── fleetapi.py
│   │   ├── index.html
│   │   ├── live.py
│   │   ├── setup.py
│   │   └── test.py
│   ├── gen_proto.sh
│   ├── nws.py
│   ├── requirements-tools.txt
│   ├── server/
│   │   ├── .gitignore
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   ├── app/
│   │   │   ├── __init__.py
│   │   │   ├── api/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── aggregates.py
│   │   │   │   ├── gateways.py
│   │   │   │   ├── legacy.py
│   │   │   │   └── websockets.py
│   │   │   ├── config.py
│   │   │   ├── core/
│   │   │   │   ├── __init__.py
│   │   │   │   └── gateway_manager.py
│   │   │   ├── main.py
│   │   │   ├── models/
│   │   │   │   ├── __init__.py
│   │   │   │   └── gateway.py
│   │   │   ├── static/
│   │   │   │   ├── example.html
│   │   │   │   ├── index.html
│   │   │   │   └── viz-static/
│   │   │   │       ├── 1.17c71172308436a079d1.js
│   │   │   │       ├── 124f233cfa9945f861dcaca7acedd308.otf
│   │   │   │       ├── 2bf15a1686c7a1bf7b577337a07d7049.otf
│   │   │   │       ├── 39.17c71172308436a079d1.js
│   │   │   │       ├── 40.17c71172308436a079d1.js
│   │   │   │       ├── 653969a51632a4df33358a39d7012f79.otf
│   │   │   │       ├── 722c5f898bbca8b2eb3fce0287688326.otf
│   │   │   │       ├── 86a6894da889a3db781418529403290f.otf
│   │   │   │       ├── 89aec2cc0b804667e95b1adc02e1ac4a.otf
│   │   │   │       ├── a3b0d611359e6fa8356cd88aa9035268.otf
│   │   │   │       ├── ac2944015a17576924af7c56d88751cb.otf
│   │   │   │       ├── app.css
│   │   │   │       ├── app.js
│   │   │   │       ├── b8d72cb0ef934ba1fe847c692d9dfed1.otf
│   │   │   │       ├── bceda3fae660177ae570735feec62811.otf
│   │   │   │       ├── befdfda70624c396169873b05de57f8a.otf
│   │   │   │       ├── black.js
│   │   │   │       ├── clear.js
│   │   │   │       ├── d859fee2eba0e67c75c4c92e719d0630.otf
│   │   │   │       ├── dakboard.js
│   │   │   │       ├── e19c20e966bde501f94e41cd0322dbe8.otf
│   │   │   │       ├── ec6b35b07448e1624cb09323b5fb6e32.otf
│   │   │   │       ├── ec89c09b066f57efc7687540c998845b.otf
│   │   │   │       ├── eca1317ee8a99162d0d0e2df77330cec.otf
│   │   │   │       ├── grafana-dark.js
│   │   │   │       ├── grafana.js
│   │   │   │       ├── solar.js
│   │   │   │       ├── vendor.js
│   │   │   │       └── white.js
│   │   │   └── utils/
│   │   │       ├── __init__.py
│   │   │       └── transform.py
│   │   ├── docker-compose.yml
│   │   ├── pytest.ini
│   │   ├── requirements-dev.txt
│   │   ├── requirements.txt
│   │   ├── run.sh
│   │   └── tests/
│   │       ├── __init__.py
│   │       ├── conftest.py
│   │       ├── test_api_aggregates.py
│   │       ├── test_api_gateways.py
│   │       ├── test_api_legacy.py
│   │       ├── test_basic.py
│   │       ├── test_config.py
│   │       ├── test_edge_cases.py
│   │       └── test_gateway_manager.py
│   ├── set-mode.py
│   ├── set-reserve.py
│   ├── tedapi/
│   │   ├── ComponentsQuery.py
│   │   ├── PW3_Strings.py
│   │   ├── PW3_Vitals.py
│   │   ├── README.md
│   │   ├── create_request.py
│   │   ├── decode.py
│   │   ├── status.py
│   │   ├── tedapi.proto
│   │   ├── tedapi_orig.py
│   │   ├── tedapi_pb2.py
│   │   ├── tedapi_test.py
│   │   └── web.py
│   ├── tedapi-lan/
│   │   ├── README.md
│   │   ├── lan_tedapi.py
│   │   ├── requirements.txt
│   │   ├── tedapi_combined.proto
│   │   └── tedapi_combined_pb2.py
│   └── tessolarcharge.py
├── v1r_register.py
└── web/
    └── index.html
Download .txt
Showing preview only (522K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5815 symbols across 93 files)

FILE: api_test.py
  function test_battery_mode_change (line 19) | def test_battery_mode_change(pw):
  function test_battery_reserve_change (line 39) | def test_battery_reserve_change(pw):
  function test_post_functions (line 59) | def test_post_functions(pw):
  function run (line 67) | def run(include_post_funcs=False):

FILE: example.py
  function safe_get (line 117) | def safe_get(key, default=0):

FILE: examples/network_route.py
  class Tense (line 13) | class Tense(Enum):
  class RouteOperation (line 21) | class RouteOperation(Enum):
    method get_action (line 35) | def get_action(self, tense: Tense) -> str:
  function manage_ip_route_pyroute (line 47) | def manage_ip_route_pyroute(operation: RouteOperation, destination: str,...
  function manage_ip_route_subprocess (line 93) | def manage_ip_route_subprocess(operation: RouteOperation, destination: s...

FILE: proxy/perf_test.py
  class RoutePerformanceTester (line 61) | class RoutePerformanceTester:
    method __init__ (line 62) | def __init__(self, host: str = "localhost", port: int = 8675, timeout:...
    method test_route (line 69) | def test_route(self, route: str, num_requests: int = 5) -> Dict:
    method run_all_tests (line 133) | def run_all_tests(self, num_requests: int = 5, sort_by: str = "avg") -...
    method print_summary (line 157) | def print_summary(self, results: List[Dict], show_errors: bool = False):
    method export_json (line 221) | def export_json(self, results: List[Dict], filename: str):
  function main (line 238) | def main():

FILE: proxy/server.py
  function should_log_network_error (line 331) | def should_log_network_error(func_name, max_per_minute=5):
  function track_network_error (line 359) | def track_network_error(func_name, error_type):
  function update_connection_health (line 411) | def update_connection_health(success=True):
  function get_cached_response (line 447) | def get_cached_response(endpoint):
  function cache_response (line 470) | def cache_response(endpoint, response):
  function get_performance_cached (line 487) | def get_performance_cached(cache_key):
  function cache_performance_response (line 514) | def cache_performance_response(cache_key, data):
  function performance_cached (line 527) | def performance_cached(cache_key):
  function cached_route_handler (line 557) | def cached_route_handler(cache_key, data_generator):
  function track_endpoint_call (line 583) | def track_endpoint_call(endpoint, success=True):
  function safe_pw_call (line 619) | def safe_pw_call(pw_func, *args, **kwargs):
  function safe_endpoint_call (line 730) | def safe_endpoint_call(endpoint_name, pw_func, *args, jsonformat=True, *...
  function sig_term_handle (line 781) | def sig_term_handle(signum, frame):
  function get_value (line 790) | def get_value(a, key):
  function build_mode_string (line 855) | def build_mode_string(control=False):
  function get_transport_health (line 904) | def get_transport_health():
  class ThreadingHTTPServer (line 963) | class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
  class Handler (line 969) | class Handler(BaseHTTPRequestHandler):
    method log_message (line 970) | def log_message(self, log_format, *args):
    method address_string (line 976) | def address_string(self):
    method do_POST (line 981) | def do_POST(self):
    method do_GET (line 1159) | def do_GET(self):
  function main (line 2157) | def main() -> None:

FILE: proxy/tests/test_api_endpoints.py
  class TestFreqEndpoint (line 11) | class TestFreqEndpoint(BaseDoGetTest):
    method test_freq_basic_output (line 17) | def test_freq_basic_output(self, proxystats_lock, mock_safe_pw_call, m...
    method test_freq_with_meter_data (line 74) | def test_freq_with_meter_data(self, proxystats_lock, mock_safe_pw_call...
    method test_freq_cache_behavior (line 107) | def test_freq_cache_behavior(self, proxystats_lock, mock_safe_pw_call,...
  class TestPodEndpoint (line 139) | class TestPodEndpoint(BaseDoGetTest):
    method test_pod_basic_output (line 145) | def test_pod_basic_output(self, proxystats_lock, mock_safe_pw_call, mo...
    method test_pod_multiple_batteries (line 209) | def test_pod_multiple_batteries(self, proxystats_lock, mock_safe_pw_ca...
    method test_pod_null_handling (line 251) | def test_pod_null_handling(self, proxystats_lock, mock_safe_pw_call, m...
  class TestJsonEndpoint (line 269) | class TestJsonEndpoint(BaseDoGetTest):
    method test_json_basic_output (line 277) | def test_json_basic_output(self, proxystats_lock, mock_safe_pw_call, m...
    method test_json_negative_solar_correction (line 335) | def test_json_negative_solar_correction(self, proxystats_lock, mock_sa...
    method test_json_aggregates_optimization (line 371) | def test_json_aggregates_optimization(self, proxystats_lock, mock_safe...
    method test_json_null_aggregates (line 414) | def test_json_null_aggregates(self, proxystats_lock, mock_safe_pw_call...

FILE: proxy/tests/test_csv_endpoints.py
  class MockPowerwall (line 12) | class MockPowerwall:
    method __init__ (line 14) | def __init__(self):
    method level (line 29) | def level(self):
    method grid (line 32) | def grid(self):
    method solar (line 35) | def solar(self):
    method battery (line 38) | def battery(self):
    method home (line 41) | def home(self):
    method grid_status (line 44) | def grid_status(self):
    method get_reserve (line 47) | def get_reserve(self):
  class UnittestHandler (line 51) | class UnittestHandler(Handler):
    method __init__ (line 54) | def __init__(self):
  function common_patches (line 70) | def common_patches(func):
  function standard_test_patches (line 84) | def standard_test_patches():
  class BaseDoGetTest (line 94) | class BaseDoGetTest(unittest.TestCase):
    method setUp (line 97) | def setUp(self):
    method get_written_json (line 106) | def get_written_json(self):
    method get_written_text (line 111) | def get_written_text(self):
    method assert_json_response (line 116) | def assert_json_response(self, expected_key, expected_value):
    method do_get (line 122) | def do_get(self, path: str) -> str:
  class TestDoGetAggregatesEndpoints (line 134) | class TestDoGetAggregatesEndpoints(BaseDoGetTest):
    method test_aggregates_endpoint (line 143) | def test_aggregates_endpoint(self, proxystats_lock, mock_cache_write, ...
    method test_aggregates_with_negative_solar_adjustment (line 170) | def test_aggregates_with_negative_solar_adjustment(self, proxystats_lo...
    method test_cache_stores_processed_data (line 198) | def test_cache_stores_processed_data(self, proxystats_lock, mock_cache...
    method test_cache_hit_returns_processed_data (line 224) | def test_cache_hit_returns_processed_data(self, proxystats_lock, mock_...
    method test_cache_preserves_multiple_adjustments (line 253) | def test_cache_preserves_multiple_adjustments(self, proxystats_lock, m...
    method test_cache_respects_neg_solar_setting (line 293) | def test_cache_respects_neg_solar_setting(self, proxystats_lock, mock_...
  class TestDoGetStatsEndpoints (line 313) | class TestDoGetStatsEndpoints(BaseDoGetTest):
    method test_stats_endpoint (line 316) | def test_stats_endpoint(self):
    method test_stats_clear_endpoint (line 338) | def test_stats_clear_endpoint(self):
  class TestCSVEndpoints (line 357) | class TestCSVEndpoints(BaseDoGetTest):
    method setUp (line 360) | def setUp(self):
    method test_csv_basic_output (line 372) | def test_csv_basic_output(self, proxystats_lock, mock_safe_pw_call, mo...
    method test_csv_with_headers (line 400) | def test_csv_with_headers(self, proxystats_lock, mock_safe_pw_call, mo...
    method test_csv_fractional_values (line 426) | def test_csv_fractional_values(self, proxystats_lock, mock_safe_pw_cal...
    method test_csv_negative_solar_enabled (line 451) | def test_csv_negative_solar_enabled(self, proxystats_lock, mock_safe_p...
    method test_csv_negative_solar_disabled (line 476) | def test_csv_negative_solar_disabled(self, proxystats_lock, mock_safe_...
    method test_csv_with_null_values (line 502) | def test_csv_with_null_values(self, proxystats_lock, mock_safe_pw_call...
    method test_csv_zero_values (line 522) | def test_csv_zero_values(self, proxystats_lock, mock_safe_pw_call, moc...

FILE: proxy/transform.py
  function get_static (line 17) | def get_static(web_root, fpath):
  function inject_js (line 65) | def inject_js(htmlsrc, *args):

FILE: proxy/web/viz-static/1.17c71172308436a079d1.js
  function d (line 27) | function d(e, t) {
  function R (line 39) | function R(e) {
  function _ (line 54) | function _(e, t, r) {
  function g (line 92) | function g(e = C, t) {
  function f (line 417) | function f({ meter: e }) {

FILE: proxy/web/viz-static/39.17c71172308436a079d1.js
  function d (line 25) | function d(e) {
  function _ (line 34) | function _(e) {
  function s (line 64) | function s(e, t) {
  function o (line 253) | function o(e, t) {
  function d (line 265) | function d(e) {
  function _ (line 280) | function _(e, t, i) {
  function a (line 310) | function a(e = s, t) {
  function l (line 345) | function l(e, t) {
  function o (line 359) | function o(e, t) {
  function d (line 371) | function d(e) {
  function _ (line 386) | function _(e, t, i) {
  function a (line 407) | function a(e = s, t) {
  function l (line 473) | function l(e, t) {
  function o (line 497) | function o(e, t) {
  function d (line 509) | function d(e) {
  function _ (line 524) | function _(e, t, i) {
  function l (line 529) | function l(e = a, t) {
  function d (line 610) | function d(e, t) {
  function _ (line 622) | function _(e) {
  function s (line 637) | function s(e, t, i) {
  function l (line 641) | function l(e = a, t) {

FILE: proxy/web/viz-static/app.js
  function t (line 2) | function t(t) {
  function i (line 8) | function i() {
  function s (line 22) | function s(t) {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  class n (line 1639) | class n extends Error {
    method constructor (line 1640) | constructor(e, t) {
    method constructor (line 16893) | constructor(e, t) {
  function n (line 1684) | function n(e, ...t) {
    method constructor (line 1640) | constructor(e, t) {
    method constructor (line 16893) | constructor(e, t) {
  function _ (line 1726) | function _(e, t, i, r) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function u (line 1732) | async function u(e, t, i) {
  function s (line 1896) | function s(e = o, t) {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function l (line 1905) | function l(e, t) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function c (line 1917) | function c(e) {
    method error (line 2613) | static error(e, t, i = !1) {
    method fatal (line 2623) | static fatal(e, t, i = !1) {
    method logFatal (line 2635) | static logFatal(e, t) {
    method constructor (line 2638) | constructor(e = _.GENERIC_ERROR, t, i, n = !1) {
    method getName (line 2641) | getName() {
    method setName (line 2644) | setName(e) {
    method isDetailed (line 2647) | isDetailed() {
    method isUnauthorized (line 2650) | isUnauthorized() {
    method toDetailedString (line 2653) | toDetailedString() {
    method toErrorString (line 2657) | toErrorString() {
    method getStackTrace (line 2661) | getStackTrace() {
    method toString (line 2664) | toString() {
    method toJSON (line 2667) | toJSON() {
    method constructor (line 13936) | constructor(e) {
    method render (line 13939) | render() {
    method _getCaret (line 13948) | _getCaret() {
    method _getContent (line 13953) | _getContent() {
    method _handleCollapseToggle (line 13959) | _handleCollapseToggle(e) {
  function d (line 1932) | function d(e, t, i) {
  function m (line 1936) | function m(e = u, t, i) {
    method constructor (line 16233) | constructor(e, t) {
    method rpc (line 16236) | rpc(e, t, i) {
    method error (line 16267) | error(e, t, i, n, r) {
  function g (line 1950) | function g(e = p, t) {
  function w (line 1972) | function w(e, t) {
  function v (line 1984) | function v(e) {
    method constructor (line 11193) | constructor() {
    method getPassword (line 11196) | getPassword() {
    method setPassword (line 11199) | setPassword(e) {
    method render (line 11202) | render() {
    method _getShowPasswordIcon (line 11226) | _getShowPasswordIcon() {
    method _getShowPasswordButton (line 11237) | _getShowPasswordButton() {
    method _getPasswordInput (line 11251) | _getPasswordInput() {
    method _handlePasswordChange (line 11285) | _handlePasswordChange(e) {
    method _handleShowPasswordChange (line 11289) | _handleShowPasswordChange() {
    method _handlePasswordSubmit (line 11293) | _handlePasswordSubmit(e) {
  function f (line 1999) | function f(e, t, i) {
  function E (line 2003) | function E(e = h, t) {
    method GlobalInstance (line 21895) | static GlobalInstance() {
    method constructor (line 21898) | constructor(e) {
    method purge (line 21901) | purge(e) {
    method rehydrate (line 21904) | rehydrate(e, t) {
  function b (line 2017) | function b(e, t) {
    method constructor (line 8006) | constructor(e) {
    method render (line 8027) | render() {
    method _handlerStartToggleAuth (line 8232) | _handlerStartToggleAuth() {
    method _handleForgotPassword (line 8235) | _handleForgotPassword(e) {
    method _handleLoginSelection (line 8240) | _handleLoginSelection(e) {
    method _handleLanguageSelection (line 8244) | _handleLanguageSelection(e) {
    method _handleUsernameChange (line 8247) | _handleUsernameChange(e) {
    method _handlePasswordSubmit (line 8251) | _handlePasswordSubmit() {
    method _handleSubmit (line 8254) | _handleSubmit(e) {
  function y (line 2029) | function y(e) {
    method constructor (line 8980) | constructor(e) {
    method componentDidMount (line 9005) | componentDidMount() {
    method componentWillReceiveProps (line 9008) | componentWillReceiveProps(e) {
    method componentWillUnmount (line 9015) | componentWillUnmount() {
    method getDefaultSelection (line 9018) | getDefaultSelection(e) {
    method getDefaultPlaceholder (line 9021) | getDefaultPlaceholder(e) {
    method resetSelection (line 9024) | resetSelection(e, t) {
    method render (line 9030) | render() {
    method showTooltip (line 9040) | showTooltip() {
    method hideTooltip (line 9043) | hideTooltip() {
    method _bindElements (line 9046) | _bindElements() {
    method _unbindElements (line 9052) | _unbindElements() {
    method _getLabel (line 9055) | _getLabel(e, t, i) {
    method _getDropdown (line 9058) | _getDropdown(e) {
    method _getIndicator (line 9171) | _getIndicator() {
    method _getOptionsSearchable (line 9174) | _getOptionsSearchable(e = !1, t) {
    method _getNotListedLabel (line 9183) | _getNotListedLabel() {
    method _handleNotListed (line 9186) | _handleNotListed() {
    method _handleClickDefault (line 9191) | _handleClickDefault(e, t, i) {
    method _handleClickSearchable (line 9197) | _handleClickSearchable(e) {
    method _handleMultiSelection (line 9203) | _handleMultiSelection(e, t) {
    method _handleInputChangeSearchable (line 9214) | _handleInputChangeSearchable(e) {
    method _handleBlurSearchable (line 9217) | _handleBlurSearchable(e) {
    method _handleFocusSearchable (line 9220) | _handleFocusSearchable(e) {
    method _toggleView (line 9227) | _toggleView(e) {
    method _handleChange (line 9233) | _handleChange(e) {
    method _handleBlur (line 9241) | _handleBlur(e) {
    method _handleFocus (line 9244) | _handleFocus(e) {
  function S (line 2044) | function S(e, t, i) {
  function T (line 2048) | function T(e = R, t) {
  function C (line 2061) | function C(e, t) {
  function I (line 2073) | function I(e) {
  function O (line 2088) | function O(e, t, i) {
  function k (line 2092) | function k(e = N, t) {
  function P (line 2107) | function P(e, t) {
    method constructor (line 17436) | constructor(e) {
    method componentDidMount (line 17439) | componentDidMount() {
    method componentWillUnmount (line 17462) | componentWillUnmount() {
    method render (line 17465) | render() {
    method _getModalClassName (line 17499) | _getModalClassName(e, t, i, n, r, a, o) {
    method _getModalBanner (line 17503) | _getModalBanner(e) {
    method _getModalHeader (line 17506) | _getModalHeader(e, t, i, n, r) {
    method _getCancel (line 17513) | _getCancel(e) {
    method _getModalContent (line 17522) | _getModalContent(e) {
    method _getModalFooter (line 17525) | _getModalFooter(e) {
    method _handleHidden (line 17528) | _handleHidden() {
  function D (line 2119) | function D(e) {
  function L (line 2134) | function L(e, t, i) {
    method render (line 17566) | render() {
  function z (line 2138) | function z(e = M, t) {
  function q (line 2156) | function q(e, t) {
  function x (line 2168) | function x(e) {
  function B (line 2183) | function B(e, t, i) {
  function K (line 2187) | function K(e = H, t) {
  function Z (line 2215) | function Z(e, t) {
  function J (line 2227) | function J(e) {
  function X (line 2242) | function X(e, t, i) {
  function ee (line 2259) | function ee(e = $, t) {
  function ne (line 2289) | function ne(e, t) {
  function re (line 2301) | function re(e, t, i) {
  class s (line 2549) | class s {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  class c (line 2612) | class c extends s {
    method error (line 2613) | static error(e, t, i = !1) {
    method fatal (line 2623) | static fatal(e, t, i = !1) {
    method logFatal (line 2635) | static logFatal(e, t) {
    method constructor (line 2638) | constructor(e = _.GENERIC_ERROR, t, i, n = !1) {
    method getName (line 2641) | getName() {
    method setName (line 2644) | setName(e) {
    method isDetailed (line 2647) | isDetailed() {
    method isUnauthorized (line 2650) | isUnauthorized() {
    method toDetailedString (line 2653) | toDetailedString() {
    method toErrorString (line 2657) | toErrorString() {
    method getStackTrace (line 2661) | getStackTrace() {
    method toString (line 2664) | toString() {
    method toJSON (line 2667) | toJSON() {
    method constructor (line 13936) | constructor(e) {
    method render (line 13939) | render() {
    method _getCaret (line 13948) | _getCaret() {
    method _getContent (line 13953) | _getContent() {
    method _handleCollapseToggle (line 13959) | _handleCollapseToggle(e) {
  function a (line 2692) | function a(e = 0) {
  function o (line 2697) | function o() {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function s (line 2700) | function s(e, t, i) {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function _ (line 2705) | function _(e) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function o (line 2749) | function o(e, t = []) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function s (line 2758) | function s(e, t = []) {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function _ (line 2761) | function _(e, t = []) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function l (line 2764) | function l(e) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function c (line 2767) | function c(e) {
    method error (line 2613) | static error(e, t, i = !1) {
    method fatal (line 2623) | static fatal(e, t, i = !1) {
    method logFatal (line 2635) | static logFatal(e, t) {
    method constructor (line 2638) | constructor(e = _.GENERIC_ERROR, t, i, n = !1) {
    method getName (line 2641) | getName() {
    method setName (line 2644) | setName(e) {
    method isDetailed (line 2647) | isDetailed() {
    method isUnauthorized (line 2650) | isUnauthorized() {
    method toDetailedString (line 2653) | toDetailedString() {
    method toErrorString (line 2657) | toErrorString() {
    method getStackTrace (line 2661) | getStackTrace() {
    method toString (line 2664) | toString() {
    method toJSON (line 2667) | toJSON() {
    method constructor (line 13936) | constructor(e) {
    method render (line 13939) | render() {
    method _getCaret (line 13948) | _getCaret() {
    method _getContent (line 13953) | _getContent() {
    method _handleCollapseToggle (line 13959) | _handleCollapseToggle(e) {
  function d (line 2771) | function d(e) {
  function n (line 2778) | function n(e, t) {
    method constructor (line 1640) | constructor(e, t) {
    method constructor (line 16893) | constructor(e, t) {
  function r (line 2790) | function r(e) {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  function a (line 2805) | function a(e, t, i) {
  function g (line 3333) | function g(e) {
  function w (line 3341) | function w(e) {
  function v (line 3344) | function v(e) {
    method constructor (line 11193) | constructor() {
    method getPassword (line 11196) | getPassword() {
    method setPassword (line 11199) | setPassword(e) {
    method render (line 11202) | render() {
    method _getShowPasswordIcon (line 11226) | _getShowPasswordIcon() {
    method _getShowPasswordButton (line 11237) | _getShowPasswordButton() {
    method _getPasswordInput (line 11251) | _getPasswordInput() {
    method _handlePasswordChange (line 11285) | _handlePasswordChange(e) {
    method _handleShowPasswordChange (line 11289) | _handleShowPasswordChange() {
    method _handlePasswordSubmit (line 11293) | _handlePasswordSubmit(e) {
  function f (line 3348) | function f(e) {
  function h (line 3352) | function h(e) {
  function E (line 3355) | function E(e) {
    method GlobalInstance (line 21895) | static GlobalInstance() {
    method constructor (line 21898) | constructor(e) {
    method purge (line 21901) | purge(e) {
    method rehydrate (line 21904) | rehydrate(e, t) {
  function b (line 3358) | function b(e) {
    method constructor (line 8006) | constructor(e) {
    method render (line 8027) | render() {
    method _handlerStartToggleAuth (line 8232) | _handlerStartToggleAuth() {
    method _handleForgotPassword (line 8235) | _handleForgotPassword(e) {
    method _handleLoginSelection (line 8240) | _handleLoginSelection(e) {
    method _handleLanguageSelection (line 8244) | _handleLanguageSelection(e) {
    method _handleUsernameChange (line 8247) | _handleUsernameChange(e) {
    method _handlePasswordSubmit (line 8251) | _handlePasswordSubmit() {
    method _handleSubmit (line 8254) | _handleSubmit(e) {
  function y (line 3361) | function y(e) {
    method constructor (line 8980) | constructor(e) {
    method componentDidMount (line 9005) | componentDidMount() {
    method componentWillReceiveProps (line 9008) | componentWillReceiveProps(e) {
    method componentWillUnmount (line 9015) | componentWillUnmount() {
    method getDefaultSelection (line 9018) | getDefaultSelection(e) {
    method getDefaultPlaceholder (line 9021) | getDefaultPlaceholder(e) {
    method resetSelection (line 9024) | resetSelection(e, t) {
    method render (line 9030) | render() {
    method showTooltip (line 9040) | showTooltip() {
    method hideTooltip (line 9043) | hideTooltip() {
    method _bindElements (line 9046) | _bindElements() {
    method _unbindElements (line 9052) | _unbindElements() {
    method _getLabel (line 9055) | _getLabel(e, t, i) {
    method _getDropdown (line 9058) | _getDropdown(e) {
    method _getIndicator (line 9171) | _getIndicator() {
    method _getOptionsSearchable (line 9174) | _getOptionsSearchable(e = !1, t) {
    method _getNotListedLabel (line 9183) | _getNotListedLabel() {
    method _handleNotListed (line 9186) | _handleNotListed() {
    method _handleClickDefault (line 9191) | _handleClickDefault(e, t, i) {
    method _handleClickSearchable (line 9197) | _handleClickSearchable(e) {
    method _handleMultiSelection (line 9203) | _handleMultiSelection(e, t) {
    method _handleInputChangeSearchable (line 9214) | _handleInputChangeSearchable(e) {
    method _handleBlurSearchable (line 9217) | _handleBlurSearchable(e) {
    method _handleFocusSearchable (line 9220) | _handleFocusSearchable(e) {
    method _toggleView (line 9227) | _toggleView(e) {
    method _handleChange (line 9233) | _handleChange(e) {
    method _handleBlur (line 9241) | _handleBlur(e) {
    method _handleFocus (line 9244) | _handleFocus(e) {
  function S (line 3364) | function S(e) {
  function R (line 3372) | function R(e) {
  function T (line 3375) | function T(e) {
  function A (line 3378) | function A(e) {
    method constructor (line 17378) | constructor(...e) {
    method render (line 17381) | render() {
    method _navigateToSecurity (line 17409) | _navigateToSecurity() {
    method _handleClick (line 17413) | _handleClick(e) {
  function C (line 3386) | function C(e) {
  function I (line 3389) | function I(e) {
  function g (line 3503) | function g(e, t) {
  function w (line 3515) | function w(e) {
  function v (line 3530) | function v(e, t, i) {
    method constructor (line 11193) | constructor() {
    method getPassword (line 11196) | getPassword() {
    method setPassword (line 11199) | setPassword(e) {
    method render (line 11202) | render() {
    method _getShowPasswordIcon (line 11226) | _getShowPasswordIcon() {
    method _getShowPasswordButton (line 11237) | _getShowPasswordButton() {
    method _getPasswordInput (line 11251) | _getPasswordInput() {
    method _handlePasswordChange (line 11285) | _handlePasswordChange(e) {
    method _handleShowPasswordChange (line 11289) | _handleShowPasswordChange() {
    method _handlePasswordSubmit (line 11293) | _handlePasswordSubmit(e) {
  function h (line 3534) | function h(e) {
  function q (line 3560) | function q(e, t, i, _ = !0) {
  function x (line 3585) | function x(e) {
  function B (line 3599) | function B() {
  function H (line 3602) | function H() {
  function K (line 3605) | function K(e) {
  function Y (line 3632) | function Y(e, t, i) {
  function Q (line 3659) | function Q(e, t, i) {
  function Z (line 3686) | function Z() {
  function J (line 3700) | function J() {
  function X (line 3718) | function X(e, t) {
  function $ (line 3734) | function $() {
  function l (line 3800) | function l(e) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function n (line 3806) | function n(e) {
    method constructor (line 1640) | constructor(e, t) {
    method constructor (line 16893) | constructor(e, t) {
  function r (line 3816) | function r(e, t, i) {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  function a (line 3824) | function a(e) {
  function a (line 3843) | function a() {
  function _ (line 3933) | function _(e) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function a (line 3976) | function a(e, t = {}, i = {}) {
  function o (line 3979) | function o(e, t = {}, i = {}) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function v (line 4042) | function v(e, t = "", i = [], n, r = !1) {
    method constructor (line 11193) | constructor() {
    method getPassword (line 11196) | getPassword() {
    method setPassword (line 11199) | setPassword(e) {
    method render (line 11202) | render() {
    method _getShowPasswordIcon (line 11226) | _getShowPasswordIcon() {
    method _getShowPasswordButton (line 11237) | _getShowPasswordButton() {
    method _getPasswordInput (line 11251) | _getPasswordInput() {
    method _handlePasswordChange (line 11285) | _handlePasswordChange(e) {
    method _handleShowPasswordChange (line 11289) | _handleShowPasswordChange() {
    method _handlePasswordSubmit (line 11293) | _handlePasswordSubmit(e) {
  function f (line 4056) | function f(e, t = 1) {
  function h (line 4066) | function h(e) {
  function E (line 4070) | function E(e, t = !1) {
    method GlobalInstance (line 21895) | static GlobalInstance() {
    method constructor (line 21898) | constructor(e) {
    method purge (line 21901) | purge(e) {
    method rehydrate (line 21904) | rehydrate(e, t) {
  function y (line 4074) | function y(e) {
    method constructor (line 8980) | constructor(e) {
    method componentDidMount (line 9005) | componentDidMount() {
    method componentWillReceiveProps (line 9008) | componentWillReceiveProps(e) {
    method componentWillUnmount (line 9015) | componentWillUnmount() {
    method getDefaultSelection (line 9018) | getDefaultSelection(e) {
    method getDefaultPlaceholder (line 9021) | getDefaultPlaceholder(e) {
    method resetSelection (line 9024) | resetSelection(e, t) {
    method render (line 9030) | render() {
    method showTooltip (line 9040) | showTooltip() {
    method hideTooltip (line 9043) | hideTooltip() {
    method _bindElements (line 9046) | _bindElements() {
    method _unbindElements (line 9052) | _unbindElements() {
    method _getLabel (line 9055) | _getLabel(e, t, i) {
    method _getDropdown (line 9058) | _getDropdown(e) {
    method _getIndicator (line 9171) | _getIndicator() {
    method _getOptionsSearchable (line 9174) | _getOptionsSearchable(e = !1, t) {
    method _getNotListedLabel (line 9183) | _getNotListedLabel() {
    method _handleNotListed (line 9186) | _handleNotListed() {
    method _handleClickDefault (line 9191) | _handleClickDefault(e, t, i) {
    method _handleClickSearchable (line 9197) | _handleClickSearchable(e) {
    method _handleMultiSelection (line 9203) | _handleMultiSelection(e, t) {
    method _handleInputChangeSearchable (line 9214) | _handleInputChangeSearchable(e) {
    method _handleBlurSearchable (line 9217) | _handleBlurSearchable(e) {
    method _handleFocusSearchable (line 9220) | _handleFocusSearchable(e) {
    method _toggleView (line 9227) | _toggleView(e) {
    method _handleChange (line 9233) | _handleChange(e) {
    method _handleBlur (line 9241) | _handleBlur(e) {
    method _handleFocus (line 9244) | _handleFocus(e) {
  function S (line 4077) | function S(e, t, i = !1) {
  function s (line 4117) | function s(e, t) {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function _ (line 4129) | function _(e) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function l (line 4144) | function l(e, t, i) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function d (line 4164) | function d(e = c, t) {
  function s (line 4221) | function s() {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function s (line 4261) | function s() {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function _ (line 4272) | function _(e, t, i) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  class l (line 4275) | class l extends n.Component {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function r (line 4368) | function r(e, t = {}) {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  function a (line 4371) | function a(e) {
  function o (line 4374) | function o() {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function n (line 4382) | function n(e, t) {
    method constructor (line 1640) | constructor(e, t) {
    method constructor (line 16893) | constructor(e, t) {
  function r (line 4386) | function r(e) {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  function s (line 4520) | function s(e, t) {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function _ (line 4532) | function _(e) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function l (line 4547) | function l(e, t, i) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function u (line 4552) | function u(e) {
  function m (line 4555) | function m(e) {
    method constructor (line 16233) | constructor(e, t) {
    method rpc (line 16236) | rpc(e, t, i) {
    method error (line 16267) | error(e, t, i, n, r) {
  function p (line 4558) | function p(e) {
    method constructor (line 16274) | constructor(e) {
    method request (line 16277) | request(e, t) {
  function g (line 4561) | function g(e) {
  function w (line 4564) | function w(e) {
  function v (line 4567) | function v(e, t) {
    method constructor (line 11193) | constructor() {
    method getPassword (line 11196) | getPassword() {
    method setPassword (line 11199) | setPassword(e) {
    method render (line 11202) | render() {
    method _getShowPasswordIcon (line 11226) | _getShowPasswordIcon() {
    method _getShowPasswordButton (line 11237) | _getShowPasswordButton() {
    method _getPasswordInput (line 11251) | _getPasswordInput() {
    method _handlePasswordChange (line 11285) | _handlePasswordChange(e) {
    method _handleShowPasswordChange (line 11289) | _handleShowPasswordChange() {
    method _handlePasswordSubmit (line 11293) | _handlePasswordSubmit(e) {
  function f (line 4570) | function f(e, t) {
  function h (line 4573) | function h(e, t, i) {
  function E (line 4576) | function E(e) {
    method GlobalInstance (line 21895) | static GlobalInstance() {
    method constructor (line 21898) | constructor(e) {
    method purge (line 21901) | purge(e) {
    method rehydrate (line 21904) | rehydrate(e, t) {
  function b (line 4579) | function b(e) {
    method constructor (line 8006) | constructor(e) {
    method render (line 8027) | render() {
    method _handlerStartToggleAuth (line 8232) | _handlerStartToggleAuth() {
    method _handleForgotPassword (line 8235) | _handleForgotPassword(e) {
    method _handleLoginSelection (line 8240) | _handleLoginSelection(e) {
    method _handleLanguageSelection (line 8244) | _handleLanguageSelection(e) {
    method _handleUsernameChange (line 8247) | _handleUsernameChange(e) {
    method _handlePasswordSubmit (line 8251) | _handlePasswordSubmit() {
    method _handleSubmit (line 8254) | _handleSubmit(e) {
  function y (line 4582) | function y(e, t) {
    method constructor (line 8980) | constructor(e) {
    method componentDidMount (line 9005) | componentDidMount() {
    method componentWillReceiveProps (line 9008) | componentWillReceiveProps(e) {
    method componentWillUnmount (line 9015) | componentWillUnmount() {
    method getDefaultSelection (line 9018) | getDefaultSelection(e) {
    method getDefaultPlaceholder (line 9021) | getDefaultPlaceholder(e) {
    method resetSelection (line 9024) | resetSelection(e, t) {
    method render (line 9030) | render() {
    method showTooltip (line 9040) | showTooltip() {
    method hideTooltip (line 9043) | hideTooltip() {
    method _bindElements (line 9046) | _bindElements() {
    method _unbindElements (line 9052) | _unbindElements() {
    method _getLabel (line 9055) | _getLabel(e, t, i) {
    method _getDropdown (line 9058) | _getDropdown(e) {
    method _getIndicator (line 9171) | _getIndicator() {
    method _getOptionsSearchable (line 9174) | _getOptionsSearchable(e = !1, t) {
    method _getNotListedLabel (line 9183) | _getNotListedLabel() {
    method _handleNotListed (line 9186) | _handleNotListed() {
    method _handleClickDefault (line 9191) | _handleClickDefault(e, t, i) {
    method _handleClickSearchable (line 9197) | _handleClickSearchable(e) {
    method _handleMultiSelection (line 9203) | _handleMultiSelection(e, t) {
    method _handleInputChangeSearchable (line 9214) | _handleInputChangeSearchable(e) {
    method _handleBlurSearchable (line 9217) | _handleBlurSearchable(e) {
    method _handleFocusSearchable (line 9220) | _handleFocusSearchable(e) {
    method _toggleView (line 9227) | _toggleView(e) {
    method _handleChange (line 9233) | _handleChange(e) {
    method _handleBlur (line 9241) | _handleBlur(e) {
    method _handleFocus (line 9244) | _handleFocus(e) {
  function S (line 4585) | function S(e) {
  function R (line 4589) | function R(e) {
  function T (line 4603) | function T(e) {
  function a (line 4708) | function a() {
  function o (line 4711) | function o() {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function d (line 4739) | function d(e, t) {
  function u (line 4751) | function u(e) {
  function m (line 4766) | function m(e, t, i) {
    method constructor (line 16233) | constructor(e, t) {
    method rpc (line 16236) | rpc(e, t, i) {
    method error (line 16267) | error(e, t, i, n, r) {
  function b (line 4777) | function b() {
    method constructor (line 8006) | constructor(e) {
    method render (line 8027) | render() {
    method _handlerStartToggleAuth (line 8232) | _handlerStartToggleAuth() {
    method _handleForgotPassword (line 8235) | _handleForgotPassword(e) {
    method _handleLoginSelection (line 8240) | _handleLoginSelection(e) {
    method _handleLanguageSelection (line 8244) | _handleLanguageSelection(e) {
    method _handleUsernameChange (line 8247) | _handleUsernameChange(e) {
    method _handlePasswordSubmit (line 8251) | _handlePasswordSubmit() {
    method _handleSubmit (line 8254) | _handleSubmit(e) {
  function y (line 4800) | function y() {
    method constructor (line 8980) | constructor(e) {
    method componentDidMount (line 9005) | componentDidMount() {
    method componentWillReceiveProps (line 9008) | componentWillReceiveProps(e) {
    method componentWillUnmount (line 9015) | componentWillUnmount() {
    method getDefaultSelection (line 9018) | getDefaultSelection(e) {
    method getDefaultPlaceholder (line 9021) | getDefaultPlaceholder(e) {
    method resetSelection (line 9024) | resetSelection(e, t) {
    method render (line 9030) | render() {
    method showTooltip (line 9040) | showTooltip() {
    method hideTooltip (line 9043) | hideTooltip() {
    method _bindElements (line 9046) | _bindElements() {
    method _unbindElements (line 9052) | _unbindElements() {
    method _getLabel (line 9055) | _getLabel(e, t, i) {
    method _getDropdown (line 9058) | _getDropdown(e) {
    method _getIndicator (line 9171) | _getIndicator() {
    method _getOptionsSearchable (line 9174) | _getOptionsSearchable(e = !1, t) {
    method _getNotListedLabel (line 9183) | _getNotListedLabel() {
    method _handleNotListed (line 9186) | _handleNotListed() {
    method _handleClickDefault (line 9191) | _handleClickDefault(e, t, i) {
    method _handleClickSearchable (line 9197) | _handleClickSearchable(e) {
    method _handleMultiSelection (line 9203) | _handleMultiSelection(e, t) {
    method _handleInputChangeSearchable (line 9214) | _handleInputChangeSearchable(e) {
    method _handleBlurSearchable (line 9217) | _handleBlurSearchable(e) {
    method _handleFocusSearchable (line 9220) | _handleFocusSearchable(e) {
    method _toggleView (line 9227) | _toggleView(e) {
    method _handleChange (line 9233) | _handleChange(e) {
    method _handleBlur (line 9241) | _handleBlur(e) {
    method _handleFocus (line 9244) | _handleFocus(e) {
  function S (line 4821) | function S(e) {
  function R (line 4837) | function R() {
  function w (line 5027) | function w(e) {
  function r (line 5085) | function r(e, t) {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  function a (line 5097) | function a(e) {
  function o (line 5112) | function o(e, t, i) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function _ (line 5116) | function _(e = s, t) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function l (line 5124) | function l(e) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function n (line 5146) | function n(e, t, i = 0) {
    method constructor (line 1640) | constructor(e, t) {
    method constructor (line 16893) | constructor(e, t) {
  function r (line 5151) | function r(e) {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  function a (line 5154) | function a(e) {
  function o (line 5160) | function o(e) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function c (line 5181) | function c() {
    method error (line 2613) | static error(e, t, i = !1) {
    method fatal (line 2623) | static fatal(e, t, i = !1) {
    method logFatal (line 2635) | static logFatal(e, t) {
    method constructor (line 2638) | constructor(e = _.GENERIC_ERROR, t, i, n = !1) {
    method getName (line 2641) | getName() {
    method setName (line 2644) | setName(e) {
    method isDetailed (line 2647) | isDetailed() {
    method isUnauthorized (line 2650) | isUnauthorized() {
    method toDetailedString (line 2653) | toDetailedString() {
    method toErrorString (line 2657) | toErrorString() {
    method getStackTrace (line 2661) | getStackTrace() {
    method toString (line 2664) | toString() {
    method toJSON (line 2667) | toJSON() {
    method constructor (line 13936) | constructor(e) {
    method render (line 13939) | render() {
    method _getCaret (line 13948) | _getCaret() {
    method _getContent (line 13953) | _getContent() {
    method _handleCollapseToggle (line 13959) | _handleCollapseToggle(e) {
  method constructor (line 5199) | constructor(e) {
  method componentWillReceiveProps (line 5208) | componentWillReceiveProps(e) {
  method componentWillUnmount (line 5212) | componentWillUnmount() {
  method render (line 5215) | render() {
  method _handleCheckForToggle (line 5226) | _handleCheckForToggle() {
  method _checkForToggle (line 5229) | async _checkForToggle() {
  method _handleChangeLoginHeader (line 5239) | _handleChangeLoginHeader(e) {
  method _handleChangeLoginModal (line 5242) | _handleChangeLoginModal(e) {
  method _getLoginHeaderView (line 5245) | _getLoginHeaderView() {
  function a (line 5277) | function a(e, t = {}) {
  function o (line 5280) | function o(e, t = {}) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function c (line 5312) | function c(e, t) {
    method error (line 2613) | static error(e, t, i = !1) {
    method fatal (line 2623) | static fatal(e, t, i = !1) {
    method logFatal (line 2635) | static logFatal(e, t) {
    method constructor (line 2638) | constructor(e = _.GENERIC_ERROR, t, i, n = !1) {
    method getName (line 2641) | getName() {
    method setName (line 2644) | setName(e) {
    method isDetailed (line 2647) | isDetailed() {
    method isUnauthorized (line 2650) | isUnauthorized() {
    method toDetailedString (line 2653) | toDetailedString() {
    method toErrorString (line 2657) | toErrorString() {
    method getStackTrace (line 2661) | getStackTrace() {
    method toString (line 2664) | toString() {
    method toJSON (line 2667) | toJSON() {
    method constructor (line 13936) | constructor(e) {
    method render (line 13939) | render() {
    method _getCaret (line 13948) | _getCaret() {
    method _getContent (line 13953) | _getContent() {
    method _handleCollapseToggle (line 13959) | _handleCollapseToggle(e) {
  function d (line 5324) | function d(e) {
  function u (line 5339) | function u(e, t, i) {
  function v (line 5346) | function v() {
    method constructor (line 11193) | constructor() {
    method getPassword (line 11196) | getPassword() {
    method setPassword (line 11199) | setPassword(e) {
    method render (line 11202) | render() {
    method _getShowPasswordIcon (line 11226) | _getShowPasswordIcon() {
    method _getShowPasswordButton (line 11237) | _getShowPasswordButton() {
    method _getPasswordInput (line 11251) | _getPasswordInput() {
    method _handlePasswordChange (line 11285) | _handlePasswordChange(e) {
    method _handleShowPasswordChange (line 11289) | _handleShowPasswordChange() {
    method _handlePasswordSubmit (line 11293) | _handlePasswordSubmit(e) {
  function f (line 5366) | function f() {
  function h (line 5390) | async function h() {
  class r (line 5409) | class r {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  class o (line 5471) | class o {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  class s (line 5555) | class s extends o {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  class _ (line 5563) | class _ extends o {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function d (line 5583) | function d(e) {
  function u (line 5587) | function u(e) {
  function m (line 5591) | function m(e) {
    method constructor (line 16233) | constructor(e, t) {
    method rpc (line 16236) | rpc(e, t, i) {
    method error (line 16267) | error(e, t, i, n, r) {
  function p (line 5595) | function p(e, t) {
    method constructor (line 16274) | constructor(e) {
    method request (line 16277) | request(e, t) {
  function g (line 5600) | function g(e) {
  function w (line 5606) | function w(e, t) {
  method decode (line 5646) | decode(e, t) {
  method encode (line 5664) | encode(e, i = n.Writer.create()) {
  method decode (line 5668) | decode(e, i) {
  method encode (line 5689) | encode(e, t = n.Writer.create()) {
  method decode (line 5699) | decode(e, t) {
  function a (line 5767) | function a(e, t) {
  function o (line 5770) | function o(e, t) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function s (line 5773) | function s(e, t, i, r = "", a = {}) {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function l (line 5777) | function l(e, t, i, r = "", a = {}) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function d (line 5781) | function d(e, t, i, r = "", a = {}) {
  function u (line 5960) | function u(e, t) {
  function m (line 5972) | function m(e) {
    method constructor (line 16233) | constructor(e, t) {
    method rpc (line 16236) | rpc(e, t, i) {
    method error (line 16267) | error(e, t, i, n, r) {
  function p (line 5987) | function p(e, t, i) {
    method constructor (line 16274) | constructor(e) {
    method request (line 16277) | request(e, t) {
  function v (line 5992) | function v(e) {
    method constructor (line 11193) | constructor() {
    method getPassword (line 11196) | getPassword() {
    method setPassword (line 11199) | setPassword(e) {
    method render (line 11202) | render() {
    method _getShowPasswordIcon (line 11226) | _getShowPasswordIcon() {
    method _getShowPasswordButton (line 11237) | _getShowPasswordButton() {
    method _getPasswordInput (line 11251) | _getPasswordInput() {
    method _handlePasswordChange (line 11285) | _handlePasswordChange(e) {
    method _handleShowPasswordChange (line 11289) | _handleShowPasswordChange() {
    method _handlePasswordSubmit (line 11293) | _handlePasswordSubmit(e) {
  function R (line 6001) | function R(e) {
  function G (line 6018) | function G() {
  function j (line 6033) | function j(e = !1) {
  function W (line 6048) | function W() {
  function F (line 6070) | function F() {
  function q (line 6086) | function q() {
  function x (line 6096) | function x() {
  function B (line 6102) | function B() {
  function H (line 6112) | function H() {
  function K (line 6126) | function K(e) {
  function Y (line 6142) | function Y(e) {
  function Q (line 6156) | function Q() {
  function Z (line 6171) | function Z() {
  function n (line 6197) | function n(e) {
    method constructor (line 1640) | constructor(e, t) {
    method constructor (line 16893) | constructor(e, t) {
  function r (line 6200) | function r(e) {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  function l (line 6248) | function l(e) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function ge (line 6385) | function ge(e) {
  method decode (line 6506) | decode(e, t) {
  method decode (line 6528) | decode(e, t) {
  method decode (line 6547) | decode(e, t) {
  method decode (line 6571) | decode(e, t) {
  method decode (line 6604) | decode(e, t) {
  method decode (line 6638) | decode(e, t) {
  method decode (line 6662) | decode(e, t) {
  method encode (line 6683) | encode(e, t = r.Writer.create()) {
  method decode (line 6688) | decode(e, t) {
  method decode (line 6724) | decode(e, t) {
  method decode (line 6753) | decode(e, i) {
  method decode (line 6793) | decode(e, i) {
  method decode (line 6830) | decode(e, t) {
  method decode (line 6849) | decode(e, t) {
  method decode (line 6868) | decode(e, t) {
  method decode (line 6890) | decode(e, i) {
  method decode (line 6917) | decode(e, i) {
  method decode (line 6951) | decode(e, i) {
  method encode (line 6978) | encode(e, i = r.Writer.create()) {
  method decode (line 6990) | decode(e, i) {
  method decode (line 7033) | decode(e, t) {
  method decode (line 7058) | decode(e, t) {
  method decode (line 7083) | decode(e, t) {
  method decode (line 7105) | decode(e, t) {
  method encode (line 7135) | encode(e, i = r.Writer.create()) {
  method decode (line 7139) | decode(e, i) {
  method decode (line 7164) | decode(e, t) {
  method decode (line 7192) | decode(e, t) {
  method decode (line 7211) | decode(e, t) {
  method decode (line 7232) | decode(e, i) {
  method decode (line 7266) | decode(e, t) {
  method decode (line 7279) | decode(e, t) {
  method decode (line 7292) | decode(e, t) {
  method decode (line 7311) | decode(e, t) {
  method decode (line 7324) | decode(e, t) {
  method decode (line 7337) | decode(e, t) {
  method decode (line 7350) | decode(e, t) {
  method decode (line 7363) | decode(e, t) {
  method decode (line 7376) | decode(e, t) {
  method decode (line 7389) | decode(e, t) {
  method decode (line 7402) | decode(e, t) {
  method decode (line 7421) | decode(e, i) {
  method decode (line 7449) | decode(e, t) {
  method encode (line 7461) | encode(e, i = r.Writer.create()) {
  method decode (line 7466) | decode(e, i) {
  method encode (line 7490) | encode(e, t = r.Writer.create()) {
  method decode (line 7495) | decode(e, t) {
  method encode (line 7522) | encode(e, i = r.Writer.create()) {
  method decode (line 7526) | decode(e, i) {
  method decode (line 7545) | decode(e, i) {
  method decode (line 7571) | decode(e, i) {
  method decode (line 7593) | decode(e, i) {
  method decode (line 7612) | decode(e, i) {
  method decode (line 7631) | decode(e, t) {
  method decode (line 7650) | decode(e, t) {
  method decode (line 7663) | decode(e, t) {
  method decode (line 7681) | decode(e, i) {
  method decode (line 7711) | decode(e, i) {
  method decode (line 7741) | decode(e, i) {
  method decode (line 7766) | decode(e, t) {
  method decode (line 7779) | decode(e, t) {
  method decode (line 7801) | decode(e, t) {
  method decode (line 7814) | decode(e, t) {
  method encode (line 7826) | encode(e, i = r.Writer.create()) {
  method decode (line 7830) | decode(e, i) {
  method encode (line 7848) | encode(e, i = r.Writer.create()) {
  method decode (line 7852) | decode(e, i) {
  method decode (line 7871) | decode(e, t) {
  method decode (line 7890) | decode(e, i) {
  method decode (line 7909) | decode(e, t) {
  method decode (line 7928) | decode(e, t) {
  function h (line 7982) | function h(e, t, i) {
  class b (line 8005) | class b extends r.Component {
    method constructor (line 8006) | constructor(e) {
    method render (line 8027) | render() {
    method _handlerStartToggleAuth (line 8232) | _handlerStartToggleAuth() {
    method _handleForgotPassword (line 8235) | _handleForgotPassword(e) {
    method _handleLoginSelection (line 8240) | _handleLoginSelection(e) {
    method _handleLanguageSelection (line 8244) | _handleLanguageSelection(e) {
    method _handleUsernameChange (line 8247) | _handleUsernameChange(e) {
    method _handlePasswordSubmit (line 8251) | _handlePasswordSubmit() {
    method _handleSubmit (line 8254) | _handleSubmit(e) {
  function n (line 8313) | function n(e) {
    method constructor (line 1640) | constructor(e, t) {
    method constructor (line 16893) | constructor(e, t) {
  function _ (line 8340) | function _(e, t) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function l (line 8352) | function l(e) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function c (line 8367) | function c(e, t, i) {
    method error (line 2613) | static error(e, t, i = !1) {
    method fatal (line 2623) | static fatal(e, t, i = !1) {
    method logFatal (line 2635) | static logFatal(e, t) {
    method constructor (line 2638) | constructor(e = _.GENERIC_ERROR, t, i, n = !1) {
    method getName (line 2641) | getName() {
    method setName (line 2644) | setName(e) {
    method isDetailed (line 2647) | isDetailed() {
    method isUnauthorized (line 2650) | isUnauthorized() {
    method toDetailedString (line 2653) | toDetailedString() {
    method toErrorString (line 2657) | toErrorString() {
    method getStackTrace (line 2661) | getStackTrace() {
    method toString (line 2664) | toString() {
    method toJSON (line 2667) | toJSON() {
    method constructor (line 13936) | constructor(e) {
    method render (line 13939) | render() {
    method _getCaret (line 13948) | _getCaret() {
    method _getContent (line 13953) | _getContent() {
    method _handleCollapseToggle (line 13959) | _handleCollapseToggle(e) {
  function m (line 8372) | function m(e = u, t) {
    method constructor (line 16233) | constructor(e, t) {
    method rpc (line 16236) | rpc(e, t, i) {
    method error (line 16267) | error(e, t, i, n, r) {
  function c (line 8549) | function c(e, t) {
    method error (line 2613) | static error(e, t, i = !1) {
    method fatal (line 2623) | static fatal(e, t, i = !1) {
    method logFatal (line 2635) | static logFatal(e, t) {
    method constructor (line 2638) | constructor(e = _.GENERIC_ERROR, t, i, n = !1) {
    method getName (line 2641) | getName() {
    method setName (line 2644) | setName(e) {
    method isDetailed (line 2647) | isDetailed() {
    method isUnauthorized (line 2650) | isUnauthorized() {
    method toDetailedString (line 2653) | toDetailedString() {
    method toErrorString (line 2657) | toErrorString() {
    method getStackTrace (line 2661) | getStackTrace() {
    method toString (line 2664) | toString() {
    method toJSON (line 2667) | toJSON() {
    method constructor (line 13936) | constructor(e) {
    method render (line 13939) | render() {
    method _getCaret (line 13948) | _getCaret() {
    method _getContent (line 13953) | _getContent() {
    method _handleCollapseToggle (line 13959) | _handleCollapseToggle(e) {
  function d (line 8561) | function d(e) {
  function u (line 8576) | function u(e, t, i) {
  function m (line 8579) | function m(e) {
    method constructor (line 16233) | constructor(e, t) {
    method rpc (line 16236) | rpc(e, t, i) {
    method error (line 16267) | error(e, t, i, n, r) {
  function p (line 8582) | function p(e, t) {
    method constructor (line 16274) | constructor(e) {
    method request (line 16277) | request(e, t) {
  function E (line 8590) | function E() {
    method GlobalInstance (line 21895) | static GlobalInstance() {
    method constructor (line 21898) | constructor(e) {
    method purge (line 21901) | purge(e) {
    method rehydrate (line 21904) | rehydrate(e, t) {
  function b (line 8593) | function b() {
    method constructor (line 8006) | constructor(e) {
    method render (line 8027) | render() {
    method _handlerStartToggleAuth (line 8232) | _handlerStartToggleAuth() {
    method _handleForgotPassword (line 8235) | _handleForgotPassword(e) {
    method _handleLoginSelection (line 8240) | _handleLoginSelection(e) {
    method _handleLanguageSelection (line 8244) | _handleLanguageSelection(e) {
    method _handleUsernameChange (line 8247) | _handleUsernameChange(e) {
    method _handlePasswordSubmit (line 8251) | _handlePasswordSubmit() {
    method _handleSubmit (line 8254) | _handleSubmit(e) {
  function y (line 8604) | function y() {
    method constructor (line 8980) | constructor(e) {
    method componentDidMount (line 9005) | componentDidMount() {
    method componentWillReceiveProps (line 9008) | componentWillReceiveProps(e) {
    method componentWillUnmount (line 9015) | componentWillUnmount() {
    method getDefaultSelection (line 9018) | getDefaultSelection(e) {
    method getDefaultPlaceholder (line 9021) | getDefaultPlaceholder(e) {
    method resetSelection (line 9024) | resetSelection(e, t) {
    method render (line 9030) | render() {
    method showTooltip (line 9040) | showTooltip() {
    method hideTooltip (line 9043) | hideTooltip() {
    method _bindElements (line 9046) | _bindElements() {
    method _unbindElements (line 9052) | _unbindElements() {
    method _getLabel (line 9055) | _getLabel(e, t, i) {
    method _getDropdown (line 9058) | _getDropdown(e) {
    method _getIndicator (line 9171) | _getIndicator() {
    method _getOptionsSearchable (line 9174) | _getOptionsSearchable(e = !1, t) {
    method _getNotListedLabel (line 9183) | _getNotListedLabel() {
    method _handleNotListed (line 9186) | _handleNotListed() {
    method _handleClickDefault (line 9191) | _handleClickDefault(e, t, i) {
    method _handleClickSearchable (line 9197) | _handleClickSearchable(e) {
    method _handleMultiSelection (line 9203) | _handleMultiSelection(e, t) {
    method _handleInputChangeSearchable (line 9214) | _handleInputChangeSearchable(e) {
    method _handleBlurSearchable (line 9217) | _handleBlurSearchable(e) {
    method _handleFocusSearchable (line 9220) | _handleFocusSearchable(e) {
    method _toggleView (line 9227) | _toggleView(e) {
    method _handleChange (line 9233) | _handleChange(e) {
    method _handleBlur (line 9241) | _handleBlur(e) {
    method _handleFocus (line 9244) | _handleFocus(e) {
  function S (line 8616) | function S() {
  function d (line 8698) | function d(e, t) {
  function u (line 8710) | function u(e) {
  function m (line 8725) | function m(e, t, i) {
    method constructor (line 16233) | constructor(e, t) {
    method rpc (line 16236) | rpc(e, t, i) {
    method error (line 16267) | error(e, t, i, n, r) {
  function M (line 8749) | function M() {
  function z (line 8767) | function z() {
  function U (line 8785) | function U({ siteName: e }) {
  function V (line 8801) | function V(e) {
  function G (line 8815) | function G() {
  function j (line 8833) | function j() {
  function W (line 8855) | function W(e) {
  function F (line 8868) | function F({ mode: e, backupReserve: t, generationLimit: i, solarLimit: ...
  function q (line 8901) | function q() {
  function x (line 8913) | function x(e) {
  function w (line 8954) | function w() {
  function v (line 8965) | function v(e, t, i) {
    method constructor (line 11193) | constructor() {
    method getPassword (line 11196) | getPassword() {
    method setPassword (line 11199) | setPassword(e) {
    method render (line 11202) | render() {
    method _getShowPasswordIcon (line 11226) | _getShowPasswordIcon() {
    method _getShowPasswordButton (line 11237) | _getShowPasswordButton() {
    method _getPasswordInput (line 11251) | _getPasswordInput() {
    method _handlePasswordChange (line 11285) | _handlePasswordChange(e) {
    method _handleShowPasswordChange (line 11289) | _handleShowPasswordChange() {
    method _handlePasswordSubmit (line 11293) | _handlePasswordSubmit(e) {
  class y (line 8979) | class y extends a.Component {
    method constructor (line 8980) | constructor(e) {
    method componentDidMount (line 9005) | componentDidMount() {
    method componentWillReceiveProps (line 9008) | componentWillReceiveProps(e) {
    method componentWillUnmount (line 9015) | componentWillUnmount() {
    method getDefaultSelection (line 9018) | getDefaultSelection(e) {
    method getDefaultPlaceholder (line 9021) | getDefaultPlaceholder(e) {
    method resetSelection (line 9024) | resetSelection(e, t) {
    method render (line 9030) | render() {
    method showTooltip (line 9040) | showTooltip() {
    method hideTooltip (line 9043) | hideTooltip() {
    method _bindElements (line 9046) | _bindElements() {
    method _unbindElements (line 9052) | _unbindElements() {
    method _getLabel (line 9055) | _getLabel(e, t, i) {
    method _getDropdown (line 9058) | _getDropdown(e) {
    method _getIndicator (line 9171) | _getIndicator() {
    method _getOptionsSearchable (line 9174) | _getOptionsSearchable(e = !1, t) {
    method _getNotListedLabel (line 9183) | _getNotListedLabel() {
    method _handleNotListed (line 9186) | _handleNotListed() {
    method _handleClickDefault (line 9191) | _handleClickDefault(e, t, i) {
    method _handleClickSearchable (line 9197) | _handleClickSearchable(e) {
    method _handleMultiSelection (line 9203) | _handleMultiSelection(e, t) {
    method _handleInputChangeSearchable (line 9214) | _handleInputChangeSearchable(e) {
    method _handleBlurSearchable (line 9217) | _handleBlurSearchable(e) {
    method _handleFocusSearchable (line 9220) | _handleFocusSearchable(e) {
    method _toggleView (line 9227) | _toggleView(e) {
    method _handleChange (line 9233) | _handleChange(e) {
    method _handleBlur (line 9241) | _handleBlur(e) {
    method _handleFocus (line 9244) | _handleFocus(e) {
  function a (line 9273) | function a() {
  function o (line 9284) | function o(e, t) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function r (line 9337) | function r(e, t) {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  function a (line 9340) | function a(e, t) {
  function o (line 9343) | function o(e, t) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function s (line 9346) | function s(e, t) {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function _ (line 9349) | function _(e, t) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function l (line 9352) | function l(e, t) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function c (line 9355) | function c(e, t) {
    method error (line 2613) | static error(e, t, i = !1) {
    method fatal (line 2623) | static fatal(e, t, i = !1) {
    method logFatal (line 2635) | static logFatal(e, t) {
    method constructor (line 2638) | constructor(e = _.GENERIC_ERROR, t, i, n = !1) {
    method getName (line 2641) | getName() {
    method setName (line 2644) | setName(e) {
    method isDetailed (line 2647) | isDetailed() {
    method isUnauthorized (line 2650) | isUnauthorized() {
    method toDetailedString (line 2653) | toDetailedString() {
    method toErrorString (line 2657) | toErrorString() {
    method getStackTrace (line 2661) | getStackTrace() {
    method toString (line 2664) | toString() {
    method toJSON (line 2667) | toJSON() {
    method constructor (line 13936) | constructor(e) {
    method render (line 13939) | render() {
    method _getCaret (line 13948) | _getCaret() {
    method _getContent (line 13953) | _getContent() {
    method _handleCollapseToggle (line 13959) | _handleCollapseToggle(e) {
  function d (line 9363) | function d(e, t) {
  function g (line 9837) | function g(e, t) {
  function w (line 9849) | function w(e) {
  function v (line 9864) | function v(e, t, i) {
    method constructor (line 11193) | constructor() {
    method getPassword (line 11196) | getPassword() {
    method setPassword (line 11199) | setPassword(e) {
    method render (line 11202) | render() {
    method _getShowPasswordIcon (line 11226) | _getShowPasswordIcon() {
    method _getShowPasswordButton (line 11237) | _getShowPasswordButton() {
    method _getPasswordInput (line 11251) | _getPasswordInput() {
    method _handlePasswordChange (line 11285) | _handlePasswordChange(e) {
    method _handleShowPasswordChange (line 11289) | _handleShowPasswordChange() {
    method _handlePasswordSubmit (line 11293) | _handlePasswordSubmit(e) {
  function k (line 9880) | function k(e) {
  function L (line 9885) | function L(e) {
    method render (line 17566) | render() {
  function M (line 9888) | function M(e, t = null) {
  function U (line 9892) | function U() {
  function ae (line 9916) | function ae(e) {
    method render (line 17632) | render() {
    method _showSolarRGMProblemModal (line 17674) | _showSolarRGMProblemModal(e) {
    method _getClassName (line 17690) | _getClassName(e, t) {
    method _getProgressIndication (line 17694) | _getProgressIndication(e, t, i) {
  function se (line 9920) | function se() {
  function _e (line 9935) | function _e(e, t) {
  function le (line 9951) | function le(e, t, i, n, o, s, c) {
  function ce (line 9973) | function ce(e, t, i, n, o, s) {
    method constructor (line 17733) | constructor(e) {
    method render (line 17736) | render() {
    method _handleDetailedClick (line 17742) | _handleDetailedClick(e) {
  function de (line 9992) | function de() {
  function ue (line 10024) | async function ue() {
  function me (line 10031) | function me(e, t, i, n, s, _, l = 1e4) {
  function pe (line 10063) | async function pe(e) {
    method _renderDefaultView (line 17812) | _renderDefaultView() {
    method render (line 17821) | render() {
  function ge (line 10080) | async function ge() {
  function we (line 10090) | function we(e, t) {
    method constructor (line 17833) | constructor(e) {
    method _getCloseHandler (line 17836) | _getCloseHandler(e, t) {
    method render (line 17845) | render() {
  function ve (line 10113) | function ve(e) {
  function fe (line 10132) | function fe() {
  function he (line 10164) | function he(e, t = !0) {
  function Ee (line 10183) | function Ee(e, t) {
  function be (line 10199) | function be(e, t) {
  function ye (line 10216) | function ye() {
  function Se (line 10239) | function Se(e) {
  function Re (line 10259) | function Re() {
    method constructor (line 17919) | constructor(e) {
    method render (line 17922) | render() {
    method componentDidMount (line 17940) | componentDidMount() {
    method _getClassName (line 17943) | _getClassName(e) {
    method _getLink (line 17946) | _getLink(e, t) {
    method _getLinkClassName (line 17985) | _getLinkClassName(e, t) {
    method _getText (line 17989) | _getText(e) {
    method _handleClick (line 17992) | _handleClick(e) {
  function Te (line 10279) | function Te() {
    method render (line 18000) | render() {
  function Ae (line 10299) | function Ae(e) {
  function Ce (line 10313) | function Ce() {
  function u (line 10364) | function u(e, t) {
  function m (line 10376) | function m(e) {
    method constructor (line 16233) | constructor(e, t) {
    method rpc (line 16236) | rpc(e, t, i) {
    method error (line 16267) | error(e, t, i, n, r) {
  function p (line 10391) | function p(e, t, i) {
    method constructor (line 16274) | constructor(e) {
    method request (line 16277) | request(e, t) {
  function S (line 10402) | function S() {
  function R (line 10422) | function R(e, t = !1) {
  function T (line 10446) | async function T() {
  function A (line 10455) | function A() {
    method constructor (line 17378) | constructor(...e) {
    method render (line 17381) | render() {
    method _navigateToSecurity (line 17409) | _navigateToSecurity() {
    method _handleClick (line 17413) | _handleClick(e) {
  function C (line 10469) | function C(e) {
  function w (line 10577) | function w(e, t) {
  function v (line 10589) | function v(e) {
    method constructor (line 11193) | constructor() {
    method getPassword (line 11196) | getPassword() {
    method setPassword (line 11199) | setPassword(e) {
    method render (line 11202) | render() {
    method _getShowPasswordIcon (line 11226) | _getShowPasswordIcon() {
    method _getShowPasswordButton (line 11237) | _getShowPasswordButton() {
    method _getPasswordInput (line 11251) | _getPasswordInput() {
    method _handlePasswordChange (line 11285) | _handlePasswordChange(e) {
    method _handleShowPasswordChange (line 11289) | _handleShowPasswordChange() {
    method _handlePasswordSubmit (line 11293) | _handlePasswordSubmit(e) {
  function f (line 10604) | function f(e, t, i) {
  function b (line 10609) | function b(e) {
    method constructor (line 8006) | constructor(e) {
    method render (line 8027) | render() {
    method _handlerStartToggleAuth (line 8232) | _handlerStartToggleAuth() {
    method _handleForgotPassword (line 8235) | _handleForgotPassword(e) {
    method _handleLoginSelection (line 8240) | _handleLoginSelection(e) {
    method _handleLanguageSelection (line 8244) | _handleLanguageSelection(e) {
    method _handleUsernameChange (line 8247) | _handleUsernameChange(e) {
    method _handlePasswordSubmit (line 8251) | _handlePasswordSubmit() {
    method _handleSubmit (line 8254) | _handleSubmit(e) {
  function R (line 10614) | function R(e) {
  function U (line 10629) | function U(e) {
  function V (line 10632) | function V() {
  function G (line 10635) | function G() {
  function j (line 10650) | function j() {
  function W (line 10666) | function W(e, t, i, n, r) {
  function F (line 10684) | function F(e, t, i, n = 1e3, r = 45) {
  function q (line 10701) | function q(e, t, i, n, r, s, l = 1e3, c = 45) {
  function x (line 10718) | function x(e, t) {
  function B (line 10734) | function B(e, t, i) {
  function H (line 10751) | async function H(e, t) {
  function K (line 10761) | async function K(e, t = !1) {
  function Y (line 10771) | async function Y(e, t = 1e3) {
  function Q (line 10788) | async function Q(e) {
  function Z (line 10800) | async function Z(e) {
  function J (line 10809) | async function J() {
  function X (line 10818) | async function X() {
  function $ (line 10828) | async function $(e = 2e3) {
  function ee (line 10841) | function ee(e) {
  function te (line 10856) | function te() {
  function a (line 10886) | function a(e, t) {
  function o (line 10898) | function o(e) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function s (line 10913) | function s(e, t, i) {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function l (line 10917) | function l(e = _, { type: t, payload: i }) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function u (line 10959) | function u(e, t) {
  function m (line 10971) | function m(e) {
    method constructor (line 16233) | constructor(e, t) {
    method rpc (line 16236) | rpc(e, t, i) {
    method error (line 16267) | error(e, t, i, n, r) {
  function p (line 10986) | function p(e, t, i) {
    method constructor (line 16274) | constructor(e) {
    method request (line 16277) | request(e, t) {
  function S (line 10997) | function S() {
  function R (line 11016) | function R({ given_name: e, family_name: t, email: i, phone: o, street: ...
  function T (line 11052) | function T({ marketing: e, privacyNotice: t, limitedWarranty: i, gridSer...
  function A (line 11071) | function A() {
    method constructor (line 17378) | constructor(...e) {
    method render (line 17381) | render() {
    method _navigateToSecurity (line 17409) | _navigateToSecurity() {
    method _handleClick (line 17413) | _handleClick(e) {
  function r (line 11100) | function r(e, t) {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  function a (line 11112) | function a(e) {
  function o (line 11127) | function o(e, t, i) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function _ (line 11131) | function _(e = s, { type: t, payload: i }) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  class v (line 11192) | class v extends s.Component {
    method constructor (line 11193) | constructor() {
    method getPassword (line 11196) | getPassword() {
    method setPassword (line 11199) | setPassword(e) {
    method render (line 11202) | render() {
    method _getShowPasswordIcon (line 11226) | _getShowPasswordIcon() {
    method _getShowPasswordButton (line 11237) | _getShowPasswordButton() {
    method _getPasswordInput (line 11251) | _getPasswordInput() {
    method _handlePasswordChange (line 11285) | _handlePasswordChange(e) {
    method _handleShowPasswordChange (line 11289) | _handleShowPasswordChange() {
    method _handlePasswordSubmit (line 11293) | _handlePasswordSubmit(e) {
  function d (line 11370) | function d(e, t) {
  function u (line 11382) | function u(e, t, i) {
  function p (line 11386) | function p(e) {
    method constructor (line 16274) | constructor(e) {
    method request (line 16277) | request(e, t) {
  function E (line 11408) | function E() {
    method GlobalInstance (line 21895) | static GlobalInstance() {
    method constructor (line 21898) | constructor(e) {
    method purge (line 21901) | purge(e) {
    method rehydrate (line 21904) | rehydrate(e, t) {
  function b (line 11424) | function b() {
    method constructor (line 8006) | constructor(e) {
    method render (line 8027) | render() {
    method _handlerStartToggleAuth (line 8232) | _handlerStartToggleAuth() {
    method _handleForgotPassword (line 8235) | _handleForgotPassword(e) {
    method _handleLoginSelection (line 8240) | _handleLoginSelection(e) {
    method _handleLanguageSelection (line 8244) | _handleLanguageSelection(e) {
    method _handleUsernameChange (line 8247) | _handleUsernameChange(e) {
    method _handlePasswordSubmit (line 8251) | _handlePasswordSubmit() {
    method _handleSubmit (line 8254) | _handleSubmit(e) {
  function y (line 11445) | function y() {
    method constructor (line 8980) | constructor(e) {
    method componentDidMount (line 9005) | componentDidMount() {
    method componentWillReceiveProps (line 9008) | componentWillReceiveProps(e) {
    method componentWillUnmount (line 9015) | componentWillUnmount() {
    method getDefaultSelection (line 9018) | getDefaultSelection(e) {
    method getDefaultPlaceholder (line 9021) | getDefaultPlaceholder(e) {
    method resetSelection (line 9024) | resetSelection(e, t) {
    method render (line 9030) | render() {
    method showTooltip (line 9040) | showTooltip() {
    method hideTooltip (line 9043) | hideTooltip() {
    method _bindElements (line 9046) | _bindElements() {
    method _unbindElements (line 9052) | _unbindElements() {
    method _getLabel (line 9055) | _getLabel(e, t, i) {
    method _getDropdown (line 9058) | _getDropdown(e) {
    method _getIndicator (line 9171) | _getIndicator() {
    method _getOptionsSearchable (line 9174) | _getOptionsSearchable(e = !1, t) {
    method _getNotListedLabel (line 9183) | _getNotListedLabel() {
    method _handleNotListed (line 9186) | _handleNotListed() {
    method _handleClickDefault (line 9191) | _handleClickDefault(e, t, i) {
    method _handleClickSearchable (line 9197) | _handleClickSearchable(e) {
    method _handleMultiSelection (line 9203) | _handleMultiSelection(e, t) {
    method _handleInputChangeSearchable (line 9214) | _handleInputChangeSearchable(e) {
    method _handleBlurSearchable (line 9217) | _handleBlurSearchable(e) {
    method _handleFocusSearchable (line 9220) | _handleFocusSearchable(e) {
    method _toggleView (line 9227) | _toggleView(e) {
    method _handleChange (line 9233) | _handleChange(e) {
    method _handleBlur (line 9241) | _handleBlur(e) {
    method _handleFocus (line 9244) | _handleFocus(e) {
  function S (line 11467) | function S() {
  function a (line 11497) | function a(e, t) {
  function o (line 11509) | function o(e) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function s (line 11524) | function s(e, t, i) {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function l (line 11549) | function l(e = _, t) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function c (line 11641) | function c(e) {
    method error (line 2613) | static error(e, t, i = !1) {
    method fatal (line 2623) | static fatal(e, t, i = !1) {
    method logFatal (line 2635) | static logFatal(e, t) {
    method constructor (line 2638) | constructor(e = _.GENERIC_ERROR, t, i, n = !1) {
    method getName (line 2641) | getName() {
    method setName (line 2644) | setName(e) {
    method isDetailed (line 2647) | isDetailed() {
    method isUnauthorized (line 2650) | isUnauthorized() {
    method toDetailedString (line 2653) | toDetailedString() {
    method toErrorString (line 2657) | toErrorString() {
    method getStackTrace (line 2661) | getStackTrace() {
    method toString (line 2664) | toString() {
    method toJSON (line 2667) | toJSON() {
    method constructor (line 13936) | constructor(e) {
    method render (line 13939) | render() {
    method _getCaret (line 13948) | _getCaret() {
    method _getContent (line 13953) | _getContent() {
    method _handleCollapseToggle (line 13959) | _handleCollapseToggle(e) {
  function d (line 11656) | function d({ powerwall: e }) {
  function s (line 11695) | function s(e, t) {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function _ (line 11707) | function _(e) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function l (line 11722) | function l(e, t, i) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function d (line 11726) | function d(e = c, t) {
  function w (line 12140) | function w(t) {
  function m (line 12182) | function m(e) {
    method constructor (line 16233) | constructor(e, t) {
    method rpc (line 16236) | rpc(e, t, i) {
    method error (line 16267) | error(e, t, i, n, r) {
  method decode (line 12188) | decode(e, t) {
  method decode (line 12207) | decode(e, t) {
  method decode (line 12226) | decode(e, t) {
  method decode (line 12245) | decode(e, t) {
  method decode (line 12264) | decode(e, t) {
  method decode (line 12283) | decode(e, t) {
  method decode (line 12302) | decode(e, t) {
  method decode (line 12321) | decode(e, t) {
  method decode (line 12340) | decode(e, t) {
  method decode (line 12407) | decode(e, t) {
  method decode (line 12429) | decode(e, t) {
  method decode (line 12451) | decode(e, t) {
  method decode (line 12473) | decode(e, t) {
  method encode (line 12491) | encode(e, i = r.Writer.create()) {
  method decode (line 12498) | decode(e, i) {
  method decode (line 12526) | decode(e, i) {
  method decode (line 12545) | decode(e, i) {
  method decode (line 12564) | decode(e, t) {
  method decode (line 12583) | decode(e, i) {
  method decode (line 12602) | decode(e, t) {
  method decode (line 12615) | decode(e, i) {
  function n (line 12686) | function n(e, t, i, n, a, o) {
    method constructor (line 1640) | constructor(e, t) {
    method constructor (line 16893) | constructor(e, t) {
  function r (line 12695) | function r(e, t) {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  function S (line 12853) | function S() {
  function r (line 12935) | function r(e, t) {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  function a (line 12947) | function a(e) {
  function o (line 12962) | function o(e, t, i) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function _ (line 12966) | function _(e = s, t) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  class _ (line 13105) | class _ extends o.Component {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function r (line 13237) | function r(e, t) {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  function a (line 13249) | function a(e) {
  function o (line 13264) | function o(e, t, i) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function _ (line 13288) | function _(e = s, t) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function l (line 13342) | function l(e, t) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function o (line 13372) | function o(e, t) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function s (line 13384) | function s(e) {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function _ (line 13399) | function _(e, t, i) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function c (line 13408) | function c(e = l, t) {
    method error (line 2613) | static error(e, t, i = !1) {
    method fatal (line 2623) | static fatal(e, t, i = !1) {
    method logFatal (line 2635) | static logFatal(e, t) {
    method constructor (line 2638) | constructor(e = _.GENERIC_ERROR, t, i, n = !1) {
    method getName (line 2641) | getName() {
    method setName (line 2644) | setName(e) {
    method isDetailed (line 2647) | isDetailed() {
    method isUnauthorized (line 2650) | isUnauthorized() {
    method toDetailedString (line 2653) | toDetailedString() {
    method toErrorString (line 2657) | toErrorString() {
    method getStackTrace (line 2661) | getStackTrace() {
    method toString (line 2664) | toString() {
    method toJSON (line 2667) | toJSON() {
    method constructor (line 13936) | constructor(e) {
    method render (line 13939) | render() {
    method _getCaret (line 13948) | _getCaret() {
    method _getContent (line 13953) | _getContent() {
    method _handleCollapseToggle (line 13959) | _handleCollapseToggle(e) {
  function d (line 13460) | function d(e) {
  function o (line 13662) | function o(e) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function s (line 13669) | function s(e) {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function _ (line 13676) | function _(e) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function h (line 13708) | function h(e) {
  class s (line 13866) | class s extends o.Component {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  class c (line 13935) | class c extends s.Component {
    method error (line 2613) | static error(e, t, i = !1) {
    method fatal (line 2623) | static fatal(e, t, i = !1) {
    method logFatal (line 2635) | static logFatal(e, t) {
    method constructor (line 2638) | constructor(e = _.GENERIC_ERROR, t, i, n = !1) {
    method getName (line 2641) | getName() {
    method setName (line 2644) | setName(e) {
    method isDetailed (line 2647) | isDetailed() {
    method isUnauthorized (line 2650) | isUnauthorized() {
    method toDetailedString (line 2653) | toDetailedString() {
    method toErrorString (line 2657) | toErrorString() {
    method getStackTrace (line 2661) | getStackTrace() {
    method toString (line 2664) | toString() {
    method toJSON (line 2667) | toJSON() {
    method constructor (line 13936) | constructor(e) {
    method render (line 13939) | render() {
    method _getCaret (line 13948) | _getCaret() {
    method _getContent (line 13953) | _getContent() {
    method _handleCollapseToggle (line 13959) | _handleCollapseToggle(e) {
  class r (line 13982) | class r extends Error {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  method constructor (line 13989) | constructor(e = "") {
  method _handleWorkerMessage (line 13992) | _handleWorkerMessage(e) {
  method scanBarcode (line 14000) | scanBarcode(e, t = []) {
  method stop (line 14008) | stop() {
  function _ (line 14043) | function _(e) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  method encode (line 14048) | encode(e, t = r.Writer.create()) {
  method decode (line 14059) | decode(e, t) {
  method encode (line 14089) | encode(e, i = r.Writer.create()) {
  method decode (line 14095) | decode(e, i) {
  method encode (line 14119) | encode(e, i = r.Writer.create()) {
  method decode (line 14123) | decode(e, i) {
  function r (line 14475) | function r(e) {
    method constructor (line 5410) | constructor(...e) {
    method addVitals (line 5414) | addVitals(e) {
    method hasNumber (line 5433) | hasNumber(e) {
    method getNumber (line 5436) | getNumber(e) {
    method hasString (line 5439) | hasString(e) {
    method getString (line 5442) | getString(e) {
    method hasBoolean (line 5445) | hasBoolean(e) {
    method getBoolean (line 5448) | getBoolean(e) {
    method size (line 5451) | size() {
    method constructor (line 13983) | constructor(e, t) {
  function a (line 14479) | function a(e) {
  function l (line 14702) | function l({ vitals: e }) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  function c (line 14718) | function c(e, t, i) {
    method error (line 2613) | static error(e, t, i = !1) {
    method fatal (line 2623) | static fatal(e, t, i = !1) {
    method logFatal (line 2635) | static logFatal(e, t) {
    method constructor (line 2638) | constructor(e = _.GENERIC_ERROR, t, i, n = !1) {
    method getName (line 2641) | getName() {
    method setName (line 2644) | setName(e) {
    method isDetailed (line 2647) | isDetailed() {
    method isUnauthorized (line 2650) | isUnauthorized() {
    method toDetailedString (line 2653) | toDetailedString() {
    method toErrorString (line 2657) | toErrorString() {
    method getStackTrace (line 2661) | getStackTrace() {
    method toString (line 2664) | toString() {
    method toJSON (line 2667) | toJSON() {
    method constructor (line 13936) | constructor(e) {
    method render (line 13939) | render() {
    method _getCaret (line 13948) | _getCaret() {
    method _getContent (line 13953) | _getContent() {
    method _handleCollapseToggle (line 13959) | _handleCollapseToggle(e) {
  function d (line 14724) | function d({ lineNumber: e, vitals: t }) {
  function u (line 14729) | function u({ lineNumber: e, vitals: t }) {
  function l (line 14756) | function l({ device: e }) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  method encode (line 14953) | encode(e, i = r.Writer.create()) {
  method decode (line 14957) | decode(e, i) {
  method decode (line 14976) | decode(e, t) {
  function f (line 15013) | function f(e) {
  function h (line 15016) | function h(e) {
  function E (line 15020) | function E(e) {
    method GlobalInstance (line 21895) | static GlobalInstance() {
    method constructor (line 21898) | constructor(e) {
    method purge (line 21901) | purge(e) {
    method rehydrate (line 21904) | rehydrate(e, t) {
  method encode (line 15025) | encode(e, i = r.Writer.create()) {
  method decode (line 15035) | decode(e, i) {
  method decode (line 15086) | decode(e, i) {
  method decode (line 15144) | decode(e, t) {
  method encode (line 15171) | encode(e, i = r.Writer.create()) {
  method decode (line 15181) | decode(e, i) {
  method decode (line 15214) | decode(e, t) {
  method decode (line 15246) | decode(e, i) {
  method decode (line 15277) | decode(e, t) {
  method decode (line 15299) | decode(e, t) {
  method encode (line 15317) | encode(e, t = r.Writer.create()) {
  method decode (line 15322) | decode(e, t) {
  method decode (line 15344) | decode(e, t) {
  method decode (line 15366) | decode(e, t) {
  method decode (line 15389) | decode(e, i) {
  function a (line 15415) | function a(e) {
  method decode (line 15421) | decode(e, t) {
  function o (line 15502) | function o(e) {
    method constructor (line 5472) | constructor(e, t) {
    method type (line 5475) | type() {
    method din (line 5483) | din() {
    method partNumber (line 5487) | partNumber() {
    method serialNumber (line 5490) | serialNumber() {
    method alerts (line 5495) | alerts() {
    method vitals (line 5499) | vitals() {
    method prefix (line 5502) | prefix() {
    method addChild (line 5506) | addChild(e) {
    method addFollower (line 5509) | addFollower(e) {
    method disabledReasons (line 5512) | disabledReasons() {
    method isDisabled (line 5519) | isDisabled() {
    method isDisabledRecursive (line 5525) | isDisabledRecursive() {
    method isDisabledBecause (line 5528) | isDisabledBecause(e) {
    method isDisabledBecauseRecursive (line 5531) | isDisabledBecauseRecursive(e) {
    method isUpdating (line 5534) | isUpdating() {
    method isUpdatingRecursive (line 5538) | isUpdatingRecursive() {
    method hasAlerts (line 5541) | hasAlerts() {
    method hasAlertsRecursive (line 5544) | hasAlertsRecursive() {
    method needsAttention (line 5547) | needsAttention(e) {
    method needsAttentionRecursive (line 5550) | needsAttentionRecursive(e) {
  function s (line 15509) | function s(e) {
    method message (line 2550) | static message(e, t, i = !1) {
    method debug (line 2561) | static debug(e, t, i = !1) {
    method warn (line 2572) | static warn(e, t, i = !1) {
    method trace (line 2583) | static trace(e) {
    method constructor (line 2586) | constructor(e, t) {
    method getMessage (line 2589) | getMessage() {
    method setMessage (line 2592) | setMessage(e) {
    method getContext (line 2595) | getContext() {
    method setContext (line 2598) | setContext(e) {
    method toError (line 2601) | toError() {
    method constructor (line 5556) | constructor(e, t) {
    method alerts (line 5559) | alerts() {
    method constructor (line 13867) | constructor() {
    method render (line 13870) | render() {
    method _handleFocus (line 13882) | _handleFocus() {
    method _handleBlur (line 13885) | _handleBlur() {
  function _ (line 15516) | function _(e) {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function A (line 15624) | function A() {
    method constructor (line 17378) | constructor(...e) {
    method render (line 17381) | render() {
    method _navigateToSecurity (line 17409) | _navigateToSecurity() {
    method _handleClick (line 17413) | _handleClick(e) {
  function C (line 15627) | function C() {
  function I (line 15630) | function I() {
  function O (line 15633) | function O() {
  function N (line 15644) | function N(e) {
  method encode (line 15832) | encode(e, t = r.Writer.create()) {
  method decode (line 15837) | decode(e, t) {
  method decode (line 15868) | decode(e, t) {
  method getSystemInfo (line 15943) | getSystemInfo(i) {
  method setLocalSiteConfig (line 15952) | setLocalSiteConfig(i) {
  method performUpdate (line 15961) | performUpdate(i) {
  method factoryReset (line 15970) | factoryReset(i) {
  method wifiScan (line 15979) | wifiScan(i) {
  method configureWifi (line 15988) | configureWifi(i) {
  method checkForUpdate (line 15997) | checkForUpdate(i) {
  method clearUpdate (line 16006) | clearUpdate(i) {
  method deviceCert (line 16015) | deviceCert(i) {
  method configureWifiWithEncryptedPassword (line 16024) | configureWifiWithEncryptedPassword(i) {
  method getNetworkingStatus (line 16037) | getNetworkingStatus(i) {
  method getCellularInfo (line 16047) | getCellularInfo(i) {
  method configureEthernet (line 16056) | configureEthernet(i) {
  method forgetWifiNetwork (line 16065) | forgetWifiNetwork(i) {
  method checkInternet (line 16074) | checkInternet(i) {
  method checkForUpdateUrgency (line 16083) | checkForUpdateUrgency(i) {
  method negotiateUpdateWithLocallyAvailablePackages (line 16093) | negotiateUpdateWithLocallyAvailablePackages(i) {
  method prepareRegistrationPayload (line 16109) | prepareRegistrationPayload(i) {
  method addDevice (line 16129) | addDevice(i) {
  method removeDevice (line 16138) | removeDevice(i) {
  method getConfig (line 16147) | getConfig(i) {
  class m (line 16232) | class m {
    method constructor (line 16233) | constructor(e, t) {
    method rpc (line 16236) | rpc(e, t, i) {
    method error (line 16267) | error(e, t, i, n, r) {
  class p (line 16273) | class p {
    method constructor (line 16274) | constructor(e) {
    method request (line 16277) | request(e, t) {
  function g (line 16306) | function g(e, t) {
  class _ (line 16372) | class _ extends Error {
    method constructor (line 5564) | constructor(e, t, ...i) {
    method alerts (line 5568) | alerts() {
    method constructor (line 13106) | constructor() {
    method componentDidCatch (line 13109) | componentDidCatch(e, t) {
    method render (line 13113) | render() {
    method constructor (line 16373) | constructor(e, t, i) {
  function l (line 16377) | function l(e, t) {
    method constructor (line 4276) | constructor(e) {
    method render (line 4279) | render() {
    method _onClick (line 4287) | _onClick(e) {
    method _getIndicator (line 4290) | _getIndicator(e) {
  method encode (line 16440) | encode(e, t = o.Writer.create()) {
  method decode (line 16451) | decode(e, t) {
  method encode (line 16488) | encode(e, t = r.Writer.create()) {
  method decode (line 16538) | decode(e, t) {
  method encode (line 16677) | encode(e, t = r.Writer.create()) {
  method decode (line 16689) | decode(e, t) {
  method decode (line 16753) | decode(e, t) {
  method decode (line 16766) | decode(e, t) {
  method decode (line 16788) | decode(e, t) {
  method decode (line 16813) | decode(e, t) {
  method decode (line 16832) | decode(e, t) {
  method decode (line 16845) | decode(e, t) {
  method decode (line 16858) | decode(e, t) {
  method decode (line 16871) | decode(e, t) {
  class n (line 16892) | class n extends Error {
    method constructor (line 1640) | constructor(e, t) {
    method constructor (line 16893) | constructor(e, t) {
  function R (line 17368) | function R(e, t, i) {
  class A (line 17377) | class A extends c.Component {
    method constructor (line 17378) | constructor(...e) {
    method render (line 17381) | render() {
    method _navigateToSecurity (line 17409) | _navigateToSecurity() {
    method _handleClick (line 17413) | _handleClick(e) {
  function N (line 17420) | function N(e, t) {
  function k (line 17432) | function k(e, t, i) {
  class P (line 17435) | class P extends c.Component {
    method constructor (line 17436) | constructor(e) {
    method componentDidMount (line 17439) | componentDidMount() {
    method componentWillUnmount (line 17462) | componentWillUnmount() {
    method render (line 17465) | render() {
    method _getModalClassName (line 17499) | _getModalClassName(e, t, i, n, r, a, o) {
    method _getModalBanner (line 17503) | _getModalBanner(e) {
    method _getModalHeader (line 17506) | _getModalHeader(e, t, i, n, r) {
    method _getCancel (line 17513) | _getCancel(e) {
    method _getModalContent (line 17522) | _getModalContent(e) {
    method _getModalFooter (line 17525) | _getModalFooter(e) {
    method _handleHidden (line 17528) | _handleHidden() {
  function D (line 17532) | function D() {
  class L (line 17565) | class L extends c.Component {
    method render (line 17566) | render() {
  function Z (line 17608) | function Z() {
  function re (line 17628) | function re(e, t, i) {
  class ae (line 17631) | class ae extends c.Component {
    method render (line 17632) | render() {
    method _showSolarRGMProblemModal (line 17674) | _showSolarRGMProblemModal(e) {
    method _getClassName (line 17690) | _getClassName(e, t) {
    method _getProgressIndication (line 17694) | _getProgressIndication(e, t, i) {
  function le (line 17721) | function le() {
  class ce (line 17732) | class ce extends c.Component {
    method constructor (line 17733) | constructor(e) {
    method render (line 17736) | render() {
    method _handleDetailedClick (line 17742) | _handleDetailedClick(e) {
  function me (line 17808) | function me(e, t, i) {
  class pe (line 17811) | class pe extends c.Component {
    method _renderDefaultView (line 17812) | _renderDefaultView() {
    method render (line 17821) | render() {
  class we (line 17832) | class we extends c.Component {
    method constructor (line 17833) | constructor(e) {
    method _getCloseHandler (line 17836) | _getCloseHandler(e, t) {
    method render (line 17845) | render() {
  method destroyBanner (line 17869) | destroyBanner(t) {
  function he (line 17876) | function he() {
  function Ee (line 17887) | function Ee(e, t) {
  function be (line 17899) | function be(e) {
  function ye (line 17914) | function ye(e, t, i) {
  class Re (line 17918) | class Re extends c.Component {
    method constructor (line 17919) | constructor(e) {
    method render (line 17922) | render() {
    method componentDidMount (line 17940) | componentDidMount() {
    method _getClassName (line 17943) | _getClassName(e) {
    method _getLink (line 17946) | _getLink(e, t) {
    method _getLinkClassName (line 17985) | _getLinkClassName(e, t) {
    method _getText (line 17989) | _getText(e) {
    method _handleClick (line 17992) | _handleClick(e) {
  class Te (line 17999) | class Te extends c.Component {
    method render (line 18000) | render() {
  class Ne (line 18016) | class Ne extends c.Component {
    method constructor (line 18017) | constructor(e) {
    method _renderHeader (line 18020) | _renderHeader() {
    method render (line 18041) | render() {
    method _navigateToLink (line 18062) | _navigateToLink() {
    method _handleStart (line 18065) | _handleStart(e, t) {
    method _handleStop (line 18068) | _handleStop(e, t) {
    method _handleDrag (line 18079) | _handleDrag(e, t) {
  function ke (line 18087) | function ke() {
  class Pe (line 18098) | class Pe extends c.Component {
    method _createCloseHandler (line 18099) | _createCloseHandler(e) {
    method render (line 18104) | render() {
  class De (line 18119) | class De extends c.Component {
    method render (line 18120) | render() {
  class Me (line 18140) | class Me extends c.Component {
    method componentDidUpdate (line 18141) | componentDidUpdate(e) {
    method render (line 18147) | render() {
  function xe (line 18176) | function xe(e, t) {
  function Be (line 18188) | function Be(e) {
  function He (line 18203) | function He(e, t, i) {
  class Ye (line 18226) | class Ye extends c.Component {
    method constructor (line 18227) | constructor(e) {
    method componentWillMount (line 18230) | componentWillMount() {
    method componentDidMount (line 18233) | componentDidMount() {
    method componentDidUpdate (line 18243) | componentDidUpdate(e, t) {
    method componentWillUnmount (line 18253) | componentWillUnmount() {
    method render (line 18257) | render() {
    method componentWillReceiveProps (line 18270) | componentWillReceiveProps(e) {
    method _checkAuthentication (line 18281) | _checkAuthentication(e, t) {
    method _startToggleAuth (line 18340) | async _startToggleAuth() {
    method _checkFirmwareUpdate (line 18345) | _checkFirmwareUpdate(e) {
    method _checkSitemasterStatus (line 18355) | _checkSitemasterStatus(e) {
    method _replaceRoute (line 18361) | _replaceRoute(e) {
    method _getClassName (line 18364) | _getClassName(e) {
    method _showFirmwareUpdateBanner (line 18368) | _showFirmwareUpdateBanner() {
    method _showEngineeringBanner (line 18371) | _showEngineeringBanner() {
    method _showSitemasterRunningInPowerSupplyModeBanner (line 18377) | _showSitemasterRunningInPowerSupplyModeBanner() {
    method _showSitemasterRunningBanner (line 18385) | _showSitemasterRunningBanner() {
    method _handleLogin (line 18388) | async _handleLogin(e, t, i) {
  function tt (line 18512) | function tt() {
  function it (line 18523) | function it(e, t) {
  function nt (line 18535) | function nt(e) {
  function rt (line 18550) | function rt(e, t, i) {
  class at (line 18553) | class at extends c.Component {
    method render (line 18554) | render() {
    method _getIconImage (line 18573) | _getIconImage(e, t) {
    method _getIconLabel (line 18588) | _getIconLabel(e, t) {
    method _getIconContainerStyle (line 18592) | _getIconContainerStyle() {
  class ot (line 18612) | class ot extends c.Component {
    method render (line 18613) | render() {
  function gt (line 18640) | function gt() {
  function wt (line 18651) | function wt(e, t) {
  function vt (line 18663) | function vt(e) {
  function ft (line 18678) | function ft(e, t, i) {
  class bt (line 18683) | class bt extends c.Component {
    method getActiveIcons (line 18684) | static getActiveIcons(e) {
    method getDisplayPowers (line 18702) | static getDisplayPowers(e, t, i, n, r, a, o, s, _, l) {
    method getDisplayValue (line 18719) | static getDisplayValue(e, t, i, n = !1, r = !1) {
    method constructor (line 18724) | constructor(e) {
    method componentWillMount (line 18730) | componentWillMount() {
    method componentWillReceiveProps (line 18733) | componentWillReceiveProps(e) {
    method render (line 18736) | render() {
    method _getPowerFlowGridClassName (line 19021) | _getPowerFlowGridClassName(e, t, i, n) {
    method _getActiveGlowIcons (line 19025) | _getActiveGlowIcons(e, t, i, n, r, a, o, s, _, l) {
    method _getPowerLabels (line 19064) | _getPowerLabels(e, t, n, r, a, o, s, _, l, d, u, m, p, g, w, v, f, h, ...
    method _getPowerwall (line 19133) | _getPowerwall(e, t, n, r, a, o, s, _) {
    method _getIslanded (line 19168) | _getIslanded(e, t, i, n, r, a, o, s, _) {
    method _getSitemasterControl (line 19181) | _getSitemasterControl() {
    method _handleSitemanagerStartStopClick (line 19243) | _handleSitemanagerStartStopClick(e) {
    method _handleIslandingClick (line 19246) | _handleIslandingClick(e) {
  function yt (line 19344) | function yt(e, t) {
  function St (line 19356) | function St(e) {
  function Rt (line 19371) | function Rt(e, t, i) {
  function Tt (line 19374) | function Tt(e) {}
  function At (line 19375) | function At() {
  function Bt (line 19398) | function Bt(e) {
  function Ht (line 19525) | function Ht() {
  function Kt (line 19533) | function Kt({ dismiss: e }) {
  function Yt (line 19546) | function Yt(e) {
  function Qt (line 19568) | function Qt(e) {
  function Zt (line 19586) | function Zt() {
  function Jt (line 19601) | function Jt(e) {
  function Xt (line 19622) | function Xt(e) {
  function $t (line 19655) | function $t() {
  function ei (line 19670) | function ei() {
  function ti (line 19682) | function ti() {
  function ii (line 19690) | function ii() {
  function ni (line 19702) | function ni() {
  function ri (line 19714) | function ri({ runButton: e }) {
  function ai (line 19717) | function ai({ runButton: e }) {
  function oi (line 19720) | function oi({ runButton: e }) {
  function si (line 19723) | function si({ runButton: e }) {
  function _i (line 19731) | function _i({ leader: e }) {
  function pi (line 19745) | function pi() {
  function gi (line 19756) | function gi(e, t) {
  function wi (line 19768) | function wi(e, t, i) {
  function hi (line 19784) | function hi() {
  class bi (line 19814) | class bi extends c.Component {
    method _isInstaller (line 19815) | _isInstaller() {
    method _isAuthenticated (line 19819) | _isAuthenticated() {
    method render (line 19823) | render() {
    method _renderSystemMenuItem (line 19826) | _renderSystemMenuItem() {
    method _getMenuItemLinkProps (line 19843) | _getMenuItemLinkProps(e, t = {}, i = {}) {
    method _getSubtitle (line 19860) | _getSubtitle(e) {
    method _renderKioskMenuItems (line 19877) | _renderKioskMenuItems() {
    method _renderCustomerMenuItems (line 19895) | _renderCustomerMenuItems() {
    method _renderInstallerMenuItems (line 19911) | _renderInstallerMenuItems() {
    method _getInverterSelfTest (line 19936) | _getInverterSelfTest(e, t) {
    method _getAlerts (line 19944) | _getAlerts(e, t, i) {
    method _getRegistration (line 19953) | _getRegistration(e, t) {
    method _getRegistrationConfiguration (line 19962) | _getRegistrationConfiguration(e) {
  function yi (line 19985) | function yi(e, t, i) {
  class Ai (line 19998) | class Ai extends c.Component {
    method constructor (line 19999) | constructor(...e) {
    method render (line 20002) | render() {
    method _getSiteName (line 20075) | _getSiteName(e) {
    method _getActiveMeterTypes (line 20080) | _getActiveMeterTypes(e) {
    method _handleInactiveLabelClick (line 20093) | _handleInactiveLabelClick(e, t = !1) {
  function Ci (line 20100) | function Ci(e) {
  function Ni (line 20141) | function Ni() {
  function ki (line 20152) | function ki(e, t) {
  function Pi (line 20164) | function Pi(e) {
  function Di (line 20179) | function Di(e, t, i) {
  class Mi (line 20188) | class Mi extends c.Component {
    method constructor (line 20189) | constructor(...e) {
    method render (line 20192) | render() {
    method _getKioskLinkView (line 20250) | _getKioskLinkView(e, t) {
    method _handleClick (line 20267) | _handleClick(e) {
    method _handleLogin (line 20270) | _handleLogin(e) {
    method _handleLogout (line 20273) | _handleLogout(e) {
  class an (line 20360) | class an extends c.Component {
    method constructor (line 20361) | constructor(...e) {
    method render (line 20367) | render() {
  function wn (line 20428) | function wn(e, t) {
  function vn (line 20440) | function vn(e) {
  function fn (line 20455) | function fn() {
  function hn (line 20466) | function hn(e, t, i) {
  class bn (line 20483) | class bn extends c.Component {
    method constructor (line 20484) | constructor(...e) {
    method startQuerying (line 20508) | startQuerying() {
    method stopQuerying (line 20531) | stopQuerying() {
    method isQuerying (line 20534) | isQuerying() {
    method componentWillMount (line 20537) | componentWillMount() {
    method componentDidMount (line 20540) | componentDidMount() {
    method componentDidUpdate (line 20543) | componentDidUpdate(e) {
    method componentWillReceiveProps (line 20548) | componentWillReceiveProps(e) {
    method render (line 20559) | render() {
    method componentWillUnmount (line 20582) | componentWillUnmount() {
    method _startToggleAuth (line 20585) | async _startToggleAuth() {
    method _getNextRoute (line 20590) | _getNextRoute(e = !1) {
    method _handleReset (line 20593) | _handleReset() {
    method _handleRunWizard (line 20596) | _handleRunWizard(e) {
    method _showLoginModal (line 20635) | _showLoginModal() {
    method _showInactiveMeterModal (line 20668) | _showInactiveMeterModal(e, t, i) {
    method _showNegativeMeterModal (line 20694) | _showNegativeMeterModal(e) {
    method _handleChangeUsername (line 20742) | _handleChangeUsername(e) {
    method _handleLogin (line 20745) | async _handleLogin(e, t, i) {
    method _handleLogout (line 20757) | _handleLogout() {
    method _showError (line 20760) | _showError(e) {
    method _updateModalFooter (line 20780) | _updateModalFooter(e) {
    method _handleStartStopSitemanager (line 20798) | _handleStartStopSitemanager() {
    method _handleDownloadLogs (line 20830) | _handleDownloadLogs() {
    method _handleTriggerDownloadLogs (line 20888) | _handleTriggerDownloadLogs() {
    method _handleStartOrStopSitemaster (line 20892) | _handleStartOrStopSitemaster() {
    method _handleGoOffGrid (line 20900) | _handleGoOffGrid() {
    method _handleReconnectToGrid (line 20903) | _handleReconnectToGrid() {
  function yn (line 20907) | function yn() {
  function Sn (line 20915) | function Sn() {
  method getComponent (line 21104) | getComponent(t, n) {
  method getComponent (line 21118) | getComponent(t, n) {
  method getComponent (line 21132) | getComponent(t, n) {
  method getComponent (line 21146) | getComponent(t, n) {
  method getComponent (line 21170) | getComponent(t, n) {
  method getComponent (line 21190) | getComponent(t, n) {
  method getComponent (line 21223) | getComponent(t, n) {
  method getComponent (line 21237) | getComponent(t, n) {
  method getComponent (line 21258) | getComponent(t, n) {
  method getComponent (line 21281) | getComponent(t, n) {
  method getComponent (line 21302) | getComponent(t, n) {
  method getComponent (line 21321) | getComponent(t, n) {
  method getComponent (line 21350) | getComponent(t, n) {
  method getComponent (line 21364) | getComponent(t, n) {
  method getComponent (line 21385) | getComponent(t, n) {
  method getComponent (line 21410) | getComponent(t, n) {
  method getComponent (line 21431) | getComponent(t, n) {
  method getComponent (line 21445) | getComponent(t, n) {
  method getComponent (line 21483) | getComponent(t, n) {
  method getComponent (line 21512) | getComponent(t, n) {
  method getComponent (line 21526) | getComponent(t, n) {
  method getComponent (line 21545) | getComponent(t, n) {
  method getComponent (line 21566) | getComponent(t, n) {
  method getComponent (line 21580) | getComponent(t, n) {
  method getComponent (line 21599) | getComponent(t, n) {
  method getComponent (line 21620) | getComponent(t, n) {
  method getComponent (line 21634) | getComponent(t, n) {
  method getComponent (line 21653) | getComponent(t, n) {
  method getComponent (line 21676) | getComponent(t, n) {
  method getComponent (line 21690) | getComponent(t, n) {
  method getIndexRoute (line 21710) | getIndexRoute(t, n) {
  method getChildRoutes (line 21739) | getChildRoutes(t, n) {
  function h (line 21891) | function h(e, t, i) {
  class E (line 21894) | class E {
    method GlobalInstance (line 21895) | static GlobalInstance() {
    method constructor (line 21898) | constructor(e) {
    method purge (line 21901) | purge(e) {
    method rehydrate (line 21904) | rehydrate(e, t) {
  function Z (line 21938) | function Z(e, t) {
  function J (line 21950) | function J(e) {
  function X (line 21965) | function X(e, t, i) {

FILE: proxy/web/viz-static/black.js
  function injectScriptAndUse (line 12) | function injectScriptAndUse() {
  function triggerOnMutation (line 29) | function triggerOnMutation(cb) {
  function formatPowerwallForBlack (line 53) | function formatPowerwallForBlack() {

FILE: proxy/web/viz-static/clear.js
  function injectScriptAndUse (line 12) | function injectScriptAndUse() {
  function triggerOnMutation (line 29) | function triggerOnMutation(cb) {
  function formatPowerwallForClear (line 53) | function formatPowerwallForClear() {

FILE: proxy/web/viz-static/dakboard.js
  function injectScriptAndUse (line 12) | function injectScriptAndUse() {
  function triggerOnMutation (line 29) | function triggerOnMutation(cb) {
  function formatPowerwallForDakboard (line 53) | function formatPowerwallForDakboard() {

FILE: proxy/web/viz-static/grafana-dark.js
  function injectScriptAndUse (line 13) | function injectScriptAndUse() {
  function triggerOnMutation (line 30) | function triggerOnMutation(cb) {
  function formatPowerwallForGrafana (line 54) | function formatPowerwallForGrafana() {

FILE: proxy/web/viz-static/grafana.js
  function injectScriptAndUse (line 12) | function injectScriptAndUse() {
  function triggerOnMutation (line 29) | function triggerOnMutation(cb) {
  function formatPowerwallForGrafana (line 53) | function formatPowerwallForGrafana() {

FILE: proxy/web/viz-static/solar.js
  function injectScriptAndUse (line 12) | function injectScriptAndUse() {
  function triggerOnMutation (line 29) | function triggerOnMutation(cb) {
  function formatPowerwallForSolar (line 53) | function formatPowerwallForSolar() {

FILE: proxy/web/viz-static/vendor.js
  function y (line 30) | function y(e) {
  function g (line 120) | function g() {
  function _ (line 127) | function _(e) {
  function e (line 141) | function e(e) {
  function t (line 144) | function t(t) {
  function e (line 204) | function e(e, t) {
  function Z (line 292) | function Z(e) {
  function ee (line 297) | function ee(e, t) {
  function te (line 303) | function te() {
  function ne (line 308) | function ne(e, t) {
  function re (line 317) | function re(e, t, n) {
  function oe (line 329) | function oe(e, t) {
  function ae (line 332) | function ae(e) {
  function ie (line 335) | function ie(e) {
  function se (line 338) | function se(e) {
  function ue (line 381) | function ue(e) {
  function ce (line 384) | function ce(e) {
  function le (line 387) | function le(e) {
  function ye (line 404) | function ye(e) {
  function ve (line 417) | function ve(e, t, n, r) {
  function be (line 422) | function be(e, t) {
  function t (line 553) | function t(e) {
  function t (line 651) | function t(e, n) {
  function t (line 685) | function t(e, n) {
  function t (line 719) | function t(e, n) {
  function t (line 823) | function t(e, n) {
  function t (line 857) | function t(e, n) {
  function t (line 896) | function t(e, n) {
  function t (line 976) | function t(e, n) {
  function o (line 1030) | function o() {
  function a (line 1033) | function a(e) {
  function i (line 1036) | function i(e) {
  function s (line 1039) | function s(e) {
  function u (line 1042) | function u(e) {
  function c (line 1045) | function c(e) {
  function l (line 1048) | function l(e, t) {
  function d (line 1054) | function d(e, t) {
  function f (line 1057) | function f(e, t) {
  function p (line 1061) | function p(e, t, n, r) {
  function h (line 1064) | function h(e) {
  function m (line 1086) | function m(e) {
  function M (line 1108) | function M(e) {
  function v (line 1119) | function v(e, t) {
  function g (line 1138) | function g(e) {
  function _ (line 1141) | function _(e) {
  function A (line 1144) | function A(e) {
  function L (line 1147) | function L(e) {
  function w (line 1152) | function w(e, t, n) {
  function T (line 1160) | function T(e) {
  function k (line 1163) | function k(e, t) {
  function z (line 1181) | function z(e, t) {
  function E (line 1184) | function E(e) {
  function x (line 1187) | function x(e, t) {
  function D (line 1194) | function D(e) {
  function j (line 1208) | function j(e, t) {
  function C (line 1212) | function C(e) {
  function P (line 1215) | function P(e) {
  function W (line 1223) | function W(e, t) {
  function q (line 1226) | function q(e, t, n) {
  function I (line 1235) | function I(e, t, n, r) {
  function X (line 1251) | function X(e, t) {
  function K (line 1272) | function K(e, t) {
  function le (line 1297) | function le(e, t, n) {
  function de (line 1304) | function de(e, t) {
  function fe (line 1315) | function fe(e) {
  function he (line 1319) | function he(e, t) {
  function me (line 1334) | function me(e, t) {
  function Me (line 1339) | function Me(e, t, n) {
  function ye (line 1342) | function ye(e) {
  function ve (line 1345) | function ve(e) {
  function _e (line 1380) | function _e(e, t) {
  function Ae (line 1385) | function Ae(e, t) {
  function Le (line 1388) | function Le(e, t, n) {
  function we (line 1393) | function we(e, t) {
  function Se (line 1435) | function Se(e, t, n) {
  function ze (line 1459) | function ze(e, t) {
  function Ee (line 1467) | function Ee(e) {
  function Ne (line 1472) | function Ne() {
  function je (line 1489) | function je(e, t, n, r, o, a, i) {
  function Ce (line 1493) | function Ce(e) {
  function Pe (line 1501) | function Pe(e, t, n) {
  function Ye (line 1505) | function Ye(e, t, n, r, o) {
  function We (line 1511) | function We(e, t, n) {
  function qe (line 1518) | function qe(e, t, n) {
  function Be (line 1523) | function Be(e, t) {
  function Ie (line 1579) | function Ie(e, t, n) {
  function Je (line 1617) | function Je() {
  function Ve (line 1639) | function Ve() {
  function Ge (line 1642) | function Ge(e, t) {
  function $e (line 1647) | function $e(e, t) {
  function rt (line 1746) | function rt(e) {
  function ot (line 1749) | function ot(t) {
  function at (line 1757) | function at(e, t) {
  function it (line 1761) | function it(e, t) {
  function st (line 1789) | function st(e) {
  function ut (line 1808) | function ut(e) {
  function ct (line 1835) | function ct(e, t, n) {
  function lt (line 1838) | function lt(e) {
  function yt (line 1908) | function yt(e) {
  function bt (line 1941) | function bt(e) {
  function _t (line 1946) | function _t(e) {
  function At (line 1982) | function At(e) {
  function Lt (line 2012) | function Lt(e) {
  function wt (line 2073) | function wt(e, t, n, r, o) {
  function Tt (line 2097) | function Tt(e, t, n, r) {
  function St (line 2116) | function St(e, t) {
  function Et (line 2123) | function Et(e) {
  function xt (line 2150) | function xt(e) {
  function Dt (line 2153) | function Dt(e) {
  function Nt (line 2156) | function Nt(e, t) {
  function Ct (line 2171) | function Ct(e, t) {
  function Pt (line 2178) | function Pt(e, t) {
  function Yt (line 2182) | function Yt(e) {
  function Wt (line 2185) | function Wt() {
  function Rt (line 2191) | function Rt(e, t) {
  function Ft (line 2223) | function Ft(e, t) {
  function Ht (line 2227) | function Ht(e, t) {
  function It (line 2231) | function It(e, t) {
  function Xt (line 2246) | function Xt(e, t, n, r) {
  function Jt (line 2258) | function Jt(e, t) {
  function Vt (line 2263) | function Vt(e) {
  function $t (line 2271) | function $t() {
  function Qt (line 2274) | function Qt(e, t) {
  function Zt (line 2277) | function Zt(e, t, n) {
  function en (line 2280) | function en(e, t, n) {
  function tn (line 2283) | function tn(e, t) {
  function nn (line 2286) | function nn(e, t, n, r, o) {
  function rn (line 2290) | function rn(e, t, n, r, o) {
  function cn (line 2397) | function cn(e, t) {
  function fn (line 2404) | function fn(e) {
  function hn (line 2788) | function hn(e, t, n, r) {
  function mn (line 2793) | function mn(e, t, n) {
  function Mn (line 2800) | function Mn(e, t, n, r) {
  function vn (line 2948) | function vn(e, t, n, r) {
  function bn (line 2952) | function bn(e) {
  function gn (line 2955) | function gn(e) {
  function _n (line 2958) | function _n(e) {
  function An (line 2961) | function An(e) {
  function Dn (line 2975) | function Dn(e) {
  function Fn (line 2989) | function Fn(e, t, n, r, o) {
  function In (line 2993) | function In(e) {
  function Xn (line 2996) | function Xn() {
  function d (line 3296) | function d(e) {
  function p (line 3300) | function p(e) {
  function h (line 3326) | function h(e, t) {
  function m (line 3349) | function m(e) {
  function M (line 3352) | function M(e, t) {
  function v (line 3409) | function v(e, t, n) {
  function b (line 3425) | function b(e, t, n) {
  function _ (line 3460) | function _() {
  function L (line 3539) | function L(e, t) {
  function w (line 3568) | function w(e, t, n, r, o) {
  function T (line 3595) | function T(e) {
  function S (line 3628) | function S(e) {
  function z (line 3631) | function z(e) {
  function E (line 3634) | function E(e) {
  function x (line 3645) | function x(e, t) {
  function D (line 3658) | function D(e) {
  function j (line 3670) | function j(e, t, n, r, o) {
  function C (line 3688) | function C(e, t) {
  function P (line 3696) | function P(e, t, n, r, o, a) {
  function Y (line 3776) | function Y(e, t, n, r) {
  function q (line 3799) | function q(e) {
  function B (line 3803) | function B(e, t) {
  function R (line 3907) | function R(e, t, n) {
  function J (line 3925) | function J(e) {
  function V (line 3928) | function V(e) {
  function se (line 4072) | function se(e, t, n) {
  function ue (line 4075) | function ue(e, t) {
  function me (line 4174) | function me(e, t) {
  function Ae (line 4252) | function Ae(e, t) {
  function Ce (line 4364) | function Ce(e) {
  function We (line 4402) | function We(e) {
  function Ie (line 4445) | function Ie(e) {
  function r (line 4512) | function r(e, t) {
  function i (line 4586) | function i(e) {
  function it (line 4770) | function it(e, t) {
  function st (line 4773) | function st(e, t) {
  function ut (line 4776) | function ut(e, t, n) {
  function ct (line 4789) | function ct(e, t, n, r) {
  function lt (line 4796) | function lt(e, t) {
  function dt (line 4800) | function dt(e, t) {
  function ft (line 4804) | function ft(e, t) {
  function pt (line 4808) | function pt(e, t) {
  function ht (line 4815) | function ht(e, t) {
  function mt (line 4818) | function mt(e, t, n) {
  function Mt (line 4822) | function Mt(e, t) {
  function yt (line 4826) | function yt(e, t) {
  function vt (line 4830) | function vt(e, t, n, r) {
  function bt (line 4836) | function bt(e, t, n, r) {
  function gt (line 4841) | function gt(e, t) {
  function At (line 4846) | function At(e, t, n) {
  function Lt (line 4855) | function Lt(e, t, n, r) {
  function wt (line 4859) | function wt(e, t, n) {
  function Tt (line 4869) | function Tt(e, t, n, r) {
  function kt (line 4873) | function kt(e) {
  function Ot (line 4876) | function Ot(e, t) {
  function St (line 4880) | function St(e) {
  function zt (line 4885) | function zt(e) {
  function Et (line 4890) | function Et(e, t, n, r, o) {
  function xt (line 4898) | function xt(e, t) {
  function Dt (line 4905) | function Dt(e, t) {
  function Nt (line 4909) | function Nt(e) {
  function jt (line 4914) | function jt(e, t) {
  function Ct (line 4919) | function Ct(e, t) {
  function Pt (line 4922) | function Pt(e, t) {
  function Yt (line 4926) | function Yt(e, t) {
  function Wt (line 4930) | function Wt(e, t) {
  function Rt (line 5127) | function Rt(e) {
  function Ft (line 5130) | function Ft(e) {
  function Ht (line 5133) | function Ht(e) {
  function It (line 5143) | function It(e, t) {
  function Xt (line 5148) | function Xt(e, t) {
  function Kt (line 5155) | function Kt(e) {
  function Ut (line 5165) | function Ut(e) {
  function Jt (line 5175) | function Jt(e) {
  function Vt (line 5184) | function Vt(e) {
  function xn (line 5273) | function xn(e) {
  function e (line 5281) | function e() {}
  function Nn (line 5290) | function Nn() {}
  function jn (line 5291) | function jn(e, t) {
  function Cn (line 5294) | function Cn(e) {
  function Pn (line 5297) | function Pn(e) {
  function Yn (line 5305) | function Yn(e) {
  function Wn (line 5313) | function Wn(e) {
  function qn (line 5321) | function qn(e) {
  function Bn (line 5326) | function Bn(e) {
  function Rn (line 5330) | function Rn(e, t) {
  function Fn (line 5341) | function Fn(e) {
  function Hn (line 5345) | function Hn(e, t) {
  function In (line 5348) | function In(e) {
  function Xn (line 5351) | function Xn(e, t, n) {
  function Kn (line 5354) | function Kn(e, t, n) {
  function Un (line 5358) | function Un(e, t) {
  function Jn (line 5362) | function Jn(e, t, n, r) {
  function Vn (line 5370) | function Vn(e, t) {
  function Gn (line 5373) | function Gn(e, t, n) {
  function $n (line 5376) | function $n(e, t) {
  function Qn (line 5380) | function Qn(e, t, n) {
  function Zn (line 5383) | function Zn(e, t, n, r, o, a) {
  function er (line 5480) | function er(e, t, n) {
  function tr (line 5491) | function tr(e, t, n) {
  function nr (line 5497) | function nr(e, t, n, r) {
  function ar (line 5616) | function ar(e, t) {
  function ir (line 5625) | function ir(e, t, n) {
  function sr (line 5635) | function sr(e, t) {
  function ur (line 5644) | function ur(e, t, n, r, o) {
  function dr (line 5655) | function dr(e, t) {
  function fr (line 5658) | function fr(e, t) {
  function pr (line 5661) | function pr(e, t) {
  function hr (line 5666) | function hr(e, t) {
  function mr (line 5670) | function mr(e, t, n) {
  function Mr (line 5674) | function Mr(e) {
  function yr (line 5695) | function yr(e, t) {
  function vr (line 5698) | function vr(e, t) {
  function br (line 5701) | function br(e, t) {
  function gr (line 5704) | function gr(e, t, n) {
  function _r (line 5725) | function _r(e, t, n) {
  function Ar (line 5729) | function Ar(e) {
  function Lr (line 5732) | function Lr(e, t, n, r, o) {
  function wr (line 5836) | function wr(e, t, n, r) {
  function Tr (line 5859) | function Tr(e) {
  function kr (line 5863) | function kr(e) {
  function Or (line 5866) | function Or(e) {
  function Sr (line 5872) | function Sr(e) {
  function zr (line 5884) | function zr(e, t) {
  function Er (line 5887) | function Er(e, t) {
  function xr (line 5897) | function xr(e) {
  function Dr (line 5905) | function Dr(e, t) {
  function Nr (line 5913) | function Nr(e, t, n, r, o) {
  function jr (line 5957) | function jr(e, t) {
  function Cr (line 5961) | function Cr(e, t, n) {
  function Pr (line 6000) | function Pr(e, t, n) {
  function Yr (line 6008) | function Yr(e, t, n, r) {
  function Wr (line 6016) | function Wr(e, t) {
  function qr (line 6026) | function qr(e, t) {
  function Br (line 6029) | function Br(e, t) {
  function Rr (line 6037) | function Rr(e, t) {
  function Fr (line 6040) | function Fr(e) {
  function Hr (line 6043) | function Hr(e, t) {
  function Ir (line 6047) | function Ir(e, t, n, r) {
  function Ur (line 6070) | function Ur(e) {
  function Jr (line 6073) | function Jr(e, t, n) {
  function Vr (line 6080) | function Vr(e, t) {
  function Gr (line 6089) | function Gr(e, t, n) {
  function $r (line 6102) | function $r(e, t, n, r) {
  function Qr (line 6117) | function Qr(e, t) {
  function Zr (line 6128) | function Zr(e) {
  function eo (line 6131) | function eo(e) {
  function to (line 6138) | function to(e, t, n) {
  function no (line 6161) | function no(e, t) {
  function ro (line 6164) | function ro(e, t, n, r) {
  function oo (line 6167) | function oo(e, t, n, r) {
  function ao (line 6171) | function ao(e, t) {
  function io (line 6184) | function io(e, t, n) {
  function so (line 6190) | function so(e, t, n) {
  function uo (line 6197) | function uo(e) {
  function co (line 6200) | function co(e) {
  function lo (line 6203) | function lo(e, t) {
  function po (line 6207) | function po(e, t, n) {
  function mo (line 6216) | function mo(e, t) {
  function Mo (line 6222) | function Mo(e) {
  function yo (line 6226) | function yo(e, t) {
  function vo (line 6230) | function vo(e, t) {
  function bo (line 6245) | function bo(e, t, n, o) {
  function go (line 6251) | function go(e, t, n, o) {
  function _o (line 6257) | function _o(e, t) {
  function Ao (line 6263) | function Ao(e, t, n, r) {
  function Lo (line 6273) | function Lo(e, t) {
  function wo (line 6280) | function wo(e) {
  function To (line 6293) | function To(e, t) {
  function ko (line 6301) | function ko(e) {
  function Oo (line 6310) | function Oo(e) {
  function So (line 6318) | function So(e) {
  function zo (line 6323) | function zo(e) {
  function Eo (line 6349) | function Eo(e) {
  function xo (line 6363) | function xo(e) {
  function Do (line 6387) | function Do(e, t, n, o, a, i, s, u, c, l) {
  function No (line 6408) | function No(e, t) {
  function jo (line 6420) | function jo(e, t) {
  function Co (line 6431) | function Co(e) {
  function Po (line 6444) | function Po(e, t) {
  function Yo (line 6450) | function Yo(e) {
  function Wo (line 6463) | function Wo(e) {
  function qo (line 6468) | function qo(e, t, n, r, o, a, i, s, u, c) {
  function Bo (line 6475) | function Bo(e) {
  function Fo (line 6491) | function Fo(e) {
  function Ho (line 6505) | function Ho(e, t, n, o, s, u, c, l) {
  function Io (line 6579) | function Io(e, t, n, r) {
  function Xo (line 6582) | function Xo(e, t, n, r, o, a) {
  function Ko (line 6585) | function Ko(e) {
  function Uo (line 6588) | function Uo(e, t, n, r, o, a) {
  function Jo (line 6623) | function Jo(e) {
  function Vo (line 6626) | function Vo(e) {
  function Go (line 6629) | function Go(e) {
  function Qo (line 6637) | function Qo(e) {
  function Zo (line 6645) | function Zo(e) {
  function ea (line 6648) | function ea() {
  function ta (line 6652) | function ta(e, t) {
  function na (line 6658) | function na(e) {
  function ra (line 6666) | function ra(e, t) {
  function sa (line 6689) | function sa(e, t, n) {
  function ua (line 6697) | function ua(e) {
  function ca (line 6700) | function ca(e) {
  function la (line 6703) | function la(e, t) {
  function da (line 6706) | function da(e, t, n) {
  function fa (line 6711) | function fa(e, t) {
  function pa (line 6716) | function pa(e) {
  function ma (line 6745) | function ma(e) {
  function Ma (line 6749) | function Ma(e) {
  function ya (line 6752) | function ya(e, t) {
  function va (line 6757) | function va(e, t, n) {
  function ba (line 6768) | function ba(e, t) {
  function ga (line 6771) | function ga(e, t) {
  function wa (line 6785) | function wa(e, t, n) {
  function Ta (line 6814) | function Ta(e) {
  function ka (line 6826) | function ka(e, t) {
  function Sa (line 6853) | function Sa(e) {
  function za (line 6858) | function za(e) {
  function Ea (line 6869) | function Ea(e) {
  function ja (line 6885) | function ja(e, t, n) {
  function Ca (line 6891) | function Ca(e, t, n) {
  function Pa (line 6897) | function Pa(e) {
  function Ya (line 6900) | function Ya(e) {
  function Ra (line 6917) | function Ra(e) {
  function Ha (line 6922) | function Ha(e, t) {
  function Xa (line 6938) | function Xa(e) {
  function Va (line 6952) | function Va(e) {
  function Ga (line 6964) | function Ga(e, t) {
  function ri (line 6993) | function ri(e) {
  function oi (line 6997) | function oi(e, t) {
  function ci (line 7019) | function ci(e, t) {
  function li (line 7022) | function li(e, t) {
  function hi (line 7042) | function hi(e, t) {
  function vi (line 7063) | function vi(e, t, n) {
  function bi (line 7066) | function bi(e, t) {
  function Ai (line 7092) | function Ai(e, t, n) {
  function Ti (line 7157) | function Ti(e, t) {
  function ki (line 7169) | function ki(e) {
  function xi (line 7203) | function xi(e, t) {
  function Yi (line 7225) | function Yi(e) {
  function Wi (line 7228) | function Wi(e) {
  function Ri (line 7237) | function Ri(e) {
  function Fi (line 7242) | function Fi(e) {
  function Hi (line 7247) | function Hi(e) {
  function Ii (line 7250) | function Ii(e) {
  function Xi (line 7253) | function Xi(e) {
  function Ki (line 7257) | function Ki(e) {
  function Ji (line 7265) | function Ji(e) {
  function Vi (line 7268) | function Vi(e) {
  function Qi (line 7285) | function Qi(e) {
  function Zi (line 7288) | function Zi(e) {
  function rs (line 7300) | function rs(e) {
  function os (line 7311) | function os(e) {
  function as (line 7314) | function as(e) {
  function is (line 7319) | function is(e) {
  function ss (line 7322) | function ss(e) {
  function us (line 7334) | function us(e) {
  function cs (line 7337) | function cs(e) {
  function ys (line 7360) | function ys(e, t, n) {
  function vs (line 7364) | function vs(e, t) {
  function As (line 7374) | function As(e) {
  function Ls (line 7377) | function Ls(e) {
  function Ss (line 7407) | function Ss(e, t) {
  function xs (line 7421) | function xs(e) {
  function Ns (line 7427) | function Ns(e) {
  function js (line 7430) | function js(e) {
  function Fs (line 7450) | function Fs(e, t, n) {
  function Xs (line 7481) | function Xs(e) {
  function Js (line 7488) | function Js(e) {
  function Vs (line 7491) | function Vs(e) {
  function Qs (line 7504) | function Qs(e, t, n) {
  function Zs (line 7528) | function Zs() {}
  function ru (line 7532) | function ru(e) {
  function iu (line 7543) | function iu() {
  function su (line 7546) | function su() {
  function o (line 8718) | function o() {
  function u (line 8764) | function u(e, t) {
  function c (line 8767) | function c(e, t) {
  function l (line 8771) | function l(e, t) {
  function d (line 8775) | function d() {
  function e (line 8807) | function e(t, n, r) {
  function g (line 8871) | function g(e, t) {
  function _ (line 8874) | function _(e, t) {
  function A (line 8878) | function A(e, t) {
  function L (line 8882) | function L(e, t) {
  function k (line 8889) | function k() {}
  function O (line 8890) | function O(e, t) {
  function S (line 8903) | function S(e) {
  function E (line 9012) | function E(e, t) {
  function x (line 9015) | function x(e, t) {
  function N (line 9026) | function N(e) {
  function j (line 9035) | function j(e) {
  function C (line 9038) | function C(e, t) {
  function q (line 9095) | function q(e, t, n) {
  function R (line 9124) | function R(e, t, n, r) {
  function F (line 9129) | function F(e, t, n, r, o) {
  function H (line 9160) | function H(e, t) {
  function X (line 9183) | function X(e, t) {
  function K (line 9188) | function K(e, t, n) {
  function U (line 9197) | function U(e, t) {
  function e (line 9289) | function e(e, t) {
  function i (line 9327) | function i(e, t, n) {
  function s (line 9405) | function s(e, t) {
  function u (line 9415) | function u(e) {
  function c (line 9463) | function c(e, t) {
  function l (line 9468) | function l(e, t) {
  function d (line 9479) | function d() {
  function p (line 9502) | function p() {
  function g (line 9652) | function g(e) {
  function re (line 9911) | function re(e, t, r, o) {
  function oe (line 9951) | function oe() {
  function ae (line 9957) | function ae(e) {
  function ie (line 9960) | function ie(e) {
  function se (line 9970) | function se(e, t) {
  function ue (line 9973) | function ue(e, t) {
  function ce (line 9980) | function ce(e) {
  function le (line 9985) | function le(e) {
  function de (line 9991) | function de(e) {
  function fe (line 10001) | function fe(e) {
  function pe (line 10440) | function pe() {}
  function he (line 10441) | function he(e) {
  function me (line 10445) | function me(e, t, n) {
  function Me (line 10468) | function Me(e) {
  function ye (line 10476) | function ye(e, t, n, r, o) {
  function ve (line 10480) | function ve(e, t, n, r, o, a) {
  function be (line 10512) | function be(e) {
  function O (line 10701) | function O(e, t, n) {
  function D (line 10784) | function D(e, t) {
  function C (line 10864) | function C() {
  function W (line 11066) | function W() {
  function H (line 11117) | function H(e, t, n) {
  function J (line 11268) | function J(e, t, n, r) {
  function Z (line 11301) | function Z(e, t) {
  function ee (line 11305) | function ee(e, t) {
  function oe (line 11312) | function oe(e, t, n, r, o) {
  function ue (line 11336) | function ue() {
  function ce (line 11339) | function ce() {
  function le (line 11342) | function le() {
  function de (line 11347) | function de(e, t, n, r, o, a) {
  function ye (line 11609) | function ye(e, t) {
  function ve (line 11612) | function ve(e) {
  function be (line 11615) | function be(e) {
  function ge (line 11619) | function ge(e, t) {
  function _e (line 11626) | function _e(e, t, n, r) {
  function Ae (line 11652) | function Ae(e, t, n) {
  function Te (line 11792) | function Te(e, t) {
  function ke (line 11797) | function ke(e) {
  function De (line 11822) | function De(e, t, n) {
  function Ne (line 11838) | function Ne(e, t) {
  function u (line 11853) | function u() {
  function qe (line 11900) | function qe(e) {
  function Be (line 11904) | function Be(e, t, n) {
  function Re (line 11908) | function Re(e, t, n, r, o) {
  function Fe (line 11916) | function Fe(e, t, n) {
  function He (line 11927) | function He(e, t) {
  function Ie (line 11938) | function Ie(e, t, n, r, o) {
  function Ve (line 12114) | function Ve() {
  function Ge (line 12122) | function Ge(e, t) {
  function $e (line 12129) | function $e(e, t, n) {
  function Qe (line 12132) | function Qe(e, t, n) {
  function ot (line 12492) | function ot(e) {
  function gt (line 12755) | function gt(e) {
  function _t (line 12764) | function _t(e, t, n, r) {
  function At (line 12780) | function At(e, t) {
  function w (line 12910) | function w(e, t, i, s) {
  function St (line 13060) | function St(e, t, n, r) {
  function jt (line 13238) | function jt(e) {
  function s (line 13738) | function s(e) {
  function o (line 13790) | function o(e, t, n) {
  function a (line 13794) | function a(e) {
  function e (line 13923) | function e() {
  function v (line 13945) | function v(e) {
  function u (line 14424) | function u(e) {
  function n (line 14503) | function n() {
  function i (line 14645) | function i(e) {
  function e (line 14743) | function e(e, t) {
  function u (line 14952) | function u(e) {
  function u (line 15056) | function u(e) {
  function u (line 15134) | function u(e, t) {
  function r (line 15151) | function r(e) {
  function p (line 15177) | function p(e) {
  function h (line 15188) | function h(e) {
  function m (line 15191) | function m(e, t, n) {
  function M (line 15211) | function M(e, t, n) {
  function y (line 15219) | function y(e) {
  function v (line 15222) | function v(e) {
  function i (line 15328) | function i(e) {
  function a (line 15596) | function a(e) {
  function r (line 15613) | function r(e, t) {
  function o (line 15616) | function o(e, t, n) {
  function a (line 15621) | function a(e) {
  function s (line 15682) | function s(e) {
  function e (line 15970) | function e(e) {
  function t (line 15973) | function t(t) {
  function e (line 16033) | function e(e, t) {
  function t (line 16069) | function t(e) {
  function t (line 16176) | function t(e) {
  function t (line 16272) | function t(e) {
  function t (line 17302) | function t(e, n) {
  function t (line 17415) | function t(e, n) {
  function t (line 17601) | function t() {
  function c (line 17898) | function c(e) {
  function u (line 17914) | function u(e) {
  function u (line 17992) | function u(e) {
  function c (line 18023) | function c(e) {
  function u (line 18135) | function u(e, t) {
  function c (line 18150) | function c(e) {
  function s (line 18190) | function s(e, t, n, r) {
  function u (line 18387) | function u(e) {
  function i (line 18431) | function i(e) {
  function c (line 18451) | function c() {
  function l (line 18476) | function l(e) {
  function d (line 18485) | function d(e, t, n, r) {
  function m (line 18510) | function m(e) {
  function M (line 18521) | function M(e) {
  function v (line 18585) | function v(e, t) {
  function _ (line 18617) | function _(e, t) {
  function A (line 18707) | function A(e) {
  function L (line 18718) | function L(e) {
  function w (line 18721) | function w(e) {
  function T (line 18724) | function T(e, t) {
  function k (line 18729) | function k(e, t) {
  function O (line 18732) | function O(e, t, n) {
  function z (line 18744) | function z(e, t) {
  function E (line 18809) | function E(e) {
  function D (line 18821) | function D(e) {
  function N (line 18859) | function N(e) {
  function o (line 18994) | function o(e) {
  function t (line 19403) | function t(e, t, n) {
  function t (line 19679) | function t(e, t, n) {
  function t (line 19744) | function t(e, t, n) {
  function a (line 19892) | function a(e) {
  function i (line 19895) | function i(e, t, n, r) {
  function t (line 20097) | function t(e, t, n, r) {
  function t (line 20130) | function t(e, t, n, r) {
  function t (line 20163) | function t(e, t, n, r) {
  function t (line 20773) | function t(e, t, n, r) {
  function r (line 20912) | function r(e, r, o, a) {
  function t (line 21324) | function t(e, t, n, r) {
  function t (line 21547) | function t(e, t, n) {
  function n (line 21626) | function n(e, t, n, r) {
  function r (line 21656) | function r(e) {
  function t (line 21782) | function t(e) {
  function n (line 21785) | function n(e, n, r, o) {
  function t (line 22348) | function t(e, t, n, r) {
  function n (line 22352) | function n(e) {
  function n (line 22475) | function n(e, t, n, r) {
  function r (line 22478) | function r(e) {
  function o (line 22481) | function o(e) {
  function a (line 22484) | function a(e, t, a, i) {
  function n (line 22558) | function n(e, t, n) {
  function r (line 22561) | function r(e, r, o) {
  function o (line 22564) | function o(e, r, o) {
  function t (line 22819) | function t(e, t, n, r) {
  function r (line 22881) | function r(e, t, n, r) {
  function r (line 23417) | function r(e) {
  function o (line 23420) | function o(e, t, n) {
  function t (line 23575) | function t(e, t, n) {
  function t (line 23596) | function t(e, t, n) {
  function r (line 23827) | function r(e) {
  function o (line 23830) | function o(e, t, n, o) {
  function t (line 23915) | function t(e, t, n, r) {
  function n (line 24570) | function n(e, n, r, o) {
  function t (line 24697) | function t(e, t, n, r) {
  function t (line 24860) | function t(e, t, n) {
  function n (line 24883) | function n(e) {
  function r (line 25844) | function r(e, t, n) {
  function o (line 25847) | function o(e) {
  function s (line 25853) | function s(e, t) {
  function u (line 25863) | function u(e, t) {
  function c (line 25874) | function c(e, t, n) {
  function d (line 25879) | function d(e, t, n) {
  function f (line 25896) | function f(e, t) {
  function u (line 26166) | function u(e, t, n) {
  function c (line 26169) | function c() {}
  function l (line 26170) | function l(e) {
  function d (line 26173) | function d() {
  function p (line 26187) | function p(e, t, n) {
  function h (line 26190) | function h(e, t) {
  function m (line 26193) | function m(e, t, n) {
  function M (line 26198) | function M(e, t, n) {
  function s (line 26297) | function s(e, t) {
  function u (line 26300) | function u(e) {
  function f (line 26323) | function f() {
  function p (line 26344) | function p(e, t) {
  function h (line 26347) | function h() {
  function r (line 26767) | function r(e) {
  function o (line 26770) | function o(e) {
  function a (line 26773) | function a(e) {
  function n (line 26800) | function n() {
  function i (line 27107) | function i(e, t, n, r) {
  function n (line 27141) | function n() {
  function c (line 27449) | function c(e) {
  function l (line 27527) | function l(e) {
  function d (line 27533) | function d(e) {
  function c (line 27587) | function c(e) {
  function r (line 27656) | function r(e) {
  function n (line 27668) | function n(e, t) {
  function r (line 27691) | function r(e) {
  function o (line 27709) | function o(i, s) {
  function l (line 27773) | function l() {
  function o (line 27793) | function o() {}
  function c (line 27798) | function c(e) {
  function l (line 27802) | function l(e, t, n) {
  function d (line 27807) | function d(e, t, n) {
  function f (line 27818) | function f(e) {
  function p (line 27825) | function p(e, t) {
  function h (line 27838) | function h(e, t) {
  function l (line 27899) | function l(e, o) {
  function a (line 27965) | function a(e, t) {
  function s (line 27983) | function s(e, t) {
  function u (line 27994) | function u(e, t, n) {
  function c (line 27997) | function c(e) {
  function p (line 28003) | function p(e) {
  function h (line 28026) | function h(e) {
  function m (line 28039) | function m(e, t) {
  function M (line 28070) | function M(e) {
  function y (line 28081) | function y(e) {
  function v (line 28084) | function v(e) {
  function b (line 28092) | function b(e) {
  function g (line 28109) | function g(e, t, n) {
  function s (line 28132) | function s() {
  function O (line 28444) | function O(e) {
  function S (line 28466) | function S(e) {
  function E (line 28556) | function E(e, t, n, r) {
  function D (line 28798) | function D() {
  function R (line 28929) | function R(e, t) {
  function F (line 28937) | function F() {
  function e (line 28945) | function e(t) {
  function a (line 29018) | function a() {
  function s (line 29021) | function s(e) {
  function n (line 29889) | function n(e, t) {
  function r (line 29892) | function r(e) {
  function p (line 29953) | function p(e) {
  function o (line 30144) | function o(e) {
  function a (line 30147) | function a(e) {
  function u (line 30177) | function u(e) {
  function l (line 30183) | function l(t) {
  function d (line 30213) | function d(e) {
  function f (line 30225) | function f(e) {
  function p (line 30234) | function p(e) {
  function n (line 30259) | function n() {
  function L (line 30274) | function L(e, t) {
  function w (line 30277) | function w(e) {
  function T (line 30280) | function T(e) {
  function k (line 30283) | function k(e) {
  function O (line 30286) | function O(e, t, n) {
  function z (line 30290) | function z(e, t) {
  function e (line 30312) | function e(e, t) {
  function q (line 30366) | function q(e, t) {
  function B (line 30375) | function B(e, t, n) {
  function R (line 30384) | function R(e, t, n) {
  function F (line 30387) | function F(e, t, n) {
  function H (line 30390) | function H(e) {
  function I (line 30395) | function I(e) {
  function X (line 30400) | function X(e) {
  function K (line 30405) | function K(e) {
  function U (line 30410) | function U(e) {
  function J (line 30413) | function J(e) {
  function V (line 30427) | function V(e) {
  function G (line 30434) | function G() {
  function $ (line 30438) | function $(e, t, n) {
  function Q (line 30441) | function Q(e) {
  function Z (line 30444) | function Z(e) {
  function ee (line 30447) | function ee(e, t, n) {
  function te (line 30470) | function te(e, t, n) {
  function ne (line 30476) | function ne(e, t) {
  function re (line 30480) | function re(t) {
  function r (line 30489) | function r() {
  function r (line 30633) | function r(e) {
  function e (line 30805) | function e(e, t) {
  function u (line 30818) | function u(e) {
  function t (line 30836) | function t(e) {
  function a (line 31056) | function a(e) {
  function o (line 31087) | function o(t) {
  function i (line 31147) | function i(e) {
  function e (line 31223) | function e(e, t) {
  function t (line 31226) | function t(e, t) {
  function n (line 31232) | function n(e, n, r) {
  function o (line 31235) | function o(e) {
  function a (line 31242) | function a(e, t) {
  function i (line 31249) | function i(e) {
  function s (line 31253) | function s(e, t) {
  function u (line 31256) | function u(e) {
  function c (line 31277) | function c(e, t, n) {
  function t (line 31293) | function t() {
  function s (line 31339) | function s() {
  function t (line 31368) | function t() {
  function i (line 31465) | function i() {
  function n (line 31492) | function n(n) {
  function n (line 31561) | function n(n) {
  function n (line 31700) | function n(t) {
  function r (line 31705) | function r(n) {
  function r (line 31795) | function r(t) {
  function o (line 31801) | function o(n) {
  function n (line 31885) | function n(n, r) {
  function i (line 32112) | function i(t, r) {
  function s (line 32127) | function s(t, n, r) {
  function a (line 32344) | function a() {
  function t (line 32505) | function t(n, r) {
  function n (line 32518) | function n(n) {
  function n (line 32593) | function n(n) {
  function s (line 32622) | function s() {
  function n (line 32654) | function n(n) {
  function y (line 32741) | function y(e) {
  function g (line 32754) | function g(e, t, n) {
  function _ (line 32757) | function _() {}
  function A (line 32758) | function A(e, t, n) {
  function O (line 32775) | function O(e, t, n) {
  function S (line 32790) | function S(e) {
  function x (line 32795) | function x(e, t, n, r) {
  function D (line 32802) | function D(e) {
  function N (line 32805) | function N(e, t, n) {
  function j (line 32838) | function j(e, t) {
  function C (line 32851) | function C(e, t) {
  function P (line 32854) | function P(e, t, n) {
  function Y (line 32869) | function Y(e, t, n, r, o) {
  function q (line 32874) | function q() {
  function i (line 32999) | function i(e) {
  function s (line 33004) | function s(e, t, n, r, o, a, i, s, u) {
  function p (line 33021) | function p(e, t, n, r, o, a, i, l, d) {
  function y (line 33027) | function y(e, t, n) {
  function g (line 33041) | function g() {
  function _ (line 33066) | function _(e, t, n) {
  function k (line 33074) | function k(e) {
  function x (line 33091) | function x(e) {
  function D (line 33098) | function D(e) {
  function N (line 33101) | function N() {
  function j (line 33108) | function j(e, t) {
  function C (line 33111) | function C(e, t, n, r, o) {
  function P (line 33114) | function P() {}
  function B (line 33118) | function B() {
  function R (line 33121) | function R(e, t, n) {
  function K (line 33134) | function K(e, t, n, r, o, a) {
  function V (line 33174) | function V(e) {
  function $ (line 33199) | function $(e, t, n, r) {
  function me (line 33259) | function me(e) {
  function Me (line 33262) | function Me(e) {
  function ye (line 33298) | function ye(e) {
  function ve (line 33320) | function ve(e) {
  function be (line 33332) | function be(e) {
  function ge (line 33336) | function ge(e) {
  function _e (line 33371) | function _e(e) {
  function Ae (line 33379) | function Ae(e, t) {
  function Le (line 33383) | function Le(e, t) {
  function we (line 33388) | function we(e, t) {
  function Te (line 33391) | function Te(e, t) {
  function ke (line 33399) | function ke(e, t, n) {
  function Oe (line 33407) | function Oe(e, t, n) {
  function Se (line 33410) | function Se(e, t) {
  function ze (line 33425) | function ze(e, t, n, r) {
  function Ee (line 33438) | function Ee(e, t) {
  function xe (line 33442) | function xe(e, t) {
  function De (line 33457) | function De(e, t) {
  function Ne (line 33462) | function Ne(e) {
  function Pe (line 33468) | function Pe(e) {
  function Ye (line 33478) | function Ye(e, t) {
  function Be (line 33497) | function Be(e, t) {
  function Re (line 33504) | function Re(e, t) {
  function Xe (line 33511) | function Xe(e) {
  function Qe (line 33531) | function Qe(e) {
  function Ze (line 33535) | function Ze(e) {
  function et (line 33547) | function et(e) {
  function tt (line 33554) | function tt(e) {
  function nt (line 33557) | function nt(e) {
  function rt (line 33633) | function rt(e, t) {
  function ot (line 33637) | function ot(e, t, n) {
  function it (line 33641) | function it(e) {
  function st (line 33650) | function st(e) {
  function ut (line 33656) | function ut(e) {
  function ct (line 33659) | function ct(e) {
  function dt (line 33665) | function dt(e) {
  function ft (line 33668) | function ft(e, t, n, r) {
  function pt (line 33675) | function pt(e) {
  function ht (line 33706) | function ht(e, t, n) {
  function St (line 33745) | function St(e, t, n, r, o) {
  function zt (line 33748) | function zt(e, t) {
  function Et (line 33771) | function Et(e, t, n, r, o, a) {
  function xt (line 33774) | function xt(e) {
  function Dt (line 33791) | function Dt(e) {
  function Nt (line 33800) | function Nt(e, t, n) {
  function jt (line 33803) | function jt() {
  function Ct (line 33815) | function Ct(e, t) {
  function Pt (line 33818) | function Pt(e) {
  function Rt (line 33887) | function Rt(e, t) {
  function Ut (line 33912) | function Ut(e, t) {
  function Jt (line 33915) | function Jt(e, t, n) {
  function Vt (line 33929) | function Vt(e, t, n, r) {
  function Gt (line 33940) | function Gt(e, t, n, r) {
  function $t (line 33943) | function $t(e, t, n, r) {
  function Qt (line 33977) | function Qt(e, t, n, r) {
  function tn (line 34045) | function tn(e, t, n) {
  function nn (line 34048) | function nn(e, t) {
  function on (line 34062) | function on(e, t) {
  function an (line 34072) | function an(e, t) {
  function un (line 34089) | function un(e, t) {
  function cn (line 34094) | function cn() {}
  function ln (line 34095) | function ln(e) {
  function dn (line 34103) | function dn(e) {
  function fn (line 34107) | function fn(e, t) {
  function pn (line 34128) | function pn() {
  function hn (line 34140) | function hn(e) {
  function yn (line 34146) | function yn(e, t) {
  function vn (line 34156) | function vn(e, t) {
  function _n (line 34168) | function _n(e) {
  function An (line 34175) | function An(e) {
  function On (line 34193) | function On(e) {
  function Sn (line 34209) | function Sn(e) {
  function zn (line 34212) | function zn(e) {
  function En (line 34216) | function En(e) {
  function xn (line 34219) | function xn(e) {
  function Dn (line 34225) | function Dn(e, t) {
  function Nn (line 34252) | function Nn(e, t, n) {
  function jn (line 34255) | function jn(e) {
  function Cn (line 34262) | function Cn(e, t, n) {
  function Pn (line 34265) | function Pn(e) {
  function Yn (line 34268) | function Yn(e) {
  function Rn (line 34274) | function Rn() {
  function Fn (line 34287) | function Fn() {
  function Hn (line 34290) | function Hn() {
  function In (line 34293) | function In(e, t, 
Copy disabled (too large) Download .json
Condensed preview — 280 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (14,581K chars).
[
  {
    "path": ".flake8",
    "chars": 53,
    "preview": "[flake8]\nignore = E501, F824, F823, F841, W503, E722\n"
  },
  {
    "path": ".github/workflows/check-protobuf.yml",
    "chars": 944,
    "preview": "name: Check Protobuf\n\non:\n  push:\n    paths:\n      - '**.proto'\n      - '**_pb2.py'\n  pull_request:\n    paths:\n      - '"
  },
  {
    "path": ".github/workflows/jekyll-gh-pages.yml",
    "chars": 1409,
    "preview": "# Sample workflow for building and deploying a Jekyll site to GitHub Pages\nname: Deploy Jekyll with GitHub Pages depende"
  },
  {
    "path": ".github/workflows/pwsim-docker.yml",
    "chars": 828,
    "preview": "name: pwsim-docker\n\n# Only trigger if a push is made to the pwsimulator folder\non:\n  push:\n    paths:\n      - 'pwsimulat"
  },
  {
    "path": ".github/workflows/pylint.yml",
    "chars": 674,
    "preview": "name: Pylint\n\non:\n  push:\n  pull_request:\n  workflow_dispatch:\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    strategy:\n"
  },
  {
    "path": ".github/workflows/simtest.yml",
    "chars": 2870,
    "preview": "name: simulator\n\non:\n  push:\n  pull_request:\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\nconcurrency:\n  group: "
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 1855,
    "preview": "name: CI\n\non:\n  push:\n  pull_request:\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\nconcurrency:\n  group: ${{ git"
  },
  {
    "path": ".gitignore",
    "chars": 2536,
    "preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packagi"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 667,
    "preview": "repos:\n  - repo: local\n    hooks:\n      - id: protoc-gen\n        name: Regenerate protobuf Python files\n        language"
  },
  {
    "path": ".pylintrc",
    "chars": 1138,
    "preview": "[MASTER]\n# Ignore auto-generated protobuf files\nignore-paths = .*_pb2\\.py$\n\n[MESSAGES CONTROL]\ndisable=consider-iteratin"
  },
  {
    "path": "API.md",
    "chars": 14798,
    "preview": "# PyPowerwall Python API Documentation\n\nPyPowerwall is a Python library for interfacing with the Tesla Solar Powerwall G"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 1931,
    "preview": "# Contributor Code of Conduct\n\nAs contributors and maintainers of this project, and in the interest of fostering an open"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 9151,
    "preview": "# Contributing to PyPowerwall\n\nThank you for your interest in contributing to PyPowerwall! We welcome contributions that"
  },
  {
    "path": "LICENSE",
    "chars": 1066,
    "preview": "MIT License\n\nCopyright (c) 2021 Jason Cox\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\n"
  },
  {
    "path": "README.md",
    "chars": 53543,
    "preview": "# pyPowerwall\n\n[![License](https://img.shields.io/github/license/jasonacox/pypowerwall)](https://img.shields.io/github/l"
  },
  {
    "path": "RELEASE.md",
    "chars": 55643,
    "preview": "# RELEASE NOTES\n\n## v0.15.6 - Reserve Percent Scaling Fix + CLI Redesign\n\n* Fix: `set_operation()` reserve percent scali"
  },
  {
    "path": "_config.yml",
    "chars": 26,
    "preview": "theme: jekyll-theme-cayman"
  },
  {
    "path": "api_test.py",
    "chars": 5541,
    "preview": "# Test Functions of the Powerwall API\nimport os\n\nimport pypowerwall\n\n# Optional: Turn on Debug Mode\npypowerwall.set_debu"
  },
  {
    "path": "dashboard/README.md",
    "chars": 791,
    "preview": "# Powerwall Dashboard\n\nMonitoring Dashboard for the Tesla Powerwall using Grafana, InfluxDB and Telegraf.  See [jasonaco"
  },
  {
    "path": "docs/README.md",
    "chars": 3681,
    "preview": "# pyPowerwall Documentation\n\nWelcome to the pyPowerwall documentation hub. This page provides organized access to all do"
  },
  {
    "path": "docs/api.txt",
    "chars": 1597,
    "preview": "/api/auth/toggle/login\n/api/auth/toggle/start\n/api/auth/toggle/supported\n/api/autoconfig/cancel\n/api/autoconfig/retry\n/a"
  },
  {
    "path": "docs/reference/alerts.md",
    "chars": 23214,
    "preview": "# Alerts\n\nThe following list details alerts potentially returned by the device vitals API (e.g., /api/device/vitals). Th"
  },
  {
    "path": "docs/reference/devices.md",
    "chars": 3550,
    "preview": "# Powerwall Devices\n\nDevices and alerts will show up in the device vitals API (e.g., `/api/device/vitals`). Below is a l"
  },
  {
    "path": "docs/reference/firmware-history.md",
    "chars": 8135,
    "preview": "# Firmware Version History\n\nFirmware version of the Powerwall can be seen with `pw.version()`. An estimate of Firmware v"
  },
  {
    "path": "docs/vitals-example-failed-pw.json",
    "chars": 5548,
    "preview": "{\n    \"STSTSM--1152100-14-E--CNxxx\": {\n        \"STSTSM-Location\": \"Gateway\",\n        \"alerts\": [\n            \"GridCodesW"
  },
  {
    "path": "docs/vitals-example-latest.json",
    "chars": 11826,
    "preview": "{\n    \"NEURIO--VAHXXXXXXXXXX\": {\n        \"NEURIO_CT0_InstRealPower\": 2118.239990234375,\n        \"NEURIO_CT0_Location\": \""
  },
  {
    "path": "docs/vitals-example.json",
    "chars": 11667,
    "preview": "{\n    \"NEURIO--VAHxxxxxxxxxx\": {\n        \"NEURIO_CT0_InstRealPower\": -15.920000076293945,\n        \"NEURIO_CT0_Location\":"
  },
  {
    "path": "example-cloud-mode.py",
    "chars": 1165,
    "preview": "# Example test for pypowerwall\nimport os\nimport pypowerwall\n\nif __name__ == \"__main__\":\n    # Optional: Turn on Debug Mo"
  },
  {
    "path": "example.py",
    "chars": 6177,
    "preview": "# Example: pyPowerwall Usage Demo\n# --------------------------------\n# This script demonstrates how to connect to a Tesl"
  },
  {
    "path": "examples/network_route.py",
    "chars": 5600,
    "preview": "# This file contains two examples of how to use the `route` command from Linux in Python.\n# 1. manage_ip_route_pyroute: "
  },
  {
    "path": "examples/vitals/README.md",
    "chars": 1118,
    "preview": "# Tesla Powerwall Vitals Data\n\nThis script, [pull_vitals.py](pull_vitals.py) pulls the Powerwall Vitals API and returns "
  },
  {
    "path": "examples/vitals/pull_vitals.py",
    "chars": 5196,
    "preview": "# pyPowerWall Vitals\n# -*- coding: utf-8 -*-\n\"\"\"\n This script pulls the Powerwall Vitals API\n\n Author: Jason A. Cox\n For"
  },
  {
    "path": "examples/vitals/tesla.proto",
    "chars": 13298,
    "preview": "// Tesla Protocol Buffer definition (tesla.proto) \n//\n// Create tesla_pb2.py for use in projects using the protoc compil"
  },
  {
    "path": "examples/vitals/tesla_pb2.py",
    "chars": 71278,
    "preview": "# -*- coding: utf-8 -*-\n# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: tesla.proto\n\"\"\"Generated pr"
  },
  {
    "path": "examples/vitals.py",
    "chars": 2674,
    "preview": "# pyPowerWall Vitals\n# -*- coding: utf-8 -*-\n\"\"\"\n This script pulls the Powerwall Vitals API\n\n Author: Jason A. Cox\n For"
  },
  {
    "path": "proxy/.dockerignore",
    "chars": 568,
    "preview": "# Credentials and auth files - must never be baked into image\n.powerwall\n.auth\n.pypowerwall.auth\n.pypowerwall.site\n.pypo"
  },
  {
    "path": "proxy/API.md",
    "chars": 18159,
    "preview": "# PyPowerwall Proxy Server API\n\nThis document describes the HTTP API endpoints provided by the PyPowerwall Proxy Server."
  },
  {
    "path": "proxy/Dockerfile",
    "chars": 410,
    "preview": "FROM python:3.10-alpine\n\nWORKDIR /app\n\n# Install system dependencies\nRUN apk add --no-cache git curl\n\n# Install pypowerw"
  },
  {
    "path": "proxy/Dockerfile.beta",
    "chars": 488,
    "preview": "FROM python:3.10-alpine\n\nWORKDIR /app\n\n# Install git (and build dependencies if needed)\nRUN apk add --no-cache git curl\n"
  },
  {
    "path": "proxy/HELP.md",
    "chars": 567,
    "preview": "# pyPowerwall Proxy Help\n\nBesides providing authentication and payload caching, the Proxy exposes several APIs that aggr"
  },
  {
    "path": "proxy/README.md",
    "chars": 23723,
    "preview": "# pyPowerwall Proxy Server\n\n![Docker Pulls](https://img.shields.io/docker/pulls/jasonacox/pypowerwall)\n\nThis pyPowerwall"
  },
  {
    "path": "proxy/RELEASE.md",
    "chars": 29660,
    "preview": "## pyPowerwall Proxy Release Notes\n\n### Proxy t89 (6 Mar 2026)\n\n* Added `/control/max_backup` endpoint for scheduling, c"
  },
  {
    "path": "proxy/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "proxy/beta.txt",
    "chars": 282,
    "preview": "# This file is used to install the necessary Python packages for the project.\nrequests\nprotobuf>=3.20.0\npython-dotenv\npy"
  },
  {
    "path": "proxy/localhost.pem",
    "chars": 2758,
    "preview": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDIrws/RUeO1Rni\nir2ri+DXsCOiprIgLCF8Clrhd4Z"
  },
  {
    "path": "proxy/perf_test.py",
    "chars": 10609,
    "preview": "#!/usr/bin/env python3\n\"\"\"\nPerformance test script for pypowerwall proxy routes.\nTests response times for various endpoi"
  },
  {
    "path": "proxy/requirements.txt",
    "chars": 31,
    "preview": "pypowerwall==0.15.6\nbs4==0.0.2\n"
  },
  {
    "path": "proxy/server.py",
    "chars": 96980,
    "preview": "#!/usr/bin/env python\n# pyPowerWall Module - Proxy Server Tool\n# -*- coding: utf-8 -*-\n\"\"\"\n Python module to interface w"
  },
  {
    "path": "proxy/tests/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "proxy/tests/test_api_endpoints.py",
    "chars": 18163,
    "preview": "import json\nimport unittest\nfrom http import HTTPStatus\nfrom io import BytesIO\nfrom unittest.mock import Mock, patch\n\nfr"
  },
  {
    "path": "proxy/tests/test_csv_endpoints.py",
    "chars": 21652,
    "preview": "import json\nimport unittest\nfrom contextlib import contextmanager\nfrom http import HTTPStatus\nfrom io import BytesIO\nfro"
  },
  {
    "path": "proxy/transform.py",
    "chars": 2399,
    "preview": "import os\nimport logging\n\nfrom bs4 import BeautifulSoup as Soup\n\nlogging.basicConfig(\n    format=\"%(asctime)s [%(name)s]"
  },
  {
    "path": "proxy/upload-beta.sh",
    "chars": 1841,
    "preview": "#!/bin/bash\necho \"Build and Push jasonacox/pypowerwall to Docker Hub\"\necho \"Usage: $0 [beta_number]\"\necho \"  If beta_num"
  },
  {
    "path": "proxy/web/LICENSE",
    "chars": 3171,
    "preview": "/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright JS Foundation and other contributors <https://js.foundation"
  },
  {
    "path": "proxy/web/bogus/api.auth.toggle.supported.json",
    "chars": 31,
    "preview": "{\"toggle_auth_supported\":true}\n"
  },
  {
    "path": "proxy/web/bogus/api.customer.json",
    "chars": 19,
    "preview": "{\"registered\":true}"
  },
  {
    "path": "proxy/web/bogus/api.customer.registration.json",
    "chars": 134,
    "preview": "{\"privacy_notice\":null,\"limited_warranty\":null,\"grid_services\":null,\"marketing\":null,\"registered\":true,\"timed_out_regist"
  },
  {
    "path": "proxy/web/bogus/api.installer.json",
    "chars": 281,
    "preview": "{\"company\":\"Tesla\",\"customer_id\":\"\",\"phone\":\"\",\"email\":\"\",\"location\":\"\",\"mounting\":\"\",\"wiring\":\"\",\"backup_configuration\""
  },
  {
    "path": "proxy/web/bogus/api.meters.aggregates.json",
    "chars": 2549,
    "preview": "{\"site\":{\"last_communication_time\":\"2023-12-16T08:33:19.496043714-08:00\",\"instant_power\":27,\"instant_reactive_power\":-22"
  },
  {
    "path": "proxy/web/bogus/api.meters.json",
    "chars": 574,
    "preview": "[{\"serial\":\"VAH1234AB1234\",\"short_id\":\"73533\",\"type\":\"neurio_w2_tcp\",\"connected\":true,\"cts\":[{\"type\":\"solarRGM\",\"valid\":"
  },
  {
    "path": "proxy/web/bogus/api.meters.readings.json",
    "chars": 8,
    "preview": "TIMEOUT!"
  },
  {
    "path": "proxy/web/bogus/api.meters.site.json",
    "chars": 1083,
    "preview": "[{\"id\":0,\"location\":\"site\",\"type\":\"synchrometerX\",\"cts\":[true,true,false,false],\"inverted\":[false,false,false,false],\"co"
  },
  {
    "path": "proxy/web/bogus/api.meters.solar.json",
    "chars": 4,
    "preview": "null"
  },
  {
    "path": "proxy/web/bogus/api.networks.json",
    "chars": 918,
    "preview": "[{\"network_name\":\"ethernet_tesla_internal_default\",\"interface\":\"EthType\",\"enabled\":true,\"dhcp\":true,\"extra_ips\":[{\"ip\":\""
  },
  {
    "path": "proxy/web/bogus/api.operation.json",
    "chars": 127,
    "preview": "{\"real_mode\":\"self_consumption\",\"backup_reserve_percent\":81,\"freq_shift_load_shed_soe\":65,\"freq_shift_load_shed_delta_f\""
  },
  {
    "path": "proxy/web/bogus/api.powerwalls.json",
    "chars": 6874,
    "preview": "{\"enumerating\":false,\"updating\":false,\"checking_if_offgrid\":false,\"running_phase_detection\":false,\"phase_detection_last_"
  },
  {
    "path": "proxy/web/bogus/api.site_info.grid_codes.json",
    "chars": 8,
    "preview": "TIMEOUT!"
  },
  {
    "path": "proxy/web/bogus/api.site_info.json",
    "chars": 514,
    "preview": "{\"max_system_energy_kWh\":27,\"max_system_power_kW\":10.8,\"site_name\":\"Tesla Energy Gateway\",\"timezone\":\"America/Los_Angele"
  },
  {
    "path": "proxy/web/bogus/api.site_info.site_name.json",
    "chars": 70,
    "preview": "{\"site_name\":\"Tesla Energy Gateway\",\"timezone\":\"America/Los_Angeles\"}\n"
  },
  {
    "path": "proxy/web/bogus/api.sitemaster.json",
    "chars": 107,
    "preview": "{\"status\":\"StatusUp\",\"running\":true,\"connected_to_tesla\":true,\"power_supply_mode\":false,\"can_reboot\":\"Yes\"}"
  },
  {
    "path": "proxy/web/bogus/api.solars.brands.json",
    "chars": 5265,
    "preview": "[\"ABB\",\"Ablerex Electronics\",\"Advanced Energy Industries\",\"Advanced Solar Photonics\",\"AE Solar Energy\",\"AEconversion Gmb"
  },
  {
    "path": "proxy/web/bogus/api.solars.json",
    "chars": 75,
    "preview": "[{\"brand\":\"Tesla\",\"model\":\"Solar Inverter 7.6\",\"power_rating_watts\":7600}]\n"
  },
  {
    "path": "proxy/web/bogus/api.status.json",
    "chars": 344,
    "preview": "{\"din\":\"1232100-00-E--TG1234567890G1\",\"start_time\":\"2023-10-13 04:01:45 +0800\",\"up_time_seconds\":\"1541h38m20.998412744s\""
  },
  {
    "path": "proxy/web/bogus/api.synchrometer.ct_voltage_references.json",
    "chars": 47,
    "preview": "{\"ct1\":\"Phase1\",\"ct2\":\"Phase2\",\"ct3\":\"Phase1\"}\n"
  },
  {
    "path": "proxy/web/bogus/api.system.networks.json",
    "chars": 8,
    "preview": "TIMEOUT!"
  },
  {
    "path": "proxy/web/bogus/api.system.update.status.json",
    "chars": 241,
    "preview": "{\"state\":\"/update_succeeded\",\"info\":{\"status\":[\"nonactionable\"]},\"current_time\":1702756114429,\"last_status_time\":1702753"
  },
  {
    "path": "proxy/web/bogus/api.system_status.grid_faults.json",
    "chars": 2,
    "preview": "[]"
  },
  {
    "path": "proxy/web/bogus/api.system_status.grid_status.json",
    "chars": 66,
    "preview": "{\"grid_status\":\"SystemGridConnected\",\"grid_services_active\":false}"
  },
  {
    "path": "proxy/web/bogus/api.system_status.grid_status.json-offline",
    "chars": 66,
    "preview": "{\"grid_status\":\"SystemIslandedActive\",\"grid_services_active\":true}"
  },
  {
    "path": "proxy/web/bogus/api.system_status.grid_status.json-transition",
    "chars": 69,
    "preview": "{\"grid_status\":\"SystemTransitionToGrid\",\"grid_services_active\":false}"
  },
  {
    "path": "proxy/web/bogus/api.system_status.json",
    "chars": 2269,
    "preview": "{\"command_source\":\"Configuration\",\"battery_target_power\":-3866.6666666666665,\"battery_target_reactive_power\":0,\"nominal_"
  },
  {
    "path": "proxy/web/bogus/api.system_status.soe.json",
    "chars": 34,
    "preview": "{\"percentage\": 20.109166592431226}"
  },
  {
    "path": "proxy/web/bogus/api.troubleshooting.problems.json",
    "chars": 15,
    "preview": "{\"problems\":[]}"
  },
  {
    "path": "proxy/web/example.html",
    "chars": 1147,
    "preview": "<!DOCTYPE html>\n<html>\n    <head>\n        <title>pyPowerwall Proxy iFrame Example</title>\n    </head>\n    <script src=\"h"
  },
  {
    "path": "proxy/web/index.html",
    "chars": 1884,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <title>Tesla Energy - Setup</title>\n        <link href=\"favicon-32x3"
  },
  {
    "path": "proxy/web/viz-static/1.17c71172308436a079d1.js",
    "chars": 27834,
    "preview": "(window.webpackJsonp = window.webpackJsonp || []).push([\n    [1],\n    {\n        1154: function (e, t, r) {\n            \""
  },
  {
    "path": "proxy/web/viz-static/39.17c71172308436a079d1.js",
    "chars": 40361,
    "preview": "(window.webpackJsonp = window.webpackJsonp || []).push([\n    [39],\n    {\n        1083: function (e, t, i) {\n            "
  },
  {
    "path": "proxy/web/viz-static/40.17c71172308436a079d1.js",
    "chars": 94,
    "preview": "(window.webpackJsonp = window.webpackJsonp || []).push([[40], { 1062: function (n, w) {} }]);\n"
  },
  {
    "path": "proxy/web/viz-static/app.css",
    "chars": 204159,
    "preview": ".error-item .error-info {\n    margin-left: 10px;\n    cursor: pointer\n}\n\n.error-item a.refresh {\n    color: #fff\n}\n\n.erro"
  },
  {
    "path": "proxy/web/viz-static/app.js",
    "chars": 2119234,
    "preview": "!(function (e) {\n    function t(t) {\n        for (var n, r, s = t[0], _ = t[1], l = t[2], c = 0, u = []; c < s.length; c"
  },
  {
    "path": "proxy/web/viz-static/black.js",
    "chars": 2254,
    "preview": "'use strict'\n\n// Clear IndexedDB to prevent auth hangup in the proxied Powerwall web app.\ntry {\n    window.indexedDB.dat"
  },
  {
    "path": "proxy/web/viz-static/clear.js",
    "chars": 2268,
    "preview": "'use strict'\n\n// Clear IndexedDB to prevent auth hangup in the proxied Powerwall web app.\ntry {\n    window.indexedDB.dat"
  },
  {
    "path": "proxy/web/viz-static/dakboard.js",
    "chars": 2263,
    "preview": "'use strict'\n\n// Clear IndexedDB to prevent auth hangup in the proxied Powerwall web app.\ntry {\n    window.indexedDB.dat"
  },
  {
    "path": "proxy/web/viz-static/grafana-dark.js",
    "chars": 2287,
    "preview": "'use strict'\n\n// Grafana Dark Theme\n// Clear IndexedDB to prevent auth hangup in the proxied Powerwall web app.\ntry {\n  "
  },
  {
    "path": "proxy/web/viz-static/grafana.js",
    "chars": 2265,
    "preview": "'use strict'\n\n// Clear IndexedDB to prevent auth hangup in the proxied Powerwall web app.\ntry {\n    window.indexedDB.dat"
  },
  {
    "path": "proxy/web/viz-static/solar.js",
    "chars": 3007,
    "preview": "'use strict'\n\n// Clear IndexedDB to prevent auth hangup in the proxied Powerwall web app.\ntry {\n    window.indexedDB.dat"
  },
  {
    "path": "proxy/web/viz-static/vendor.js",
    "chars": 3445043,
    "preview": "/*! For license information please see vendor.17c71172308436a079d1.js.LICENSE */\n(window.webpackJsonp = window.webpackJs"
  },
  {
    "path": "proxy/web/viz-static/white.js",
    "chars": 2257,
    "preview": "'use strict'\n\n// Clear IndexedDB to prevent auth hangup in the proxied Powerwall web app.\ntry {\n    window.indexedDB.dat"
  },
  {
    "path": "pwsimulator/Dockerfile",
    "chars": 113,
    "preview": "FROM python:3.12-alpine\nWORKDIR /app\nRUN pip3 install pypowerwall\nCOPY . .\nCMD [\"python3\", \"stub.py\"]\nEXPOSE 443 "
  },
  {
    "path": "pwsimulator/README.md",
    "chars": 3954,
    "preview": "# pyPowerwall Simulator\n\n![Docker Pulls](https://img.shields.io/docker/pulls/jasonacox/pwsimulator)\n\nYou can use pyPower"
  },
  {
    "path": "pwsimulator/control.html",
    "chars": 1499,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width"
  },
  {
    "path": "pwsimulator/localhost.pem",
    "chars": 3022,
    "preview": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC/7rKoz3FNDbZq\nZiA9/WE8baZzFUn5c5a5EGksOWX"
  },
  {
    "path": "pwsimulator/stub.py",
    "chars": 49190,
    "preview": "# pyPowerWall Module - Proxy Server Tool\n# -*- coding: utf-8 -*-\n\"\"\"\n Python module to interface with Tesla Solar Powerw"
  },
  {
    "path": "pwsimulator/tedapi_pb2.py",
    "chars": 6080,
    "preview": "# -*- coding: utf-8 -*-\n# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: tedapi.proto\n# Protobuf Pyt"
  },
  {
    "path": "pwsimulator/test.py",
    "chars": 882,
    "preview": "# Example test for pypowerwall\n\nimport pypowerwall\n\n# Optional: Turn on Debug Mode\npypowerwall.set_debug(True)\n\n# Creden"
  },
  {
    "path": "pwsimulator/test.sh",
    "chars": 2058,
    "preview": "#!/bin/bash\n#\n# Test Script for Powerwall Simulator\n#\n\n# Valid Login Request\necho \"-------------------------------------"
  },
  {
    "path": "pwsimulator/test_tedapi.py",
    "chars": 3989,
    "preview": "#!/usr/bin/env python3\n# Test script for TEDAPI simulator endpoints\n# -*- coding: utf-8 -*-\n\"\"\"\nTest the TEDAPI endpoint"
  },
  {
    "path": "pypowerwall/__init__.py",
    "chars": 49902,
    "preview": "# pyPowerWall Module\n# -*- coding: utf-8 -*-\n\"\"\"\n Python module to interface with Tesla Solar Powerwall Gateway\n\n Author"
  },
  {
    "path": "pypowerwall/__main__.py",
    "chars": 25820,
    "preview": "# pyPowerWall Module - CLI Entry Point\n# -*- coding: utf-8 -*-\n\"\"\"\n Python module to interface with Tesla Solar Powerwal"
  },
  {
    "path": "pypowerwall/api_lock.py",
    "chars": 2873,
    "preview": "import logging\nimport random\nimport threading\nimport time\nfrom collections import defaultdict\nfrom contextlib import con"
  },
  {
    "path": "pypowerwall/cloud/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "pypowerwall/cloud/decorators.py",
    "chars": 638,
    "preview": "import functools\nimport logging\n\nlog = logging.getLogger('pypowerwall.cloud.pypowerwall_cloud')\nWARNED_ONCE = {}\n\n\ndef n"
  },
  {
    "path": "pypowerwall/cloud/exceptions.py",
    "chars": 242,
    "preview": "class PyPowerwallCloudNoTeslaAuthFile(Exception):\n    pass\n\n\nclass PyPowerwallCloudTeslaNotConnected(Exception):\n    pas"
  },
  {
    "path": "pypowerwall/cloud/mock_data.py",
    "chars": 18665,
    "preview": "POWERWALLS = ('{\"enumerating\": false, \"updating\": false, \"checking_if_offgrid\": false, \"running_phase_detection\": '\n    "
  },
  {
    "path": "pypowerwall/cloud/pypowerwall_cloud.py",
    "chars": 49620,
    "preview": "import json\nimport logging\nimport os\nimport time\nfrom typing import Optional, Union, List\n\nfrom pypowerwall.cloud.teslap"
  },
  {
    "path": "pypowerwall/cloud/stubs.py",
    "chars": 4748,
    "preview": "import copy\n\n_API_METERS_AGGREGATES_TEMPLATE = {\n    \"site\": {\n        \"last_communication_time\": None,\n        \"instant"
  },
  {
    "path": "pypowerwall/cloud/teslapy/LICENSE",
    "chars": 1069,
    "preview": "MIT License\n\nCopyright (c) 2019 Tim Dorssers\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
  },
  {
    "path": "pypowerwall/cloud/teslapy/README.md",
    "chars": 788,
    "preview": "# TeslaPy\r\n\r\nTeslaPy is a Python API that lets you monitor and control Tesla products remotely. It is based on [unoffici"
  },
  {
    "path": "pypowerwall/cloud/teslapy/__init__.py",
    "chars": 44991,
    "preview": "\"\"\" This module provides access the Tesla Motors Owner API. It uses Tesla's new\r\nRFC compliant OAuth 2 Single Sign-On se"
  },
  {
    "path": "pypowerwall/cloud/teslapy/endpoints.json",
    "chars": 83568,
    "preview": "{\n  \"ADD_KEY\": {\n    \"TYPE\": \"POST\",\n    \"URI\": \"api/1/vehicles/{vehicle_id}/add_key\",\n    \"AUTH\": true\n  },\n  \"STATUS\":"
  },
  {
    "path": "pypowerwall/cloud/teslapy/option_codes.json",
    "chars": 27022,
    "preview": "{\r\n  \"ACL1\": \"Ludicrous Mode\",\r\n  \"AD02\": \"NEMA 14-50\",\r\n  \"AD04\": \"European 3-Phase\",\r\n  \"AD05\": \"European 3-Phase, IT\""
  },
  {
    "path": "pypowerwall/cloud/teslapy/requirements.txt",
    "chars": 50,
    "preview": "requests-oauthlib>=1.3.0\nwebsocket-client>=0.59.0\n"
  },
  {
    "path": "pypowerwall/exceptions.py",
    "chars": 133,
    "preview": "class PyPowerwallInvalidConfigurationParameter(Exception):\n    pass\n\n\nclass InvalidBatteryReserveLevelException(Exceptio"
  },
  {
    "path": "pypowerwall/fleetapi/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "pypowerwall/fleetapi/__main__.py",
    "chars": 7760,
    "preview": "# pyPowerWall Module - FleetAPI Command Line Interface\n# -*- coding: utf-8 -*-\n\"\"\"\n Command Line Interface for Tesla Fle"
  },
  {
    "path": "pypowerwall/fleetapi/decorators.py",
    "chars": 650,
    "preview": "import functools\nimport logging\n\nlog = logging.getLogger('pypowerwall.fleetapi.pypowerwall_fleetapi')\nWARNED_ONCE = {}\n\n"
  },
  {
    "path": "pypowerwall/fleetapi/exceptions.py",
    "chars": 254,
    "preview": "class PyPowerwallFleetAPINoTeslaAuthFile(Exception):\n    pass\n\n\nclass PyPowerwallFleetAPITeslaNotConnected(Exception):\n "
  },
  {
    "path": "pypowerwall/fleetapi/fleetapi.py",
    "chars": 37260,
    "preview": "# pyPowerWall - Tesla FleetAPI Class\n# -*- coding: utf-8 -*-\n\"\"\"\n Tesla FleetAPI Class\n \n This module allows you to acce"
  },
  {
    "path": "pypowerwall/fleetapi/mock_data.py",
    "chars": 18665,
    "preview": "POWERWALLS = ('{\"enumerating\": false, \"updating\": false, \"checking_if_offgrid\": false, \"running_phase_detection\": '\n    "
  },
  {
    "path": "pypowerwall/fleetapi/pypowerwall_fleetapi.py",
    "chars": 34259,
    "preview": "import json\nimport logging\nimport os\nimport time\nfrom typing import Optional, Union\n\nfrom pypowerwall.fleetapi.fleetapi "
  },
  {
    "path": "pypowerwall/fleetapi/stubs.py",
    "chars": 4748,
    "preview": "import copy\n\n_API_METERS_AGGREGATES_TEMPLATE = {\n    \"site\": {\n        \"last_communication_time\": None,\n        \"instant"
  },
  {
    "path": "pypowerwall/local/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "pypowerwall/local/exceptions.py",
    "chars": 92,
    "preview": "class LoginError(Exception):\n    pass\n\n\nclass PowerwallConnectionError(Exception):\n    pass\n"
  },
  {
    "path": "pypowerwall/local/pypowerwall_local.py",
    "chars": 22164,
    "preview": "import json\nimport logging\nimport time\nfrom typing import Union, Tuple, Optional, Any\n\nimport requests\nfrom requests imp"
  },
  {
    "path": "pypowerwall/local/tesla_pb2.py",
    "chars": 34130,
    "preview": "# -*- coding: utf-8 -*-\n# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: tesla.proto\n# Protobuf Pyth"
  },
  {
    "path": "pypowerwall/pypowerwall_base.py",
    "chars": 2950,
    "preview": "import abc\nimport logging\nfrom typing import Optional, Any, Union\n\nlog = logging.getLogger(__name__)\n\n# Define which wri"
  },
  {
    "path": "pypowerwall/regex.py",
    "chars": 1889,
    "preview": "import re\n\nIPV4_6_REGEX = re.compile(r'((^\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1"
  },
  {
    "path": "pypowerwall/scan.py",
    "chars": 12120,
    "preview": "# pyPowerWall Module - Scan Function\n# -*- coding: utf-8 -*-\n\"\"\"\n Python module to interface with Tesla Solar Powerwall "
  },
  {
    "path": "pypowerwall/tedapi/__init__.py",
    "chars": 137759,
    "preview": "# pyPowerWall - Tesla TEDAPI Class\n# -*- coding: utf-8 -*-\n\"\"\"\n Tesla TEADAPI Class\n\n This module allows you to access t"
  },
  {
    "path": "pypowerwall/tedapi/__main__.py",
    "chars": 6441,
    "preview": "# pyPowerwall - Tesla TEDAPI Class Main\n# -*- coding: utf-8 -*-\n\"\"\"\n Tesla TEDAPI Class - Command Line Test\n\n This scrip"
  },
  {
    "path": "pypowerwall/tedapi/decorators.py",
    "chars": 642,
    "preview": "import functools\nimport logging\n\nlog = logging.getLogger('pypowerwall.tedapi.pypowerwall_tedapi')\nWARNED_ONCE = {}\n\n\ndef"
  },
  {
    "path": "pypowerwall/tedapi/exceptions.py",
    "chars": 246,
    "preview": "class PyPowerwallTEDAPINoTeslaAuthFile(Exception):\n    pass\n\n\nclass PyPowerwallTEDAPITeslaNotConnected(Exception):\n    p"
  },
  {
    "path": "pypowerwall/tedapi/mock_data.py",
    "chars": 18665,
    "preview": "POWERWALLS = ('{\"enumerating\": false, \"updating\": false, \"checking_if_offgrid\": false, \"running_phase_detection\": '\n    "
  },
  {
    "path": "pypowerwall/tedapi/pypowerwall_tedapi.py",
    "chars": 38433,
    "preview": "import json\nimport logging\nimport math\nfrom typing import Optional, Union\n\nfrom pypowerwall import __version__\nfrom pypo"
  },
  {
    "path": "pypowerwall/tedapi/stubs.py",
    "chars": 4757,
    "preview": "import copy\n\n_API_METERS_AGGREGATES_TEMPLATE = {\n    \"site\": {\n        \"last_communication_time\": None,\n        \"instant"
  },
  {
    "path": "pypowerwall/tedapi/tedapi.proto",
    "chars": 4877,
    "preview": "// Tesla tedapi API Protocol Buffer definition (tedapi.proto) \n//\n// Create tedapi_pb2.py for use in projects using the "
  },
  {
    "path": "pypowerwall/tedapi/tedapi_combined.proto",
    "chars": 9075,
    "preview": "// Combined Tesla TEDAPI Protocol Buffer Definition\n// Combines tesla_signed.proto and tedapi_nexarian.proto into one fi"
  },
  {
    "path": "pypowerwall/tedapi/tedapi_combined_pb2.py",
    "chars": 17228,
    "preview": "# -*- coding: utf-8 -*-\n# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: tedapi_combined.proto\n# Pro"
  },
  {
    "path": "pypowerwall/tedapi/tedapi_pb2.py",
    "chars": 6080,
    "preview": "# -*- coding: utf-8 -*-\n# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: tedapi.proto\n# Protobuf Pyt"
  },
  {
    "path": "pypowerwall/tedapi/tedapi_v1r.py",
    "chars": 20238,
    "preview": "# pyPowerWall - TEDAPIv1r Transport Class\n# -*- coding: utf-8 -*-\n\"\"\"\nTEDAPIv1r — RSA-signed transport for Powerwall 3 L"
  },
  {
    "path": "pypowerwall/tesla_auth.py",
    "chars": 39407,
    "preview": "\"\"\"\npypowerwall.tesla_auth - Pure Python Tesla OAuth 2.0 PKCE authentication\n\nUses a native WebView window (not a browse"
  },
  {
    "path": "pypowerwall/tests/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "pypowerwall/tests/tedapi/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "pypowerwall/tests/tedapi/test_init.py",
    "chars": 17180,
    "preview": "import json\nimport logging\nimport time\nfrom unittest.mock import patch, MagicMock\nimport math\n\nfrom pypowerwall.tedapi i"
  },
  {
    "path": "pypowerwall/tests/test_live_modes.py",
    "chars": 4793,
    "preview": "\"\"\"Live integration tests for mode 4 (full/hybrid) over WiFi.\n\nThese tests require WiFi connectivity to the Powerwall ga"
  },
  {
    "path": "pypowerwall/tests/test_mode_selection.py",
    "chars": 8526,
    "preview": "\"\"\"Tests for mode selection and password auto-derivation logic.\"\"\"\n\nimport pytest\nfrom unittest.mock import patch, Magic"
  },
  {
    "path": "pypowerwall/tests/test_powerwall.py",
    "chars": 4770,
    "preview": "import pytest\nfrom unittest.mock import MagicMock\n\n@pytest.fixture()\ndef pw_fixture():\n    # Mock Powerwall object for u"
  },
  {
    "path": "pypowerwall/tests/unit/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "pypowerwall/tests/unit/test_cli_tedapi.py",
    "chars": 2508,
    "preview": "from unittest.mock import MagicMock, patch\n\n\ndef test_main_forwards_tedapi_v1r_args():\n    from pypowerwall.__main__ imp"
  },
  {
    "path": "pypowerwall/tests/unit/test_parse_version.py",
    "chars": 589,
    "preview": "from pypowerwall.pypowerwall_base import parse_version\n\ndef test_parse_version_basic():\n    assert parse_version('1.2.3'"
  },
  {
    "path": "pypowerwall/tests/unit/test_powerwall_core.py",
    "chars": 10241,
    "preview": "import json\nimport pytest\nfrom pypowerwall import Powerwall\nfrom pypowerwall.pypowerwall_base import PyPowerwallBase\nfro"
  },
  {
    "path": "pypowerwall/v1r_register.py",
    "chars": 23819,
    "preview": "#!/usr/bin/env python3\n\"\"\"\nTesla RSA Key Registration for Powerwall LAN TEDapi v1r\n\nGenerates an RSA-4096 key pair, regi"
  },
  {
    "path": "pytest.ini",
    "chars": 352,
    "preview": "[pytest]\n# Basic configuration\naddopts = --cov=pypowerwall --cov-branch --cov-report=term-missing --cov-report=xml --cov"
  },
  {
    "path": "requirements.txt",
    "chars": 282,
    "preview": "# This file is used to install the necessary Python packages for the project.\nrequests\nprotobuf>=4.25.1\npython-dotenv\npy"
  },
  {
    "path": "setup.py",
    "chars": 1794,
    "preview": "import setuptools\r\nimport os\r\nimport re\r\n\r\n# Read version_tuple from pypowerwall/__init__.py and construct __version__\r\n"
  },
  {
    "path": "tesla.proto",
    "chars": 13298,
    "preview": "// Tesla Protocol Buffer definition (tesla.proto) \n//\n// Create tesla_pb2.py for use in projects using the protoc compil"
  },
  {
    "path": "test.py",
    "chars": 137,
    "preview": "# Basic test for pypowerwall module\n\nimport pypowerwall\n\npypowerwall.set_debug(True)\n\n# TO DO: Add simulator and tests -"
  },
  {
    "path": "test_requirements.txt",
    "chars": 121,
    "preview": "# Additional dependencies required for running tests only\npytest\npytest-cov\n# Add any other test-only dependencies below"
  },
  {
    "path": "tools/README.md",
    "chars": 6761,
    "preview": "# Tools\n\n## Set Reserve\n\nThis command line tool allows you to read and set the Powerwall minimum backup reserve battery "
  },
  {
    "path": "tools/cron.sh",
    "chars": 11927,
    "preview": "#!/bin/bash\n#\n# Cronjob to check Powerwall battery charge level and adjust the reserve limit.\n#\n# This script is set to "
  },
  {
    "path": "tools/fleetapi/README.md",
    "chars": 6727,
    "preview": "# Tesla Developer - FleetAPI for Powerwall\n\n⚠️ **DEPRECATION NOTICE**: This directory (`tools/fleetapi/`) contains outda"
  },
  {
    "path": "tools/fleetapi/create_pem_key.py",
    "chars": 1886,
    "preview": "# pyPowerWall - Tesla FleetAPI - Create PEM Key\n# -*- coding: utf-8 -*-\n\"\"\"\n Tesla FleetAPI Setup - Create PEM Key\n \n Th"
  },
  {
    "path": "tools/fleetapi/fleetapi.py",
    "chars": 27572,
    "preview": "# pyPowerWall - Tesla FleetAPI Class\n# -*- coding: utf-8 -*-\n\"\"\"\n Tesla FleetAPI Class\n \n This module allows you to acce"
  },
  {
    "path": "tools/fleetapi/index.html",
    "chars": 2502,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n    <title>Tesla FleetAPI Setup</title>\n    <style>\n        body {\n            font-family"
  },
  {
    "path": "tools/fleetapi/live.py",
    "chars": 3655,
    "preview": "# pyPowerWall - Tesla FleetAPI - Setup\n# -*- coding: utf-8 -*-\n\"\"\"\n Tesla FleetAPI - Poll Live Status\n \n This script is "
  },
  {
    "path": "tools/fleetapi/setup.py",
    "chars": 11694,
    "preview": "# pyPowerWall - Tesla FleetAPI - Setup\n# -*- coding: utf-8 -*-\n\"\"\"\n Tesla FleetAPI Setup\n \n This script will walk you th"
  },
  {
    "path": "tools/fleetapi/test.py",
    "chars": 413,
    "preview": "from fleetapi import FleetAPI\n\nfleet = FleetAPI()\n\n# Current Status\nprint(f\"Solar: {fleet.solar_power()}\")\nprint(f\"Grid:"
  },
  {
    "path": "tools/gen_proto.sh",
    "chars": 2014,
    "preview": "#!/bin/bash\n# gen_proto.sh - Regenerate Python protobuf files from .proto source definitions\n#\n# WHY THIS EXISTS:\n#   py"
  },
  {
    "path": "tools/nws.py",
    "chars": 3484,
    "preview": "#!/usr/bin/env python3\n\"\"\"\nUS National Weather Service - Power Outage Risk Checker\n\nChecks NWS for active weather alerts"
  },
  {
    "path": "tools/requirements-tools.txt",
    "chars": 905,
    "preview": "# Pinned build tools for generating protobuf Python bindings.\n#\n# These are DEVELOPER/CI tools only — not runtime depend"
  },
  {
    "path": "tools/server/.gitignore",
    "chars": 379,
    "preview": "# Python\n__pycache__/\n*.py[cod]\n*$py.class\n*.so\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\np"
  },
  {
    "path": "tools/server/Dockerfile",
    "chars": 293,
    "preview": "FROM python:3.11-slim\n\nWORKDIR /app\n\n# Install dependencies\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r re"
  },
  {
    "path": "tools/server/README.md",
    "chars": 13957,
    "preview": "# PyPowerwall Server\n\nA modern, high-performance FastAPI-based server for monitoring and managing Tesla Powerwall system"
  },
  {
    "path": "tools/server/app/__init__.py",
    "chars": 139,
    "preview": "\"\"\"PyPowerwall Server - FastAPI-based Powerwall monitoring server.\"\"\"\n\nfrom app.config import SERVER_VERSION\n\n__version_"
  },
  {
    "path": "tools/server/app/api/__init__.py",
    "chars": 3607,
    "preview": "\"\"\"\nAPI Routers Module\n\nThis package contains all FastAPI routers that define the server's HTTP and WebSocket endpoints."
  },
  {
    "path": "tools/server/app/api/aggregates.py",
    "chars": 4866,
    "preview": "\"\"\"\nAggregate Data API Endpoints\n\nREST API for querying combined data from multiple Powerwall gateways.\nAll routes are p"
  },
  {
    "path": "tools/server/app/api/gateways.py",
    "chars": 4525,
    "preview": "\"\"\"\nMulti-Gateway Management API\n\nREST API for managing multiple Powerwall gateways and querying per-gateway data.\nAll r"
  },
  {
    "path": "tools/server/app/api/legacy.py",
    "chars": 31054,
    "preview": "\"\"\"\nLegacy Proxy-Compatible API Endpoints\n\nThis router provides backward compatibility with the original pypowerwall pro"
  },
  {
    "path": "tools/server/app/api/websockets.py",
    "chars": 5876,
    "preview": "\"\"\"\nWebSocket Endpoints for Real-Time Data Streaming\n\nProvides WebSocket connections for live updates of Powerwall data "
  },
  {
    "path": "tools/server/app/config.py",
    "chars": 11043,
    "preview": "\"\"\"\nConfiguration Management for PyPowerwall Server\n\nThis module handles all server configuration through environment va"
  },
  {
    "path": "tools/server/app/core/__init__.py",
    "chars": 4686,
    "preview": "\"\"\"\nCore Business Logic Module\n\nThis package contains the core components that handle Powerwall connections,\ndata collec"
  },
  {
    "path": "tools/server/app/core/gateway_manager.py",
    "chars": 34539,
    "preview": "\"\"\"\nGateway Manager - Manages connections to multiple Powerwall gateways.\n\nThis is the central hub of the server that ma"
  },
  {
    "path": "tools/server/app/main.py",
    "chars": 13539,
    "preview": "\"\"\"\nPyPowerwall Server - Main FastAPI Application\n\nA modern, high-performance server for monitoring Tesla Powerwall syst"
  },
  {
    "path": "tools/server/app/models/__init__.py",
    "chars": 3355,
    "preview": "\"\"\"\nData Models for PyPowerwall Server\n\nThis module provides Pydantic models for type-safe data representation throughou"
  },
  {
    "path": "tools/server/app/models/gateway.py",
    "chars": 9232,
    "preview": "\"\"\"Pydantic models for gateway configuration and data.\"\"\"\nfrom typing import Optional, Dict, Any, List\nfrom pydantic imp"
  },
  {
    "path": "tools/server/app/static/example.html",
    "chars": 1217,
    "preview": "<!DOCTYPE html>\n<html>\n    <head>\n        <title>pyPowerwall Proxy iFrame Example</title>\n        <script src=\"/static/v"
  },
  {
    "path": "tools/server/app/static/index.html",
    "chars": 38416,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width"
  },
  {
    "path": "tools/server/app/static/viz-static/1.17c71172308436a079d1.js",
    "chars": 27834,
    "preview": "(window.webpackJsonp = window.webpackJsonp || []).push([\n    [1],\n    {\n        1154: function (e, t, r) {\n            \""
  },
  {
    "path": "tools/server/app/static/viz-static/39.17c71172308436a079d1.js",
    "chars": 40361,
    "preview": "(window.webpackJsonp = window.webpackJsonp || []).push([\n    [39],\n    {\n        1083: function (e, t, i) {\n            "
  },
  {
    "path": "tools/server/app/static/viz-static/40.17c71172308436a079d1.js",
    "chars": 94,
    "preview": "(window.webpackJsonp = window.webpackJsonp || []).push([[40], { 1062: function (n, w) {} }]);\n"
  }
]

// ... and 80 more files (download for full content)

About this extraction

This page contains the full source code of the jasonacox/pypowerwall GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 280 files (13.1 MB), approximately 3.4M tokens, and a symbol index with 5815 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!